Skip to content

Commit

Permalink
[AArch64][GlobalISel] Use wzr/xzr for 16 and 32 bit stores of zero
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Jessica Paquette committed Jul 25, 2020
1 parent 6fdc6f6 commit fcc55c0
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 4 deletions.
15 changes: 11 additions & 4 deletions llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
Expand Up @@ -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;
}
}
}

Expand Down
33 changes: 33 additions & 0 deletions llvm/test/CodeGen/AArch64/GlobalISel/select-store.mir
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit fcc55c0

Please sign in to comment.