]> granicus.if.org Git - llvm/commitdiff
[GlobalISel]: Add KnownBits for G_XOR
authorAditya Nandakumar <aditya_nandakumar@apple.com>
Tue, 13 Aug 2019 04:32:33 +0000 (04:32 +0000)
committerAditya Nandakumar <aditya_nandakumar@apple.com>
Tue, 13 Aug 2019 04:32:33 +0000 (04:32 +0000)
https://reviews.llvm.org/D66119

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@368648 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/GlobalISel/GISelKnownBits.cpp
unittests/CodeGen/GlobalISel/KnownBitsTest.cpp

index aef43568b6327d04f977f24de4c9521bc0d37f85..31e28f5ed5c64d19576c0d7f76ecd58befeae0d1 100644 (file)
@@ -131,6 +131,19 @@ void GISelKnownBits::computeKnownBitsImpl(Register R, KnownBits &Known,
     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: {
index 2fd09feb1f7525b40b223917090eca0729ffc282..f67184fc2081d75cb132e548745809fcb3db3cba 100644 (file)
@@ -40,6 +40,22 @@ TEST_F(GISelMITest, TestKnownBitsPtrToIntViceVersa) {
   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) {