1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 03:02:36 +01:00

[AArch64][GlobalISel] Use wzr/xzr for 16 and 32 bit stores of zero

We weren't performing this optimization on 16 and 32 bit stores. SDAG happily
does this though.

e.g. https://godbolt.org/z/cWocKr

This saves about 0.2% in code size on CTMark at -O3.

Differential Revision: https://reviews.llvm.org/D84568
This commit is contained in:
Jessica Paquette 2020-07-24 16:57:37 -07:00
parent 27560ce987
commit b6d2a38769
2 changed files with 44 additions and 4 deletions

View File

@ -2306,10 +2306,17 @@ bool AArch64InstructionSelector::select(MachineInstr &I) {
// If we're storing a 0, use WZR/XZR.
if (auto CVal = getConstantVRegVal(ValReg, MRI)) {
if (*CVal == 0 && Opcode == TargetOpcode::G_STORE) {
if (I.getOpcode() == AArch64::STRWui)
I.getOperand(0).setReg(AArch64::WZR);
else if (I.getOpcode() == AArch64::STRXui)
I.getOperand(0).setReg(AArch64::XZR);
unsigned Opc = I.getOpcode();
switch(Opc) {
case AArch64::STRWui:
case AArch64::STRHHui:
case AArch64::STRBBui:
I.getOperand(0).setReg(AArch64::WZR);
break;
case AArch64::STRXui:
I.getOperand(0).setReg(AArch64::XZR);
break;
}
}
}

View File

@ -11,6 +11,8 @@
define void @store_zero_s64_gpr(i64* %addr) { ret void }
define void @store_zero_s32_gpr(i32* %addr) { ret void }
define void @store_zero_s16(i32* %addr) { ret void }
define void @store_zero_s8(i32* %addr) { ret void }
define void @store_fi_s64_gpr() {
%ptr0 = alloca i64
@ -176,6 +178,37 @@ body: |
...
---
name: store_zero_s16
legalized: true
regBankSelected: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: store_zero_s16
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
; CHECK: STRHHui $wzr, [[COPY]], 0 :: (store 2)
%0:gpr(p0) = COPY $x0
%1:gpr(s16) = G_CONSTANT i16 0
G_STORE %1(s16), %0(p0) :: (store 2)
...
---
name: store_zero_s8
legalized: true
regBankSelected: true
body: |
bb.0:
liveins: $x0
; CHECK-LABEL: name: store_zero_s8
; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
; CHECK: STRBBui $wzr, [[COPY]], 0 :: (store 1)
%0:gpr(p0) = COPY $x0
%1:gpr(s8) = G_CONSTANT i8 0
G_STORE %1(s8), %0(p0) :: (store 1)
...
---
name: store_fi_s64_gpr
legalized: true