[llvm] 88b493a - [ValueTracking] improve undef/poison analysis for constant vectors

Sanjay Patel via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 24 10:36:02 PDT 2020


Author: Sanjay Patel
Date: 2020-03-24T13:35:47-04:00
New Revision: 88b493a8382a0ce1a9378fbb114021d6d442ea51

URL: https://github.com/llvm/llvm-project/commit/88b493a8382a0ce1a9378fbb114021d6d442ea51
DIFF: https://github.com/llvm/llvm-project/commit/88b493a8382a0ce1a9378fbb114021d6d442ea51.diff

LOG: [ValueTracking] improve undef/poison analysis for constant vectors

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

Added: 
    

Modified: 
    llvm/lib/Analysis/ValueTracking.cpp
    llvm/test/Transforms/InstSimplify/freeze.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index d612e2ed9f5c..ab6afa1a81dc 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -4610,9 +4610,22 @@ bool llvm::isGuaranteedNotToBeUndefOrPoison(const Value *V,
   // TODO: Some instructions are guaranteed to return neither undef
   // nor poison if their arguments are not poison/undef.
 
-  // TODO: Deal with other Constant subclasses.
-  if (isa<ConstantInt>(V) || isa<GlobalVariable>(V))
-    return true;
+  if (auto *C = dyn_cast<Constant>(V)) {
+    // TODO: We can analyze ConstExpr by opcode to determine if there is any
+    //       possibility of poison.
+    if (isa<UndefValue>(C) || isa<ConstantExpr>(C))
+      return false;
+
+    // TODO: Add ConstantFP and pointers.
+    if (isa<ConstantInt>(C) || isa<GlobalVariable>(C) )
+      return true;
+
+    if (C->getType()->isVectorTy())
+      return !C->containsUndefElement() && !C->containsConstantExpression();
+
+    // TODO: Recursively analyze aggregates or other constants.
+    return false;
+  }
 
   if (auto PN = dyn_cast<PHINode>(V)) {
     if (llvm::all_of(PN->incoming_values(), [](const Use &U) {

diff  --git a/llvm/test/Transforms/InstSimplify/freeze.ll b/llvm/test/Transforms/InstSimplify/freeze.ll
index c80f19713b1c..e8950a8ad527 100644
--- a/llvm/test/Transforms/InstSimplify/freeze.ll
+++ b/llvm/test/Transforms/InstSimplify/freeze.ll
@@ -19,6 +19,8 @@ define i32 @make_const() {
   ret i32 %x
 }
 
+; TODO: This is not poison.
+
 define float @make_const2() {
 ; CHECK-LABEL: @make_const2(
 ; CHECK-NEXT:    [[X:%.*]] = freeze float 1.000000e+01
@@ -38,6 +40,8 @@ define i32* @make_const_glb() {
   ret i32* %k
 }
 
+; TODO: This is not poison.
+
 define i32()* @make_const_fn() {
 ; CHECK-LABEL: @make_const_fn(
 ; CHECK-NEXT:    [[K:%.*]] = freeze i32 ()* @make_const
@@ -47,6 +51,8 @@ define i32()* @make_const_fn() {
   ret i32()* %k
 }
 
+; TODO: This is not poison.
+
 define i32* @make_const_null() {
 ; CHECK-LABEL: @make_const_null(
 ; CHECK-NEXT:    [[K:%.*]] = freeze i32* null
@@ -58,8 +64,7 @@ define i32* @make_const_null() {
 
 define <2 x i32> @constvector() {
 ; CHECK-LABEL: @constvector(
-; CHECK-NEXT:    [[X:%.*]] = freeze <2 x i32> <i32 0, i32 1>
-; CHECK-NEXT:    ret <2 x i32> [[X]]
+; CHECK-NEXT:    ret <2 x i32> <i32 0, i32 1>
 ;
   %x = freeze <2 x i32> <i32 0, i32 1>
   ret <2 x i32> %x
@@ -67,8 +72,7 @@ define <2 x i32> @constvector() {
 
 define <3 x i5> @constvector_weird() {
 ; CHECK-LABEL: @constvector_weird(
-; CHECK-NEXT:    [[X:%.*]] = freeze <3 x i5> <i5 0, i5 1, i5 10>
-; CHECK-NEXT:    ret <3 x i5> [[X]]
+; CHECK-NEXT:    ret <3 x i5> <i5 0, i5 1, i5 10>
 ;
   %x = freeze <3 x i5> <i5 0, i5 1, i5 42>
   ret <3 x i5> %x
@@ -76,13 +80,14 @@ define <3 x i5> @constvector_weird() {
 
 define <2 x float> @constvector_FP() {
 ; CHECK-LABEL: @constvector_FP(
-; CHECK-NEXT:    [[X:%.*]] = freeze <2 x float> <float 0.000000e+00, float 1.000000e+00>
-; CHECK-NEXT:    ret <2 x float> [[X]]
+; CHECK-NEXT:    ret <2 x float> <float 0.000000e+00, float 1.000000e+00>
 ;
   %x = freeze <2 x float> <float 0.0, float 1.0>
   ret <2 x float> %x
 }
 
+; Negative test
+
 define <2 x i32> @constvector_noopt() {
 ; CHECK-LABEL: @constvector_noopt(
 ; CHECK-NEXT:    [[X:%.*]] = freeze <2 x i32> <i32 0, i32 undef>
@@ -92,6 +97,8 @@ define <2 x i32> @constvector_noopt() {
   ret <2 x i32> %x
 }
 
+; Negative test
+
 define <3 x i5> @constvector_weird_noopt() {
 ; CHECK-LABEL: @constvector_weird_noopt(
 ; CHECK-NEXT:    [[X:%.*]] = freeze <3 x i5> <i5 0, i5 undef, i5 10>
@@ -101,6 +108,8 @@ define <3 x i5> @constvector_weird_noopt() {
   ret <3 x i5> %x
 }
 
+; Negative test
+
 define <2 x float> @constvector_FP_noopt() {
 ; CHECK-LABEL: @constvector_FP_noopt(
 ; CHECK-NEXT:    [[X:%.*]] = freeze <2 x float> <float 0.000000e+00, float undef>
@@ -112,6 +121,8 @@ define <2 x float> @constvector_FP_noopt() {
 
 @g = external global i16, align 1
 
+; Negative test
+
 define float @constant_expr() {
 ; CHECK-LABEL: @constant_expr(
 ; CHECK-NEXT:    [[R:%.*]] = freeze float bitcast (i32 ptrtoint (i16* @g to i32) to float)
@@ -121,6 +132,8 @@ define float @constant_expr() {
   ret float %r
 }
 
+; Negative test
+
 define <2 x i31> @vector_element_constant_expr() {
 ; CHECK-LABEL: @vector_element_constant_expr(
 ; CHECK-NEXT:    [[R:%.*]] = freeze <2 x i31> <i31 34, i31 ptrtoint (i16* @g to i31)>


        


More information about the llvm-commits mailing list