]> granicus.if.org Git - llvm/commitdiff
[DAGCombiner] add fold for 'All sign bits set?'
authorSanjay Patel <spatel@rotateright.com>
Fri, 31 Mar 2017 20:28:06 +0000 (20:28 +0000)
committerSanjay Patel <spatel@rotateright.com>
Fri, 31 Mar 2017 20:28:06 +0000 (20:28 +0000)
(and (setlt X,  0), (setlt Y,  0)) --> (setlt (and X, Y),  0)

We have 7 similar folds, but this one got away. The fact that the
x86 test with a branch didn't change is probably a separate bug. We
may also be missing this and the related folds in instcombine.

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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/PowerPC/setcc-logic.ll
test/CodeGen/X86/setcc-logic.ll

index 63b362d3a37928d3971af3e43791e17ceb69d509..3f68390b814e4c5662276183a43ddc9d9c292e44 100644 (file)
@@ -3214,8 +3214,10 @@ SDValue DAGCombiner::foldAndOfSetCCs(SDValue N0, SDValue N1, const SDLoc &DL) {
 
     // All bits set?
     // (and (seteq X, -1), (seteq Y, -1)) --> (seteq (and X, Y), -1)
-    // TODO: All sign bits set?
-    if (isAllOnesConstant(LR) && CC1 == ISD::SETEQ) {
+    // All sign bits set?
+    // (and (setlt X,  0), (setlt Y,  0)) --> (setlt (and X, Y),  0)
+    if ((isAllOnesConstant(LR) && CC1 == ISD::SETEQ) ||
+        (isNullConstant(LR) && CC1 == ISD::SETLT)) {
       SDValue And = DAG.getNode(ISD::AND, SDLoc(N0), OpVT, LL, RL);
       AddToWorklist(And.getNode());
       return DAG.getSetCC(DL, VT, And, LR, CC1);
index f7f2caa190a7663d97ad801d685bc1aac7ab63f8..38db2a8bcefc66489ca312cd9de5796543442cca 100644 (file)
@@ -45,11 +45,8 @@ define zeroext i1 @all_bits_set(i32 %P, i32 %Q)  {
 define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q)  {
 ; CHECK-LABEL: all_sign_bits_set:
 ; CHECK:       # BB#0:
-; CHECK-NEXT:    cmpwi 0, 3, 0
-; CHECK-NEXT:    cmpwi 1, 4, 0
-; CHECK-NEXT:    li 3, 1
-; CHECK-NEXT:    crnand 20, 0, 4
-; CHECK-NEXT:    isel 3, 0, 3, 20
+; CHECK-NEXT:    and 3, 3, 4
+; CHECK-NEXT:    srwi 3, 3, 31
 ; CHECK-NEXT:    blr
   %a = icmp slt i32 %P, 0
   %b = icmp slt i32 %Q, 0
@@ -188,10 +185,9 @@ return:
 define i32 @all_sign_bits_set_branch(i32 %P, i32 %Q)  {
 ; CHECK-LABEL: all_sign_bits_set_branch:
 ; CHECK:       # BB#0: # %entry
-; CHECK-NEXT:    cmpwi 0, 3, 0
-; CHECK-NEXT:    cmpwi 1, 4, 0
-; CHECK-NEXT:    crand 20, 0, 4
-; CHECK-NEXT:    bc 4, 20, .LBB11_2
+; CHECK-NEXT:    and 3, 3, 4
+; CHECK-NEXT:    cmpwi 0, 3, -1
+; CHECK-NEXT:    bgt 0, .LBB11_2
 ; CHECK-NEXT:  # BB#1: # %bb1
 ; CHECK-NEXT:    li 3, 4
 ; CHECK-NEXT:    blr
index eca33130ecb4029a6c4ba32033934df2298a3c72..15b36b29ec54d3910a517824428d551397cacaaf 100644 (file)
@@ -41,11 +41,9 @@ define zeroext i1 @all_bits_set(i32 %P, i32 %Q) nounwind {
 define zeroext i1 @all_sign_bits_set(i32 %P, i32 %Q) nounwind {
 ; CHECK-LABEL: all_sign_bits_set:
 ; CHECK:       # BB#0:
-; CHECK-NEXT:    testl %edi, %edi
-; CHECK-NEXT:    sets %cl
-; CHECK-NEXT:    testl %esi, %esi
-; CHECK-NEXT:    sets %al
-; CHECK-NEXT:    andb %cl, %al
+; CHECK-NEXT:    andl %esi, %edi
+; CHECK-NEXT:    shrl $31, %edi
+; CHECK-NEXT:    movl %edi, %eax
 ; CHECK-NEXT:    retq
   %a = icmp slt i32 %P, 0
   %b = icmp slt i32 %Q, 0