OSDN Git Service

[ValueTracking] Improve isKnownNonZero for PHI of non-zero constants
authorJun Bum Lim <junbuml@codeaurora.org>
Mon, 1 Feb 2016 17:03:07 +0000 (17:03 +0000)
committerJun Bum Lim <junbuml@codeaurora.org>
Mon, 1 Feb 2016 17:03:07 +0000 (17:03 +0000)
It is clear that a PHI is a non-zero if all incoming values are non-zero constants.

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

lib/Analysis/ValueTracking.cpp
test/Transforms/InstCombine/phi.ll

index 575221a..6dff45f 100644 (file)
@@ -2074,6 +2074,12 @@ bool isKnownNonZero(Value *V, unsigned Depth, const Query &Q) {
         }
       }
     }
+    // Check if all incoming values are non-zero constant.
+    bool AllNonZeroConstants = all_of(PN->operands(), [](Value *V) {
+      return isa<ConstantInt>(V) && !cast<ConstantInt>(V)->isZeroValue();
+    });
+    if (AllNonZeroConstants)
+      return true;
   }
 
   if (!BitWidth) return false;
index d0441d7..7e3bdd0 100644 (file)
@@ -760,3 +760,27 @@ epilog:
 ; CHECK-NEXT: ret i1 %[[RES]]
 }
 
+; CHECK-LABEL: phi_allnonzeroconstant
+; CHECK-NOT: phi i32
+; CHECK: ret i1 false
+define i1 @phi_allnonzeroconstant(i1 %c, i32 %a, i32 %b) {
+entry:
+  br i1 %c, label %if.then, label %if.else
+
+if.then:                                          ; preds = %entry
+  br label %if.end
+
+if.else:                                          ; preds = %entry
+  call void @dummy()
+
+  br label %if.end
+
+if.end:                                           ; preds = %if.else, %if.then
+  %x.0 = phi i32 [ 1, %if.then ], [ 2, %if.else ]
+  %or = or i32 %x.0, %a
+  %cmp1 = icmp eq i32 %or, 0
+  ret i1 %cmp1
+}
+
+declare void @dummy()
+