Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 11 additions & 4 deletions llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -333,10 +333,17 @@ static bool constantFoldCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
if (!Res)
return false;

++NumCmps;
Cmp->replaceAllUsesWith(Res);
Cmp->eraseFromParent();
return true;
bool Changed = Cmp->replaceUsesWithIf(
Res, [](Use &U) { return !isa<AssumeInst>(U.getUser()); });
if (Cmp->use_empty()) {
Cmp->eraseFromParent();
Changed = true;
}

if (Changed)
++NumCmps;

return Changed;
}

static bool processCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/Transforms/CorrelatedValuePropagation/conflict.ll
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ define i8 @test3(i8 %a) {
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 5
; CHECK-NEXT: br i1 [[CMP1]], label [[DEAD:%.*]], label [[EXIT:%.*]]
; CHECK: dead:
; CHECK-NEXT: call void @llvm.assume(i1 false)
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[A]], 3
; CHECK-NEXT: call void @llvm.assume(i1 [[CMP2]])
; CHECK-NEXT: ret i8 5
; CHECK: exit:
; CHECK-NEXT: ret i8 0
Expand Down
18 changes: 18 additions & 0 deletions llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ target triple = "x86_64-apple-macosx10.10.0"

declare void @check1(i1) #1
declare void @check2(i1) #1
declare void @check3(i64)
declare void @llvm.assume(i1)

; Make sure we propagate the value of %tmp35 to the true/false cases
Expand Down Expand Up @@ -1657,3 +1658,20 @@ if.true:
if.false:
ret void
}

define void @test_assume_not_removed(i64 %idx) {
; CHECK-LABEL: @test_assume_not_removed(
; CHECK-NEXT: [[IDX1:%.*]] = add nuw i64 [[IDX:%.*]], 1
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i64 [[IDX1]], 1
; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP]])
; CHECK-NEXT: tail call void @check3(i64 [[IDX1]])
; CHECK-NEXT: tail call void @check1(i1 true)
; CHECK-NEXT: ret void
;
%idx1 = add i64 %idx, 1
%cmp = icmp ugt i64 %idx1, 1
tail call void @llvm.assume(i1 %cmp)
tail call void @check3(i64 %idx1)
tail call void @check1(i1 %cmp)
ret void
}
Loading