Skip to content

Commit 05077e9

Browse files
committed
[RISCV] Handle ADD in RISCVInstrInfo::isCopyInstrImpl
Split out from #77610 and features a test, as a buggy version of this caused a regression when landing that patch (the previous version had a typo picking the wrong register as the source).
1 parent 455c396 commit 05077e9

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,6 +1579,12 @@ RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
15791579
switch (MI.getOpcode()) {
15801580
default:
15811581
break;
1582+
case RISCV::ADD:
1583+
if (MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == RISCV::X0)
1584+
return DestSourcePair{MI.getOperand(0), MI.getOperand(2)};
1585+
if (MI.getOperand(2).isReg() && MI.getOperand(2).getReg() == RISCV::X0)
1586+
return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
1587+
break;
15821588
case RISCV::ADDI:
15831589
// Operand 1 can be a frameindex but callers expect registers
15841590
if (MI.getOperand(1).isReg() && MI.getOperand(2).isImm() &&

llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ TEST_P(RISCVInstrInfoTest, IsCopyInstrImpl) {
134134
EXPECT_EQ(MI4Res->Destination->getReg(), RISCV::F1_D);
135135
EXPECT_EQ(MI4Res->Source->getReg(), RISCV::F2_D);
136136

137-
// ADD. TODO: Should return true for add reg, x0 and add x0, reg.
137+
// ADD.
138138
MachineInstr *MI5 = BuildMI(*MF, DL, TII->get(RISCV::ADD), RISCV::X1)
139139
.addReg(RISCV::X2)
140140
.addReg(RISCV::X3)
@@ -147,14 +147,18 @@ TEST_P(RISCVInstrInfoTest, IsCopyInstrImpl) {
147147
.addReg(RISCV::X2)
148148
.getInstr();
149149
auto MI6Res = TII->isCopyInstrImpl(*MI6);
150-
EXPECT_FALSE(MI6Res.has_value());
150+
ASSERT_TRUE(MI6Res.has_value());
151+
EXPECT_EQ(MI6Res->Destination->getReg(), RISCV::X1);
152+
EXPECT_EQ(MI6Res->Source->getReg(), RISCV::X2);
151153

152154
MachineInstr *MI7 = BuildMI(*MF, DL, TII->get(RISCV::ADD), RISCV::X1)
153155
.addReg(RISCV::X2)
154156
.addReg(RISCV::X0)
155157
.getInstr();
156158
auto MI7Res = TII->isCopyInstrImpl(*MI7);
157-
EXPECT_FALSE(MI7Res.has_value());
159+
ASSERT_TRUE(MI7Res.has_value());
160+
EXPECT_EQ(MI7Res->Destination->getReg(), RISCV::X1);
161+
EXPECT_EQ(MI7Res->Source->getReg(), RISCV::X2);
158162
}
159163

160164
TEST_P(RISCVInstrInfoTest, GetMemOperandsWithOffsetWidth) {

0 commit comments

Comments
 (0)