[llvm] 82082b7 - [LVI] Don't compute range on not guaranteed not to be undef condition in SelectInst

via llvm-commits llvm-commits at lists.llvm.org
Wed May 24 01:02:28 PDT 2023


Author: luxufan
Date: 2023-05-24T16:02:13+08:00
New Revision: 82082b7da075b9f3571ab5b26248578e6d98ee52

URL: https://github.com/llvm/llvm-project/commit/82082b7da075b9f3571ab5b26248578e6d98ee52
DIFF: https://github.com/llvm/llvm-project/commit/82082b7da075b9f3571ab5b26248578e6d98ee52.diff

LOG: [LVI] Don't compute range on not guaranteed not to be undef condition in SelectInst

Fixes:https://github.com/llvm/llvm-project/issues/62901

Reviewed By: nikic

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

Added: 
    

Modified: 
    llvm/lib/Analysis/LazyValueInfo.cpp
    llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
    llvm/test/Transforms/CorrelatedValuePropagation/select.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index 789c2902369b9..7a40259492abf 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -876,10 +876,14 @@ LazyValueInfoImpl::solveBlockValueSelect(SelectInst *SI, BasicBlock *BB) {
   // condition itself?  This shows up with idioms like e.g. select(a > 5, a, 5).
   // TODO: We could potentially refine an overdefined true value above.
   Value *Cond = SI->getCondition();
-  TrueVal = intersect(TrueVal,
-                      getValueFromCondition(SI->getTrueValue(), Cond, true));
-  FalseVal = intersect(FalseVal,
-                       getValueFromCondition(SI->getFalseValue(), Cond, false));
+  // If the value is undef, a 
diff erent value may be chosen in
+  // the select condition.
+  if (isGuaranteedNotToBeUndefOrPoison(Cond, AC)) {
+    TrueVal = intersect(TrueVal,
+                        getValueFromCondition(SI->getTrueValue(), Cond, true));
+    FalseVal = intersect(
+        FalseVal, getValueFromCondition(SI->getFalseValue(), Cond, false));
+  }
 
   ValueLatticeElement Result = TrueVal;
   Result.mergeIn(FalseVal);

diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
index c3c753375f1b4..39285df56ae3c 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/basic.ll
@@ -735,7 +735,7 @@ define i1 @umin_rhs_overdefined_lhs_range(i32 %a, i32 %b) {
   ret i1 %cmp2
 }
 
-define i1 @clamp_low1(i32 %a) {
+define i1 @clamp_low1(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_low1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5
@@ -762,7 +762,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_low2(i32 %a) {
+define i1 @clamp_low2(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_low2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5
@@ -789,7 +789,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_low3(i32 %a) {
+define i1 @clamp_low3(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_low3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5
@@ -816,7 +816,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_low4(i32 %a) {
+define i1 @clamp_low4(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_low4(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sge i32 [[A:%.*]], 5
@@ -843,7 +843,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_high1(i32 %a) {
+define i1 @clamp_high1(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_high1(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
@@ -870,7 +870,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_high2(i32 %a) {
+define i1 @clamp_high2(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_high2(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
@@ -897,7 +897,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_high3(i32 %a) {
+define i1 @clamp_high3(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_high3(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
@@ -924,7 +924,7 @@ out:
   ret i1 false
 }
 
-define i1 @clamp_high4(i32 %a) {
+define i1 @clamp_high4(i32 noundef %a) {
 ; CHECK-LABEL: @clamp_high4(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5
@@ -952,7 +952,7 @@ out:
 }
 
 ; Just showing arbitrary constants work, not really a clamp
-define i1 @not_clamp_high(i32 %a) {
+define i1 @not_clamp_high(i32 noundef %a) {
 ; CHECK-LABEL: @not_clamp_high(
 ; CHECK-NEXT:  entry:
 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 5

diff  --git a/llvm/test/Transforms/CorrelatedValuePropagation/select.ll b/llvm/test/Transforms/CorrelatedValuePropagation/select.ll
index 923b6ac427578..8ffd9536d7970 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/select.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/select.ll
@@ -222,7 +222,7 @@ define i1 @test5(ptr %p, i1 %unknown) {
 ; CHECK:       exit:
 ; CHECK-NEXT:    ret i1 true
 ;
-  %pval = load i32, i32* %p
+  %pval = load i32, i32* %p, !noundef !0
   %cmp1 = icmp slt i32 %pval, 255
   br i1 %cmp1, label %next, label %exit
 
@@ -248,7 +248,7 @@ define i1 @test6(ptr %p, i1 %unknown) {
 ; CHECK:       exit:
 ; CHECK-NEXT:    ret i1 true
 ;
-  %pval = load i32, i32* %p
+  %pval = load i32, i32* %p, !noundef !0
   %cmp1 = icmp ult i32 %pval, 255
   br i1 %cmp1, label %next, label %exit
 
@@ -261,3 +261,18 @@ next:
 exit:
   ret i1 true
 }
+
+define i64 @select_cond_may_undef(i32 %a) {
+; CHECK-LABEL: @select_cond_may_undef(
+; CHECK-NEXT:    [[IS_A_NONNEGATIVE:%.*]] = icmp sgt i32 [[A:%.*]], 1
+; CHECK-NEXT:    [[NARROW:%.*]] = select i1 [[IS_A_NONNEGATIVE]], i32 [[A]], i32 0
+; CHECK-NEXT:    [[MAX:%.*]] = sext i32 [[NARROW]] to i64
+; CHECK-NEXT:    ret i64 [[MAX]]
+;
+  %is_a_nonnegative = icmp sgt i32 %a, 1
+  %narrow = select i1 %is_a_nonnegative, i32 %a, i32 0
+  %max = sext i32 %narrow to i64
+  ret i64 %max
+}
+
+!0 = !{}


        


More information about the llvm-commits mailing list