[llvm] r354514 - [SelectionDAG] Teach GetDemandedBits to look at the known zeros of the LHS when handling ISD::AND

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 20 12:52:26 PST 2019


Author: ctopper
Date: Wed Feb 20 12:52:26 2019
New Revision: 354514

URL: http://llvm.org/viewvc/llvm-project?rev=354514&view=rev
Log:
[SelectionDAG] Teach GetDemandedBits to look at the known zeros of the LHS when handling ISD::AND

If the LHS has known zeros, then the RHS immediate mask might have been simplified to remove those bits.

This patch adds a call to computeKnownBits to get the known zeroes to handle that possibility. I left an early out to skip the call if all of the demanded bits are set in the mask.

Differential Revision: https://reviews.llvm.org/D58464

Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
    llvm/trunk/test/CodeGen/X86/bt.ll

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=354514&r1=354513&r2=354514&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Feb 20 12:52:26 2019
@@ -2102,9 +2102,13 @@ SDValue SelectionDAG::GetDemandedBits(SD
     break;
   case ISD::AND: {
     // X & -1 -> X (ignoring bits which aren't demanded).
-    ConstantSDNode *AndVal = isConstOrConstSplat(V.getOperand(1));
-    if (AndVal && Mask.isSubsetOf(AndVal->getAPIntValue()))
-      return V.getOperand(0);
+    // Also handle the case where masked out bits in X are known to be zero.
+    if (ConstantSDNode *RHSC = isConstOrConstSplat(V.getOperand(1))) {
+      const APInt &AndVal = RHSC->getAPIntValue();
+      if (Mask.isSubsetOf(AndVal) ||
+          Mask.isSubsetOf(computeKnownBits(V.getOperand(0)).Zero | AndVal))
+        return V.getOperand(0);
+    }
     break;
   }
   case ISD::ANY_EXTEND: {

Modified: llvm/trunk/test/CodeGen/X86/bt.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/bt.ll?rev=354514&r1=354513&r2=354514&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/bt.ll (original)
+++ llvm/trunk/test/CodeGen/X86/bt.ll Wed Feb 20 12:52:26 2019
@@ -1153,7 +1153,6 @@ define zeroext i1 @demanded_with_known_z
 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
 ; X86-NEXT:    shlb $2, %cl
-; X86-NEXT:    andb $28, %cl
 ; X86-NEXT:    movzbl %cl, %ecx
 ; X86-NEXT:    btl %ecx, %eax
 ; X86-NEXT:    setb %al
@@ -1162,7 +1161,6 @@ define zeroext i1 @demanded_with_known_z
 ; X64-LABEL: demanded_with_known_zeroes:
 ; X64:       # %bb.0: # %entry
 ; X64-NEXT:    shlb $2, %dil
-; X64-NEXT:    andb $28, %dil
 ; X64-NEXT:    movzbl %dil, %eax
 ; X64-NEXT:    btl %eax, %esi
 ; X64-NEXT:    setb %al




More information about the llvm-commits mailing list