diff options
| -rw-r--r-- | llvm/lib/Analysis/LazyValueInfo.cpp | 15 | ||||
| -rw-r--r-- | llvm/test/Transforms/CorrelatedValuePropagation/overflows.ll | 27 |
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 |

