Skip to content

Commit 2b6c234

Browse files
authored
[LoongArch] Set isAsCheapAsAMove on ADDI.D and {X}ORI instructions (#94733)
1 parent cb5d1b5 commit 2b6c234

File tree

11 files changed

+776
-1234
lines changed

11 files changed

+776
-1234
lines changed

llvm/lib/Target/LoongArch/LoongArchInstrInfo.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,21 @@ unsigned LoongArchInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
229229
return MI.getDesc().getSize();
230230
}
231231

232+
bool LoongArchInstrInfo::isAsCheapAsAMove(const MachineInstr &MI) const {
233+
const unsigned Opcode = MI.getOpcode();
234+
switch (Opcode) {
235+
default:
236+
break;
237+
case LoongArch::ADDI_D:
238+
case LoongArch::ORI:
239+
case LoongArch::XORI:
240+
return (MI.getOperand(1).isReg() &&
241+
MI.getOperand(1).getReg() == LoongArch::R0) ||
242+
(MI.getOperand(2).isImm() && MI.getOperand(2).getImm() == 0);
243+
}
244+
return MI.isAsCheapAsAMove();
245+
}
246+
232247
MachineBasicBlock *
233248
LoongArchInstrInfo::getBranchDestBlock(const MachineInstr &MI) const {
234249
assert(MI.getDesc().isBranch() && "Unexpected opcode!");

llvm/lib/Target/LoongArch/LoongArchInstrInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class LoongArchInstrInfo : public LoongArchGenInstrInfo {
5252

5353
unsigned getInstSizeInBytes(const MachineInstr &MI) const override;
5454

55+
bool isAsCheapAsAMove(const MachineInstr &MI) const override;
56+
5557
MachineBasicBlock *getBranchDestBlock(const MachineInstr &MI) const override;
5658

5759
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,

llvm/lib/Target/LoongArch/LoongArchInstrInfo.td

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,8 @@ def XOR : ALU_3R<0x00158000>;
751751
def ANDN : ALU_3R<0x00168000>;
752752
def ORN : ALU_3R<0x00160000>;
753753
def ANDI : ALU_2RI12<0x03400000, uimm12>;
754-
let isReMaterializable = 1 in {
754+
// See LoongArchInstrInfo::isAsCheapAsAMove for more details.
755+
let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
755756
def ORI : ALU_2RI12<0x03800000, uimm12_ori>;
756757
def XORI : ALU_2RI12<0x03c00000, uimm12>;
757758
}
@@ -858,7 +859,8 @@ def ADD_D : ALU_3R<0x00108000>;
858859
def SUB_D : ALU_3R<0x00118000>;
859860
// ADDI_D isn't always rematerializable, but isReMaterializable will be used as
860861
// a hint which is verified in isReallyTriviallyReMaterializable.
861-
let isReMaterializable = 1 in {
862+
// See LoongArchInstrInfo::isAsCheapAsAMove for more details.
863+
let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
862864
def ADDI_D : ALU_2RI12<0x02c00000, simm12_addlike>;
863865
}
864866
def ADDU16I_D : ALU_2RI16<0x10000000, simm16>;

llvm/test/CodeGen/LoongArch/calling-conv-lp64d.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ define i64 @caller_float_in_fpr() nounwind {
2828
; CHECK: # %bb.0:
2929
; CHECK-NEXT: addi.d $sp, $sp, -16
3030
; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
31-
; CHECK-NEXT: ori $a0, $zero, 1
3231
; CHECK-NEXT: movgr2fr.w $fa0, $zero
3332
; CHECK-NEXT: movgr2fr.d $fa1, $zero
33+
; CHECK-NEXT: ori $a0, $zero, 1
3434
; CHECK-NEXT: bl %plt(callee_float_in_fpr)
3535
; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
3636
; CHECK-NEXT: addi.d $sp, $sp, 16

llvm/test/CodeGen/LoongArch/calling-conv-lp64s.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ define i64 @caller_float_in_regs() nounwind {
2727
; CHECK: # %bb.0:
2828
; CHECK-NEXT: addi.d $sp, $sp, -16
2929
; CHECK-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
30-
; CHECK-NEXT: ori $a0, $zero, 1
3130
; CHECK-NEXT: lu12i.w $a1, 262144
31+
; CHECK-NEXT: ori $a0, $zero, 1
3232
; CHECK-NEXT: bl %plt(callee_float_in_regs)
3333
; CHECK-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
3434
; CHECK-NEXT: addi.d $sp, $sp, 16

llvm/test/CodeGen/LoongArch/can-not-realign-stack.ll

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ define dso_local noundef signext i32 @main() nounwind {
1616
; CHECK: # %bb.0: # %entry
1717
; CHECK-NEXT: addi.d $sp, $sp, -272
1818
; CHECK-NEXT: st.d $ra, $sp, 264 # 8-byte Folded Spill
19-
; CHECK-NEXT: st.d $fp, $sp, 256 # 8-byte Folded Spill
2019
; CHECK-NEXT: pcalau12i $a0, %pc_hi20(.LCPI0_0)
2120
; CHECK-NEXT: addi.d $a0, $a0, %pc_lo12(.LCPI0_0)
2221
; CHECK-NEXT: xvld $xr0, $a0, 0
@@ -33,25 +32,23 @@ define dso_local noundef signext i32 @main() nounwind {
3332
; CHECK-NEXT: addi.d $a0, $a0, %pc_lo12(.LCPI0_3)
3433
; CHECK-NEXT: xvld $xr3, $a0, 0
3534
; CHECK-NEXT: xvst $xr3, $sp, 0 # 32-byte Folded Spill
36-
; CHECK-NEXT: xvst $xr0, $sp, 128
37-
; CHECK-NEXT: xvst $xr1, $sp, 160
38-
; CHECK-NEXT: xvst $xr2, $sp, 192
39-
; CHECK-NEXT: xvst $xr3, $sp, 224
40-
; CHECK-NEXT: addi.d $fp, $sp, 128
41-
; CHECK-NEXT: move $a0, $fp
35+
; CHECK-NEXT: xvst $xr0, $sp, 136
36+
; CHECK-NEXT: xvst $xr1, $sp, 168
37+
; CHECK-NEXT: xvst $xr2, $sp, 200
38+
; CHECK-NEXT: xvst $xr3, $sp, 232
39+
; CHECK-NEXT: addi.d $a0, $sp, 136
4240
; CHECK-NEXT: bl %plt(foo)
4341
; CHECK-NEXT: xvld $xr0, $sp, 96 # 32-byte Folded Reload
44-
; CHECK-NEXT: xvst $xr0, $sp, 128
42+
; CHECK-NEXT: xvst $xr0, $sp, 136
4543
; CHECK-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
46-
; CHECK-NEXT: xvst $xr0, $sp, 160
44+
; CHECK-NEXT: xvst $xr0, $sp, 168
4745
; CHECK-NEXT: xvld $xr0, $sp, 32 # 32-byte Folded Reload
48-
; CHECK-NEXT: xvst $xr0, $sp, 192
46+
; CHECK-NEXT: xvst $xr0, $sp, 200
4947
; CHECK-NEXT: xvld $xr0, $sp, 0 # 32-byte Folded Reload
50-
; CHECK-NEXT: xvst $xr0, $sp, 224
51-
; CHECK-NEXT: move $a0, $fp
48+
; CHECK-NEXT: xvst $xr0, $sp, 232
49+
; CHECK-NEXT: addi.d $a0, $sp, 136
5250
; CHECK-NEXT: bl %plt(bar)
5351
; CHECK-NEXT: move $a0, $zero
54-
; CHECK-NEXT: ld.d $fp, $sp, 256 # 8-byte Folded Reload
5552
; CHECK-NEXT: ld.d $ra, $sp, 264 # 8-byte Folded Reload
5653
; CHECK-NEXT: addi.d $sp, $sp, 272
5754
; CHECK-NEXT: ret

0 commit comments

Comments
 (0)