[llvm] [GISel] Add more FP opcodes to CSE (PR #123624)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 21 03:44:01 PST 2025


================
@@ -80,31 +80,106 @@ TEST_F(AArch64GISelMITest, TestCSE) {
   auto MIBFAdd2 = CSEB.buildFAdd(s32, Copies[0], Copies[1]);
   EXPECT_TRUE(&*MIBFAdd == &*MIBFAdd2);
 
+  MIBFAdd2.setFlag(MachineInstr::FmNsz);
+  EXPECT_FALSE(&*MIBFAdd == &*MIBFAdd2);
+
+  MIBFAdd2.clearFlag(MachineInstr::FmNsz);
+  EXPECT_TRUE(&*MIBFAdd == &*MIBFAdd2);
+
   // Check G_FSUB
   auto MIBFSub = CSEB.buildFSub(s32, Copies[0], Copies[1]);
   auto MIBFSub2 = CSEB.buildFSub(s32, Copies[0], Copies[1]);
   EXPECT_TRUE(&*MIBFSub == &*MIBFSub2);
 
+  MIBFSub2.setFlag(MachineInstr::FmNoNans);
+  EXPECT_FALSE(&*MIBFSub == &*MIBFSub2);
+
+  MIBFSub2.clearFlag(MachineInstr::FmNoNans);
+  EXPECT_TRUE(&*MIBFSub == &*MIBFSub2);
+
   // Check G_FMUL
   auto MIBFMul = CSEB.buildFMul(s32, Copies[0], Copies[1]);
   auto MIBFMul2 = CSEB.buildFMul(s32, Copies[0], Copies[1]);
   EXPECT_TRUE(&*MIBFMul == &*MIBFMul2);
 
+  MIBFMul2.setFlag(MachineInstr::FmNoNans);
+  EXPECT_FALSE(&*MIBFMul == &*MIBFMul2);
+
+  MIBFMul2.clearFlag(MachineInstr::FmNoNans);
+  EXPECT_TRUE(&*MIBFMul == &*MIBFMul2);
+
   // Check G_FDIV
   auto MIBFDiv = CSEB.buildFDiv(s32, Copies[0], Copies[1]);
   auto MIBFDiv2 = CSEB.buildFDiv(s32, Copies[0], Copies[1]);
   EXPECT_TRUE(&*MIBFDiv == &*MIBFDiv2);
 
-  // // Check G_FNEG
-  // auto MIBFNeg = CSEB.buildFNeg(s32, Copies[0]);
-  // auto MIBFNeg2 = CSEB.buildFNeg(s32, Copies[0]);
-  // EXPECT_TRUE(&*MIBFNeg == &*MIBFNeg2);
+  MIBFDiv2.setFlag(MachineInstr::FmNoNans);
+  EXPECT_FALSE(&*MIBFDiv == &*MIBFDiv2);
+
+  MIBFDiv2.clearFlag(MachineInstr::FmNoNans);
+  EXPECT_TRUE(&*MIBFDiv == &*MIBFDiv2);
 
   // Check G_FABS
   auto MIBFAbs = CSEB.buildFAbs(s32, Copies[0]);
   auto MIBFAbs2 = CSEB.buildFAbs(s32, Copies[0]);
   EXPECT_TRUE(&*MIBFAbs == &*MIBFAbs2);
 
+  MIBFAbs2.setFlag(MachineInstr::FmNsz);
+  EXPECT_FALSE(&*MIBFAbs == &*MIBFAbs2);
+
+  MIBFAbs2.clearFlag(MachineInstr::FmNsz);
+  EXPECT_TRUE(&*MIBFAbs == &*MIBFAbs2);
+
+  // Check G_FMINNUM/F_MAXNUM:
+  auto MIBFMinNum = CSEB.buildInstr(TargetOpcode::G_FMINNUM, {s32},
+                                    {Copies[0], Copies[1]});
+  auto MIBFMinNum2 = CSEB.buildInstr(TargetOpcode::G_FMINNUM, {s32},
+                                     {Copies[0], Copies[1]});
+  EXPECT_TRUE(&*MIBFMinNum == &*MIBFMinNum2);
+
+  MIBFMinNum2.setFlag(MachineInstr::FmNsz);
+  EXPECT_FALSE(&*MIBFMinNum == &*MIBFMinNum2);
+
+  MIBFMinNum2.clearFlag(MachineInstr::FmNsz);
+  EXPECT_TRUE(&*MIBFMinNum == &*MIBFMinNum2);
+
+  auto MIBFMaxNum = CSEB.buildInstr(TargetOpcode::G_FMAXNUM, {s32},
----------------
arsenm wrote:

If we don't have wrappers around buildInstr for these, they should be added 

https://github.com/llvm/llvm-project/pull/123624


More information about the llvm-commits mailing list