Skip to content

Commit a481452

Browse files
authored
[RISCV] Add OR/XOR/SUB to RISCVInstrInfo::isCopyInstrImpl (#132002)
This adds coverage for additional instructions in isCopyInstrImpl, for now picking just those where I can observe that there is a codegen difference for SPEC. This allows MachineCopyPropagation to successfully eliminate no-op moves in this form.
1 parent 212a48b commit a481452

File tree

2 files changed

+43
-17
lines changed

2 files changed

+43
-17
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfo.cpp

+7
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,8 @@ RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
17521752
default:
17531753
break;
17541754
case RISCV::ADD:
1755+
case RISCV::OR:
1756+
case RISCV::XOR:
17551757
if (MI.getOperand(1).isReg() && MI.getOperand(1).getReg() == RISCV::X0 &&
17561758
MI.getOperand(2).isReg())
17571759
return DestSourcePair{MI.getOperand(0), MI.getOperand(2)};
@@ -1765,6 +1767,11 @@ RISCVInstrInfo::isCopyInstrImpl(const MachineInstr &MI) const {
17651767
MI.getOperand(2).getImm() == 0)
17661768
return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
17671769
break;
1770+
case RISCV::SUB:
1771+
if (MI.getOperand(2).isReg() && MI.getOperand(2).getReg() == RISCV::X0 &&
1772+
MI.getOperand(1).isReg())
1773+
return DestSourcePair{MI.getOperand(0), MI.getOperand(1)};
1774+
break;
17681775
case RISCV::FSGNJ_D:
17691776
case RISCV::FSGNJ_S:
17701777
case RISCV::FSGNJ_H:

llvm/unittests/Target/RISCV/RISCVInstrInfoTest.cpp

+36-17
Original file line numberDiff line numberDiff line change
@@ -135,31 +135,50 @@ 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.
139-
MachineInstr *MI5 = BuildMI(*MF, DL, TII->get(RISCV::ADD), RISCV::X1)
140-
.addReg(RISCV::X2)
141-
.addReg(RISCV::X3)
142-
.getInstr();
143-
auto MI5Res = TII->isCopyInstrImpl(*MI5);
144-
EXPECT_FALSE(MI5Res.has_value());
138+
// ADD/OR/XOR.
139+
for (unsigned Opc : {RISCV::ADD, RISCV::OR, RISCV::XOR}) {
140+
MachineInstr *MI5 = BuildMI(*MF, DL, TII->get(Opc), RISCV::X1)
141+
.addReg(RISCV::X2)
142+
.addReg(RISCV::X3)
143+
.getInstr();
144+
auto MI5Res = TII->isCopyInstrImpl(*MI5);
145+
EXPECT_FALSE(MI5Res.has_value());
146+
147+
MachineInstr *MI6 = BuildMI(*MF, DL, TII->get(Opc), RISCV::X1)
148+
.addReg(RISCV::X0)
149+
.addReg(RISCV::X2)
150+
.getInstr();
151+
auto MI6Res = TII->isCopyInstrImpl(*MI6);
152+
ASSERT_TRUE(MI6Res.has_value());
153+
EXPECT_EQ(MI6Res->Destination->getReg(), RISCV::X1);
154+
EXPECT_EQ(MI6Res->Source->getReg(), RISCV::X2);
155+
156+
MachineInstr *MI7 = BuildMI(*MF, DL, TII->get(Opc), RISCV::X1)
157+
.addReg(RISCV::X2)
158+
.addReg(RISCV::X0)
159+
.getInstr();
160+
auto MI7Res = TII->isCopyInstrImpl(*MI7);
161+
ASSERT_TRUE(MI7Res.has_value());
162+
EXPECT_EQ(MI7Res->Destination->getReg(), RISCV::X1);
163+
EXPECT_EQ(MI7Res->Source->getReg(), RISCV::X2);
164+
}
145165

146-
MachineInstr *MI6 = BuildMI(*MF, DL, TII->get(RISCV::ADD), RISCV::X1)
166+
// SUB.
167+
MachineInstr *MI8 = BuildMI(*MF, DL, TII->get(RISCV::SUB), RISCV::X1)
147168
.addReg(RISCV::X0)
148169
.addReg(RISCV::X2)
149170
.getInstr();
150-
auto MI6Res = TII->isCopyInstrImpl(*MI6);
151-
ASSERT_TRUE(MI6Res.has_value());
152-
EXPECT_EQ(MI6Res->Destination->getReg(), RISCV::X1);
153-
EXPECT_EQ(MI6Res->Source->getReg(), RISCV::X2);
171+
auto MI8Res = TII->isCopyInstrImpl(*MI8);
172+
EXPECT_FALSE(MI8Res.has_value());
154173

155-
MachineInstr *MI7 = BuildMI(*MF, DL, TII->get(RISCV::ADD), RISCV::X1)
174+
MachineInstr *MI9 = BuildMI(*MF, DL, TII->get(RISCV::SUB), RISCV::X1)
156175
.addReg(RISCV::X2)
157176
.addReg(RISCV::X0)
158177
.getInstr();
159-
auto MI7Res = TII->isCopyInstrImpl(*MI7);
160-
ASSERT_TRUE(MI7Res.has_value());
161-
EXPECT_EQ(MI7Res->Destination->getReg(), RISCV::X1);
162-
EXPECT_EQ(MI7Res->Source->getReg(), RISCV::X2);
178+
auto MI9Res = TII->isCopyInstrImpl(*MI9);
179+
ASSERT_TRUE(MI9Res.has_value());
180+
EXPECT_EQ(MI9Res->Destination->getReg(), RISCV::X1);
181+
EXPECT_EQ(MI9Res->Source->getReg(), RISCV::X2);
163182
}
164183

165184
TEST_P(RISCVInstrInfoTest, GetMemOperandsWithOffsetWidth) {

0 commit comments

Comments
 (0)