ymm_high spills are spilled to spill-slots then back to context
- Dominant language
- C++
- Stars
- 8k
- Forks
- 351
- Avg merge
- 12h 31m
- Merged PRs (30d)
- 102
Description
In a weird twist, FEX is spilling ymm_high to the stack (spill-slot) and then reloaded and stored in to the context. We should just be spilling those directly to the context and rematerializing from the context rather than the spill-slot.
example from Geekbench's Object detection bench.
```asm
0x0000aaaad9d29a5c: str q14, [sp, #64]
...
0x0000aaaad9d29a98: ldr q2, [sp, #64]
0x0000aaaad9d29a9c: ldr q3, [sp, #32]
0x0000aaaad9d29aa0: stp q2, q3, [x28, #48]
```
Happens relatively frequently in this bench, so we wouldn't save any instructions, just using the stack less and context more.
More context, but not all
```asm
0x0000aaaad9d299b4: addp v10.4s, v10.4s, v11.4s
0x0000aaaad9d299b8: ldr q11, [x28, #112]
0x0000aaaad9d299bc: add v21.4s, v26.4s, v21.4s
0x0000aaaad9d299c0: add v10.4s, v10.4s, v11.4s
0x0000aaaad9d299c4: smull v11.4s, v24.4h, v27.4h
0x0000aaaad9d299c8: smull2 v12.4s, v24.8h, v27.8h
0x0000aaaad9d299cc: addp v26.4s, v11.4s, v12.4s
0x0000aaaad9d299d0: smull v11.4s, v3.4h, v5.4h
0x0000aaaad9d299d4: smull2 v12.4s, v3.8h, v5.8h
0x0000aaaad9d299d8: addp v11.4s, v11.4s, v12.4s
0x0000aaaad9d299dc: ldr q12, [x28, #96]
0x0000aaaad9d299e0: add v20.4s, v26.4s, v20.4s
0x0000aaaad9d299e4: add v11.4s, v11.4s, v12.4s
0x0000aaaad9d299e8: smull v12.4s, v25.4h, v28.4h
0x0000aaaad9d299ec: smull2 v13.4s, v25.8h, v28.8h
0x0000aaaad9d299f0: addp v26.4s, v12.4s, v13.4s
0x0000aaaad9d299f4: smull v12.4s, v2.4h, v6.4h
0x0000aaaad9d299f8: smull2 v13.4s, v2.8h, v6.8h
0x0000aaaad9d299fc: addp v12.4s, v12.4s, v13.4s
0x0000aaaad9d29a00: ldr q13, [x28, #80]
0x0000aaaad9d29a04: add v19.4s, v26.4s, v19.4s
0x0000aaaad9d29a08: add v12.4s, v12.4s, v13.4s
0x0000aaaad9d29a0c: smull v13.4s, v24.4h, v28.4h
0x0000aaaad9d29a10: smull2 v14.4s, v24.8h, v28.8h
0x0000aaaad9d29a14: addp v26.4s, v13.4s, v14.4s
0x0000aaaad9d29a18: smull v13.4s, v3.4h, v6.4h
0x0000aaaad9d29a1c: smull2 v14.4s, v3.8h, v6.8h
0x0000aaaad9d29a20: addp v13.4s, v13.4s, v14.4s
0x0000aaaad9d29a24: ldr q14, [x28, #64]
0x0000aaaad9d29a28: add v18.4s, v26.4s, v18.4s
0x0000aaaad9d29a2c: add v14.4s, v13.4s, v14.4s
0x0000aaaad9d29a30: smull v15.4s, v25.4h, v29.4h
0x0000aaaad9d29a34: str q14, [sp, #32]
0x0000aaaad9d29a38: smull2 v14.4s, v25.8h, v29.8h
0x0000aaaad9d29a3c: addp v25.4s, v15.4s, v14.4s
0x0000aaaad9d29a40: smull v14.4s, v2.4h, v7.4h
0x0000aaaad9d29a44: smull2 v2.4s, v2.8h, v7.8h
0x0000aaaad9d29a48: addp v2.4s, v14.4s, v2.4s
0x0000aaaad9d29a4c: ldr q14, [x28, #48]
0x0000aaaad9d29a50: add v17.4s, v25.4s, v17.4s
0x0000aaaad9d29a54: add v14.4s, v2.4s, v14.4s
0x0000aaaad9d29a58: smull v15.4s, v24.4h, v29.4h
0x0000aaaad9d29a5c: str q14, [sp, #64]
0x0000aaaad9d29a60: smull2 v14.4s, v24.8h, v29.8h
0x0000aaaad9d29a64: addp v24.4s, v15.4s, v14.4s
0x0000aaaad9d29a68: smull v14.4s, v3.4h, v7.4h
0x0000aaaad9d29a6c: smull2 v3.4s, v3.8h, v7.8h
0x0000aaaad9d29a70: addp v3.4s, v14.4s, v3.4s
0x0000aaaad9d29a74: ldr q14, [x28, #32]
0x0000aaaad9d29a78: add v16.4s, v24.4s, v16.4s
0x0000aaaad9d29a7c: add v14.4s, v3.4s, v14.4s
0x0000aaaad9d29a80: stp q7, q8, [x28, #240]
0x0000aaaad9d29a84: stp q5, q6, [x28, #208]
0x0000aaaad9d29a88: stp q2, q13, [x28, #176]
0x0000aaaad9d29a8c: stp q9, q3, [x28, #144]
0x0000aaaad9d29a90: stp q10, q4, [x28, #112]
0x0000aaaad9d29a94: stp q12, q11, [x28, #80]
0x0000aaaad9d29a98: ldr q2, [sp, #64]
0x0000aaaad9d29a9c: ldr q3, [sp, #32]
0x0000aaaad9d29aa0: stp q2, q3, [x28, #48]
0x0000aaaad9d29aa4: str q14, [x28, #32]
0x0000aaaad9d29aa8: b 0xaaaad9d295bc
0x0000aaaad9d29aac: add sp, sp, #4702
```
Contributor guide
Assessment
This issue has not been assessed yet.