summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Analysis/LazyValueInfo.cpp15
-rw-r--r--llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll27
2 files changed, 22 insertions, 20 deletions
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index 541fc876a21..96722f32e35 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -1141,6 +1141,21 @@ bool LazyValueInfoImpl::solveBlockValueExtractValue(
if (EVI->getNumIndices() == 1 && *EVI->idx_begin() == 0)
return solveBlockValueOverflowIntrinsic(BBLV, WO, BB);
+ // Handle extractvalue of insertvalue to allow further simplification
+ // based on replaced with.overflow intrinsics.
+ if (Value *V = SimplifyExtractValueInst(
+ EVI->getAggregateOperand(), EVI->getIndices(),
+ EVI->getModule()->getDataLayout())) {
+ if (!hasBlockValue(V, BB)) {
+ if (pushBlockValue({ BB, V }))
+ return false;
+ BBLV = ValueLatticeElement::getOverdefined();
+ return true;
+ }
+ BBLV = getBlockValue(V, BB);
+ return true;
+ }
+
LLVM_DEBUG(dbgs() << " compute BB '" << BB->getName()
<< "' - overdefined (unknown extractvalue).\n");
BBLV = ValueLatticeElement::getOverdefined();
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll b/llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
index 7f021a47f64..39964682bf2 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll
@@ -850,11 +850,9 @@ define i1 @sadd_and_cmp(i32 %x, i32 %y) #0 {
; CHECK-NEXT: [[ADD:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
; CHECK-NEXT: br label [[CONT3:%.*]]
; CHECK: cont3:
-; CHECK-NEXT: [[CMP3:%.*]] = icmp slt i32 [[ADD]], 19
; CHECK-NEXT: br label [[OUT]]
; CHECK: out:
-; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT3]] ]
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
entry:
%x.offset = add i32 %x, 9
@@ -897,11 +895,9 @@ define i1 @uadd_and_cmp(i32 %x, i32 %y) #0 {
; CHECK-NEXT: [[ADD:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
; CHECK-NEXT: br label [[CONT3:%.*]]
; CHECK: cont3:
-; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[ADD]], 19
; CHECK-NEXT: br label [[OUT]]
; CHECK: out:
-; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT3]] ]
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
entry:
%cmp1 = icmp ult i32 %x, 10
@@ -940,11 +936,9 @@ define i1 @ssub_and_cmp(i32 %x, i32 %y) #0 {
; CHECK-NEXT: [[SUB:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
; CHECK-NEXT: br label [[CONT3:%.*]]
; CHECK: cont3:
-; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[SUB]], 19
; CHECK-NEXT: br label [[OUT]]
; CHECK: out:
-; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT3]] ]
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
entry:
%cmp1 = icmp ult i32 %x, 10
@@ -985,11 +979,9 @@ define i1 @usub_and_cmp(i32 %x, i32 %y) #0 {
; CHECK-NEXT: [[SUB:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
; CHECK-NEXT: br label [[CONT3:%.*]]
; CHECK: cont3:
-; CHECK-NEXT: [[CMP3:%.*]] = icmp ult i32 [[SUB]], 19
; CHECK-NEXT: br label [[OUT]]
; CHECK: out:
-; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT3]] ]
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
entry:
%cmp1 = icmp ult i32 %x, 10
@@ -1031,13 +1023,10 @@ define i1 @smul_and_cmp(i32 %x, i32 %y) #0 {
; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
; CHECK-NEXT: br label [[CONT3:%.*]]
; CHECK: cont3:
-; CHECK-NEXT: [[CMP3:%.*]] = icmp sle i32 [[MUL]], 81
-; CHECK-NEXT: [[CMP4:%.*]] = icmp sge i32 [[MUL]], -81
-; CHECK-NEXT: [[CMP5:%.*]] = and i1 [[CMP3]], [[CMP4]]
+; CHECK-NEXT: [[CMP5:%.*]] = and i1 true, true
; CHECK-NEXT: br label [[OUT]]
; CHECK: out:
-; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP5]], [[CONT3]] ]
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
entry:
%x.offset = add i32 %x, 9
@@ -1080,11 +1069,9 @@ define i1 @umul_and_cmp(i32 %x, i32 %y) #0 {
; CHECK-NEXT: [[MUL:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0
; CHECK-NEXT: br label [[CONT3:%.*]]
; CHECK: cont3:
-; CHECK-NEXT: [[CMP3:%.*]] = icmp ule i32 [[MUL]], 9801
; CHECK-NEXT: br label [[OUT]]
; CHECK: out:
-; CHECK-NEXT: [[RET:%.*]] = phi i1 [ true, [[ENTRY:%.*]] ], [ true, [[CONT1]] ], [ [[CMP3]], [[CONT3]] ]
-; CHECK-NEXT: ret i1 [[RET]]
+; CHECK-NEXT: ret i1 true
;
entry:
%cmp1 = icmp ult i32 %x, 100
OpenPOWER on IntegriCloud