Skip to content

Commit dd662d8

Browse files
authored
[RISCV] Handle ADD in RISCVInstrInfo::isCopyInstrImpl (#81123)
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). This is also motivated by future changes to MachineCopyPropagation which will use this information to determine if we have been left with a nop mv.
1 parent a614f2b commit dd662d8

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,6 +1650,14 @@ RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
16501650
switch (MI.getOpcode()) {
16511651
default:
16521652
break;
1653+
case RISCV::ADD:
1654+
if (MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == RISCV::X0 &&
1655+
MI.getOperand(2).isReg())
1656+
return DestSourcePair{MI.getOperand(0), MI.getOperand(2)};
1657+
if (MI.getOperand(2).isReg() && MI.getOperand(2).getReg() == RISCV::X0 &&
1658+
MI.getOperand(1).isReg())
1659+
return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
1660+
break;
16531661
case RISCV::ADDI:
16541662
// Operand 1 can be a frameindex but callers expect registers
16551663
if (MI.getOperand(1).isReg() && MI.getOperand(2).isImm() &&

llvm/test/CodeGen/RISCV/GlobalISel/constbarrier-rv32.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ define void @constant_fold_barrier_i128(ptr %p) {
3333
; RV32-NEXT: add a2, a2, a1
3434
; RV32-NEXT: add a6, a3, zero
3535
; RV32-NEXT: sltu a1, a2, a1
36-
; RV32-NEXT: sltu a3, a6, a3
36+
; RV32-NEXT: sltu a3, a3, a3
3737
; RV32-NEXT: add a6, a6, a1
3838
; RV32-NEXT: seqz a7, a6
3939
; RV32-NEXT: and a1, a7, a1
4040
; RV32-NEXT: add a7, a4, zero
4141
; RV32-NEXT: add a5, a5, zero
42-
; RV32-NEXT: sltu a4, a7, a4
42+
; RV32-NEXT: sltu a4, a4, a4
4343
; RV32-NEXT: or a1, a3, a1
4444
; RV32-NEXT: add a7, a7, a1
4545
; RV32-NEXT: seqz a3, a7

llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp

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

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

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

161165
TEST_P(RISCVInstrInfoTest, GetMemOperandsWithOffsetWidth) {

0 commit comments

Comments
 (0)