Skip to content

Commit 71a977d

Browse files
authored
[RISCV] Add shift-add (SH1ADD, ...) to isCopyInstrImpl (#133443)
As with #132002, these do show up in a compilation of llvm-test-suite (including SPEC 2017). We remove 30-40 static instances so this isn't anything earth shattering. rs2 is always added to the other shifted (and potentially extended) operand unmodified, so rs1==zero is equivalent to a copy.
1 parent 8ea3f81 commit 71a977d

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,6 +1772,16 @@ RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
17721772
MI.getOperand(1).isReg())
17731773
return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
17741774
break;
1775+
case RISCV::SH1ADD:
1776+
case RISCV::SH1ADD_UW:
1777+
case RISCV::SH2ADD:
1778+
case RISCV::SH2ADD_UW:
1779+
case RISCV::SH3ADD:
1780+
case RISCV::SH3ADD_UW:
1781+
if (MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == RISCV::X0 &&
1782+
MI.getOperand(2).isReg())
1783+
return DestSourcePair{MI.getOperand(0), MI.getOperand(2)};
1784+
break;
17751785
case RISCV::FSGNJ_D:
17761786
case RISCV::FSGNJ_S:
17771787
case RISCV::FSGNJ_H:

llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,26 @@ TEST_P(RISCVInstrInfoTest, IsCopyInstrImpl) {
179179
ASSERT_TRUE(MI9Res.has_value());
180180
EXPECT_EQ(MI9Res->Destination->getReg(), RISCV::X1);
181181
EXPECT_EQ(MI9Res->Source->getReg(), RISCV::X2);
182+
183+
// SH1ADD(_UW), SH2ADD(_UW), SH3ADD(_UW).
184+
for (unsigned Opc : {RISCV::SH1ADD, RISCV::SH1ADD_UW, RISCV::SH2ADD,
185+
RISCV::SH2ADD_UW, RISCV::SH3ADD, RISCV::SH3ADD_UW}) {
186+
MachineInstr *MI10 = BuildMI(*MF, DL, TII->get(Opc), RISCV::X1)
187+
.addReg(RISCV::X2)
188+
.addReg(RISCV::X3)
189+
.getInstr();
190+
auto MI10Res = TII->isCopyInstrImpl(*MI10);
191+
EXPECT_FALSE(MI10Res.has_value());
192+
193+
MachineInstr *MI11 = BuildMI(*MF, DL, TII->get(Opc), RISCV::X1)
194+
.addReg(RISCV::X0)
195+
.addReg(RISCV::X2)
196+
.getInstr();
197+
auto MI11Res = TII->isCopyInstrImpl(*MI11);
198+
ASSERT_TRUE(MI11Res.has_value());
199+
EXPECT_EQ(MI11Res->Destination->getReg(), RISCV::X1);
200+
EXPECT_EQ(MI11Res->Source->getReg(), RISCV::X2);
201+
}
182202
}
183203

184204
TEST_P(RISCVInstrInfoTest, GetMemOperandsWithOffsetWidth) {

0 commit comments

Comments
 (0)