From fd8c11504533f0a289f488fe81091a72b5d25c7c Mon Sep 17 00:00:00 2001 From: lialan Date: Wed, 22 Jan 2025 22:20:42 +0800 Subject: [PATCH 1/2] [GISel] Add more FP opcodes to CSE (#123624) This fixes #122724 --- llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp | 10 ++ llvm/unittests/CodeGen/GlobalISel/CSETest.cpp | 115 ++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp b/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp index 0ac4a8a0aa910..3a9069848ca1d 100644 --- a/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CSEInfo.cpp @@ -65,6 +65,16 @@ bool CSEConfigFull::shouldCSEOpc(unsigned Opc) { case TargetOpcode::G_BUILD_VECTOR: case TargetOpcode::G_BUILD_VECTOR_TRUNC: case TargetOpcode::G_SEXT_INREG: + case TargetOpcode::G_FADD: + case TargetOpcode::G_FSUB: + case TargetOpcode::G_FMUL: + case TargetOpcode::G_FDIV: + case TargetOpcode::G_FABS: + // TODO: support G_FNEG. + case TargetOpcode::G_FMAXNUM: + case TargetOpcode::G_FMINNUM: + case TargetOpcode::G_FMAXNUM_IEEE: + case TargetOpcode::G_FMINNUM_IEEE: return true; } return false; diff --git a/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp b/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp index 822707a1f4ed3..6c7326c0f45ab 100644 --- a/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp @@ -75,6 +75,121 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBUnmerge2 = CSEB.buildUnmerge({s32, s32}, Copies[0]); EXPECT_TRUE(&*MIBUnmerge == &*MIBUnmerge2); + // Check G_FADD + { + auto MIBFAdd = CSEB.buildFAdd(s32, Copies[0], Copies[1]); + 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); + + 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.buildFMinNum(s32, Copies[0], Copies[1]); + auto MIBFMinNum2 = CSEB.buildFMinNum(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.buildFMaxNum(s32, Copies[0], Copies[1]); + auto MIBFMaxNum2 = CSEB.buildFMaxNum(s32, Copies[0], Copies[1]); + EXPECT_TRUE(&*MIBFMaxNum == &*MIBFMaxNum2); + + MIBFMaxNum2->setFlag(MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMaxNum == &*MIBFMaxNum2); + + MIBFMaxNum2->clearFlag(MachineInstr::FmNsz); + EXPECT_TRUE(&*MIBFMaxNum == &*MIBFMaxNum2); + } + + // Check G_FMINNUM_IEEE/F_MAXNUM_IEEE: + { + auto MIBFMinNumIEEE = CSEB.buildFMinNumIEEE(s32, Copies[0], Copies[1]); + auto MIBFMinNumIEEE2 = CSEB.buildFMinNumIEEE(s32, Copies[0], Copies[1]); + EXPECT_TRUE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE2); + + MIBFMinNumIEEE2->setFlag(MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE2); + + MIBFMinNumIEEE2->clearFlag(MachineInstr::FmNsz); + EXPECT_TRUE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE2); + } + + { + auto MIBFMaxNumIEEE = CSEB.buildFMaxNumIEEE(s32, Copies[0], Copies[1]); + auto MIBFMaxNumIEEE2 = CSEB.buildFMaxNumIEEE(s32, Copies[0], Copies[1]); + EXPECT_TRUE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE2); + + MIBFMaxNumIEEE2->setFlag(MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE2); + + MIBFMaxNumIEEE2->clearFlag(MachineInstr::FmNsz); + EXPECT_TRUE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE2); + } + // Check G_BUILD_VECTOR Register Reg1 = MRI->createGenericVirtualRegister(s32); Register Reg2 = MRI->createGenericVirtualRegister(s32); From 6df665a7f00e7677e2b971ebd4868807066e4ac7 Mon Sep 17 00:00:00 2001 From: Alan Li Date: Thu, 23 Jan 2025 12:38:54 +0800 Subject: [PATCH 2/2] update tests --- llvm/unittests/CodeGen/GlobalISel/CSETest.cpp | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp b/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp index 6c7326c0f45ab..cd6e32311a9ee 100644 --- a/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/CSETest.cpp @@ -81,9 +81,11 @@ 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); + auto MIBFAdd3 = + CSEB.buildFAdd(s32, Copies[0], Copies[1], MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFAdd == &*MIBFAdd3); + MIBFAdd2->setFlag(MachineInstr::FmNsz); MIBFAdd2->clearFlag(MachineInstr::FmNsz); EXPECT_TRUE(&*MIBFAdd == &*MIBFAdd2); } @@ -94,9 +96,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFSub2 = CSEB.buildFSub(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFSub == &*MIBFSub2); - MIBFSub2->setFlag(MachineInstr::FmNoNans); - EXPECT_FALSE(&*MIBFSub == &*MIBFSub2); + auto MIBFSub3 = + CSEB.buildFSub(s32, Copies[0], Copies[1], MachineInstr::FmNoNans); + EXPECT_FALSE(&*MIBFSub == &*MIBFSub3); + MIBFSub2->setFlag(MachineInstr::FmNoNans); MIBFSub2->clearFlag(MachineInstr::FmNoNans); EXPECT_TRUE(&*MIBFSub == &*MIBFSub2); } @@ -107,9 +111,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFMul2 = CSEB.buildFMul(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFMul == &*MIBFMul2); - MIBFMul2->setFlag(MachineInstr::FmNoNans); - EXPECT_FALSE(&*MIBFMul == &*MIBFMul2); + auto MIBFMul3 = + CSEB.buildFMul(s32, Copies[0], Copies[1], MachineInstr::FmNoNans); + EXPECT_FALSE(&*MIBFMul == &*MIBFMul3); + MIBFMul2->setFlag(MachineInstr::FmNoNans); MIBFMul2->clearFlag(MachineInstr::FmNoNans); EXPECT_TRUE(&*MIBFMul == &*MIBFMul2); } @@ -120,9 +126,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFDiv2 = CSEB.buildFDiv(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFDiv == &*MIBFDiv2); - MIBFDiv2->setFlag(MachineInstr::FmNoNans); - EXPECT_FALSE(&*MIBFDiv == &*MIBFDiv2); + auto MIBFDiv3 = + CSEB.buildFDiv(s32, Copies[0], Copies[1], MachineInstr::FmNoNans); + EXPECT_FALSE(&*MIBFDiv == &*MIBFDiv3); + MIBFDiv2->setFlag(MachineInstr::FmNoNans); MIBFDiv2->clearFlag(MachineInstr::FmNoNans); EXPECT_TRUE(&*MIBFDiv == &*MIBFDiv2); } @@ -133,9 +141,10 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFAbs2 = CSEB.buildFAbs(s32, Copies[0]); EXPECT_TRUE(&*MIBFAbs == &*MIBFAbs2); - MIBFAbs2->setFlag(MachineInstr::FmNsz); - EXPECT_FALSE(&*MIBFAbs == &*MIBFAbs2); + auto MIBFAbs3 = CSEB.buildFAbs(s32, Copies[0], MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFAbs == &*MIBFAbs3); + MIBFAbs2->setFlag(MachineInstr::FmNsz); MIBFAbs2->clearFlag(MachineInstr::FmNsz); EXPECT_TRUE(&*MIBFAbs == &*MIBFAbs2); } @@ -146,9 +155,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFMinNum2 = CSEB.buildFMinNum(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFMinNum == &*MIBFMinNum2); - MIBFMinNum2->setFlag(MachineInstr::FmNsz); - EXPECT_FALSE(&*MIBFMinNum == &*MIBFMinNum2); + auto MIBFMinNum3 = + CSEB.buildFMinNum(s32, Copies[0], Copies[1], MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMinNum == &*MIBFMinNum3); + MIBFMinNum2->setFlag(MachineInstr::FmNsz); MIBFMinNum2->clearFlag(MachineInstr::FmNsz); EXPECT_TRUE(&*MIBFMinNum == &*MIBFMinNum2); } @@ -158,9 +169,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFMaxNum2 = CSEB.buildFMaxNum(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFMaxNum == &*MIBFMaxNum2); - MIBFMaxNum2->setFlag(MachineInstr::FmNsz); - EXPECT_FALSE(&*MIBFMaxNum == &*MIBFMaxNum2); + auto MIBFMaxNum3 = + CSEB.buildFMaxNum(s32, Copies[0], Copies[1], MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMaxNum == &*MIBFMaxNum3); + MIBFMaxNum2->setFlag(MachineInstr::FmNsz); MIBFMaxNum2->clearFlag(MachineInstr::FmNsz); EXPECT_TRUE(&*MIBFMaxNum == &*MIBFMaxNum2); } @@ -171,9 +184,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFMinNumIEEE2 = CSEB.buildFMinNumIEEE(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE2); - MIBFMinNumIEEE2->setFlag(MachineInstr::FmNsz); - EXPECT_FALSE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE2); + auto MIBFMinNumIEEE3 = + CSEB.buildFMinNumIEEE(s32, Copies[0], Copies[1], MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE3); + MIBFMinNumIEEE2->setFlag(MachineInstr::FmNsz); MIBFMinNumIEEE2->clearFlag(MachineInstr::FmNsz); EXPECT_TRUE(&*MIBFMinNumIEEE == &*MIBFMinNumIEEE2); } @@ -183,9 +198,11 @@ TEST_F(AArch64GISelMITest, TestCSE) { auto MIBFMaxNumIEEE2 = CSEB.buildFMaxNumIEEE(s32, Copies[0], Copies[1]); EXPECT_TRUE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE2); - MIBFMaxNumIEEE2->setFlag(MachineInstr::FmNsz); - EXPECT_FALSE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE2); + auto MIBFMaxNumIEEE3 = + CSEB.buildFMaxNumIEEE(s32, Copies[0], Copies[1], MachineInstr::FmNsz); + EXPECT_FALSE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE3); + MIBFMaxNumIEEE2->setFlag(MachineInstr::FmNsz); MIBFMaxNumIEEE2->clearFlag(MachineInstr::FmNsz); EXPECT_TRUE(&*MIBFMaxNumIEEE == &*MIBFMaxNumIEEE2); }