[llvm] r368648 - [GlobalISel]: Add KnownBits for G_XOR
Aditya Nandakumar via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 12 21:32:33 PDT 2019
Author: aditya_nandakumar
Date: Mon Aug 12 21:32:33 2019
New Revision: 368648
URL: http://llvm.org/viewvc/llvm-project?rev=368648&view=rev
Log:
[GlobalISel]: Add KnownBits for G_XOR
https://reviews.llvm.org/D66119
Modified:
llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp
llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
Modified: llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp?rev=368648&r1=368647&r2=368648&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp (original)
+++ llvm/trunk/lib/CodeGen/GlobalISel/GISelKnownBits.cpp Mon Aug 12 21:32:33 2019
@@ -131,6 +131,19 @@ void GISelKnownBits::computeKnownBitsImp
Known.Zero.setLowBits(KnownZeroLow);
break;
}
+ case TargetOpcode::G_XOR: {
+ computeKnownBitsImpl(MI.getOperand(2).getReg(), Known, DemandedElts,
+ Depth + 1);
+ computeKnownBitsImpl(MI.getOperand(1).getReg(), Known2, DemandedElts,
+ Depth + 1);
+
+ // Output known-0 bits are known if clear or set in both the LHS & RHS.
+ APInt KnownZeroOut = (Known.Zero & Known2.Zero) | (Known.One & Known2.One);
+ // Output known-1 are known to be set if set in only one of the LHS, RHS.
+ Known.One = (Known.Zero & Known2.One) | (Known.One & Known2.Zero);
+ Known.Zero = KnownZeroOut;
+ break;
+ }
// G_GEP is like G_ADD. FIXME: Is this true for all targets?
case TargetOpcode::G_GEP:
case TargetOpcode::G_ADD: {
Modified: llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp?rev=368648&r1=368647&r2=368648&view=diff
==============================================================================
--- llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp (original)
+++ llvm/trunk/unittests/CodeGen/GlobalISel/KnownBitsTest.cpp Mon Aug 12 21:32:33 2019
@@ -40,6 +40,22 @@ TEST_F(GISelMITest, TestKnownBitsPtrToIn
EXPECT_EQ(256u, Res.One.getZExtValue());
EXPECT_EQ(0xfffffeffu, Res.Zero.getZExtValue());
}
+TEST_F(GISelMITest, TestKnownBitsXOR) {
+ StringRef MIRString = " %3:_(s8) = G_CONSTANT i8 4\n"
+ " %4:_(s8) = G_CONSTANT i8 7\n"
+ " %5:_(s8) = G_XOR %3, %4\n"
+ " %6:_(s8) = COPY %5\n";
+ setUp(MIRString);
+ if (!TM)
+ return;
+ unsigned CopyReg = Copies[Copies.size() - 1];
+ MachineInstr *FinalCopy = MRI->getVRegDef(CopyReg);
+ unsigned SrcReg = FinalCopy->getOperand(1).getReg();
+ GISelKnownBits Info(*MF);
+ KnownBits Res = Info.getKnownBits(SrcReg);
+ EXPECT_EQ(3u, Res.One.getZExtValue());
+ EXPECT_EQ(252u, Res.Zero.getZExtValue());
+}
TEST_F(GISelMITest, TestKnownBits) {
More information about the llvm-commits
mailing list