@@ -94,6 +94,69 @@ TEST_P(RISCVInstrInfoTest, IsAddImmediate) {
9494 }
9595}
9696
97+ TEST_P (RISCVInstrInfoTest, IsCopyInstrImpl) {
98+ const RISCVInstrInfo *TII = ST->getInstrInfo ();
99+ DebugLoc DL;
100+
101+ // ADDI.
102+
103+ MachineInstr *MI1 = BuildMI (*MF, DL, TII->get (RISCV::ADDI), RISCV::X1)
104+ .addReg (RISCV::X2)
105+ .addImm (-128 )
106+ .getInstr ();
107+ auto MI1Res = TII->isCopyInstrImpl (*MI1);
108+ EXPECT_FALSE (MI1Res.has_value ());
109+
110+ MachineInstr *MI2 = BuildMI (*MF, DL, TII->get (RISCV::ADDI), RISCV::X1)
111+ .addReg (RISCV::X2)
112+ .addImm (0 )
113+ .getInstr ();
114+ auto MI2Res = TII->isCopyInstrImpl (*MI2);
115+ ASSERT_TRUE (MI2Res.has_value ());
116+ EXPECT_EQ (MI2Res->Destination ->getReg (), RISCV::X1);
117+ EXPECT_EQ (MI2Res->Source ->getReg (), RISCV::X2);
118+
119+ // Partial coverage of FSGNJ_* instructions.
120+
121+ MachineInstr *MI3 = BuildMI (*MF, DL, TII->get (RISCV::FSGNJ_D), RISCV::F1_D)
122+ .addReg (RISCV::F2_D)
123+ .addReg (RISCV::F1_D)
124+ .getInstr ();
125+ auto MI3Res = TII->isCopyInstrImpl (*MI3);
126+ EXPECT_FALSE (MI3Res.has_value ());
127+
128+ MachineInstr *MI4 = BuildMI (*MF, DL, TII->get (RISCV::FSGNJ_D), RISCV::F1_D)
129+ .addReg (RISCV::F2_D)
130+ .addReg (RISCV::F2_D)
131+ .getInstr ();
132+ auto MI4Res = TII->isCopyInstrImpl (*MI4);
133+ ASSERT_TRUE (MI4Res.has_value ());
134+ EXPECT_EQ (MI4Res->Destination ->getReg (), RISCV::F1_D);
135+ EXPECT_EQ (MI4Res->Source ->getReg (), RISCV::F2_D);
136+
137+ // ADD. TODO: Should return true for add reg, x0 and add x0, reg.
138+ MachineInstr *MI5 = BuildMI (*MF, DL, TII->get (RISCV::ADD), RISCV::X1)
139+ .addReg (RISCV::X2)
140+ .addReg (RISCV::X3)
141+ .getInstr ();
142+ auto MI5Res = TII->isCopyInstrImpl (*MI5);
143+ EXPECT_FALSE (MI5Res.has_value ());
144+
145+ MachineInstr *MI6 = BuildMI (*MF, DL, TII->get (RISCV::ADD), RISCV::X1)
146+ .addReg (RISCV::X0)
147+ .addReg (RISCV::X2)
148+ .getInstr ();
149+ auto MI6Res = TII->isCopyInstrImpl (*MI6);
150+ EXPECT_FALSE (MI6Res.has_value ());
151+
152+ MachineInstr *MI7 = BuildMI (*MF, DL, TII->get (RISCV::ADD), RISCV::X1)
153+ .addReg (RISCV::X2)
154+ .addReg (RISCV::X0)
155+ .getInstr ();
156+ auto MI7Res = TII->isCopyInstrImpl (*MI7);
157+ EXPECT_FALSE (MI7Res.has_value ());
158+ }
159+
97160TEST_P (RISCVInstrInfoTest, GetMemOperandsWithOffsetWidth) {
98161 const RISCVInstrInfo *TII = ST->getInstrInfo ();
99162 const TargetRegisterInfo *TRI = ST->getRegisterInfo ();
0 commit comments