Skip to content

Commit bf57d2e

Browse files
[AArch64][GlobalISel] Enable computeNumSignBits for G_XOR, G_AND, G_OR (#89896)
1 parent 75d52f5 commit bf57d2e

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed

llvm/lib/CodeGen/GlobalISel/GISelKnownBits.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,20 @@ unsigned GISelKnownBits::computeNumSignBits(Register R,
694694
const MachineMemOperand *MMO = *MI.memoperands_begin();
695695
return TyBits - MMO->getSizeInBits().getValue();
696696
}
697+
case TargetOpcode::G_AND:
698+
case TargetOpcode::G_OR:
699+
case TargetOpcode::G_XOR: {
700+
Register Src1 = MI.getOperand(1).getReg();
701+
unsigned Src1NumSignBits =
702+
computeNumSignBits(Src1, DemandedElts, Depth + 1);
703+
if (Src1NumSignBits != 1) {
704+
Register Src2 = MI.getOperand(2).getReg();
705+
unsigned Src2NumSignBits =
706+
computeNumSignBits(Src2, DemandedElts, Depth + 1);
707+
FirstAnswer = std::min(Src1NumSignBits, Src2NumSignBits);
708+
}
709+
break;
710+
}
697711
case TargetOpcode::G_TRUNC: {
698712
Register Src = MI.getOperand(1).getReg();
699713
LLT SrcTy = MRI.getType(Src);

llvm/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,120 @@ TEST_F(AArch64GISelMITest, TestNumSignBitsConstant) {
745745
EXPECT_EQ(3u, Info.computeNumSignBits(CopyRegNeg32));
746746
}
747747

748+
TEST_F(AArch64GISelMITest, TestNumSignBitsXOR) {
749+
StringRef MIRString = " %c1:_(s8) = G_CONSTANT i8 1\n"
750+
" %cn1:_(s8) = G_CONSTANT i8 -1\n"
751+
" %c127:_(s8) = G_CONSTANT i8 127\n"
752+
" %c32:_(s8) = G_CONSTANT i8 32\n"
753+
" %cn32:_(s8) = G_CONSTANT i8 -32\n"
754+
755+
" %xor1:_(s8) = G_XOR %c1, %cn1\n"
756+
" %Copy1:_(s8) = COPY %xor1\n"
757+
758+
" %xor2:_(s8) = G_XOR %c1, %c32\n"
759+
" %Copy2:_(s8) = COPY %xor2\n"
760+
761+
" %xor3:_(s8) = G_XOR %c32, %c127\n"
762+
" %Copy3:_(s8) = COPY %xor3\n"
763+
764+
" %xor4:_(s8) = G_XOR %cn32, %c127\n"
765+
" %Copy4:_(s8) = COPY %xor4\n"
766+
767+
" %xor5:_(s8) = G_XOR %c127, %cn32\n"
768+
" %Copy5:_(s8) = COPY %xor5\n";
769+
setUp(MIRString);
770+
if (!TM)
771+
GTEST_SKIP();
772+
Register Copy1 = Copies[Copies.size() - 5];
773+
Register Copy2 = Copies[Copies.size() - 4];
774+
Register Copy3 = Copies[Copies.size() - 3];
775+
Register Copy4 = Copies[Copies.size() - 2];
776+
Register Copy5 = Copies[Copies.size() - 1];
777+
778+
GISelKnownBits Info(*MF);
779+
EXPECT_EQ(7u, Info.computeNumSignBits(Copy1));
780+
EXPECT_EQ(2u, Info.computeNumSignBits(Copy2));
781+
EXPECT_EQ(1u, Info.computeNumSignBits(Copy3));
782+
EXPECT_EQ(1u, Info.computeNumSignBits(Copy4));
783+
EXPECT_EQ(1u, Info.computeNumSignBits(Copy5));
784+
}
785+
786+
TEST_F(AArch64GISelMITest, TestNumSignBitsOR) {
787+
StringRef MIRString = " %c1:_(s8) = G_CONSTANT i8 1\n"
788+
" %cn1:_(s8) = G_CONSTANT i8 -1\n"
789+
" %c127:_(s8) = G_CONSTANT i8 127\n"
790+
" %c32:_(s8) = G_CONSTANT i8 32\n"
791+
" %cn32:_(s8) = G_CONSTANT i8 -32\n"
792+
793+
" %or1:_(s8) = G_OR %c1, %cn1\n"
794+
" %Copy1:_(s8) = COPY %or1\n"
795+
796+
" %or2:_(s8) = G_OR %c1, %c32\n"
797+
" %Copy2:_(s8) = COPY %or2\n"
798+
799+
" %or3:_(s8) = G_OR %c32, %c127\n"
800+
" %Copy3:_(s8) = COPY %or3\n"
801+
802+
" %or4:_(s8) = G_OR %cn32, %c127\n"
803+
" %Copy4:_(s8) = COPY %or4\n"
804+
805+
" %or5:_(s8) = G_OR %c127, %cn32\n"
806+
" %Copy5:_(s8) = COPY %or5\n";
807+
setUp(MIRString);
808+
if (!TM)
809+
GTEST_SKIP();
810+
Register Copy1 = Copies[Copies.size() - 5];
811+
Register Copy2 = Copies[Copies.size() - 4];
812+
Register Copy3 = Copies[Copies.size() - 3];
813+
Register Copy4 = Copies[Copies.size() - 2];
814+
Register Copy5 = Copies[Copies.size() - 1];
815+
816+
GISelKnownBits Info(*MF);
817+
EXPECT_EQ(8u, Info.computeNumSignBits(Copy1));
818+
EXPECT_EQ(2u, Info.computeNumSignBits(Copy2));
819+
EXPECT_EQ(1u, Info.computeNumSignBits(Copy3));
820+
EXPECT_EQ(8u, Info.computeNumSignBits(Copy4));
821+
EXPECT_EQ(8u, Info.computeNumSignBits(Copy5));
822+
}
823+
824+
TEST_F(AArch64GISelMITest, TestNumSignBitsAND) {
825+
StringRef MIRString = " %c1:_(s8) = G_CONSTANT i8 1\n"
826+
" %cn1:_(s8) = G_CONSTANT i8 -1\n"
827+
" %c127:_(s8) = G_CONSTANT i8 127\n"
828+
" %c32:_(s8) = G_CONSTANT i8 32\n"
829+
" %cn32:_(s8) = G_CONSTANT i8 -32\n"
830+
831+
" %and1:_(s8) = G_AND %c1, %cn1\n"
832+
" %Copy1:_(s8) = COPY %and1\n"
833+
834+
" %and2:_(s8) = G_AND %c1, %c32\n"
835+
" %Copy2:_(s8) = COPY %and2\n"
836+
837+
" %and3:_(s8) = G_AND %c32, %c127\n"
838+
" %Copy3:_(s8) = COPY %and3\n"
839+
840+
" %and4:_(s8) = G_AND %cn32, %c127\n"
841+
" %Copy4:_(s8) = COPY %and4\n"
842+
843+
" %and5:_(s8) = G_AND %c127, %cn32\n"
844+
" %Copy5:_(s8) = COPY %and5\n";
845+
setUp(MIRString);
846+
if (!TM)
847+
GTEST_SKIP();
848+
Register Copy1 = Copies[Copies.size() - 5];
849+
Register Copy2 = Copies[Copies.size() - 4];
850+
Register Copy3 = Copies[Copies.size() - 3];
851+
Register Copy4 = Copies[Copies.size() - 2];
852+
Register Copy5 = Copies[Copies.size() - 1];
853+
854+
GISelKnownBits Info(*MF);
855+
EXPECT_EQ(7u, Info.computeNumSignBits(Copy1));
856+
EXPECT_EQ(8u, Info.computeNumSignBits(Copy2));
857+
EXPECT_EQ(2u, Info.computeNumSignBits(Copy3));
858+
EXPECT_EQ(1u, Info.computeNumSignBits(Copy4));
859+
EXPECT_EQ(1u, Info.computeNumSignBits(Copy5));
860+
}
861+
748862
TEST_F(AArch64GISelMITest, TestNumSignBitsSext) {
749863
StringRef MIRString = " %3:_(p0) = G_IMPLICIT_DEF\n"
750864
" %4:_(s8) = G_LOAD %3 :: (load (s8))\n"

0 commit comments

Comments
 (0)