Index: llvm/lib/Analysis/LazyValueInfo.cpp =================================================================== --- llvm/lib/Analysis/LazyValueInfo.cpp +++ llvm/lib/Analysis/LazyValueInfo.cpp @@ -819,6 +819,8 @@ if (!OptTrueVal) return None; ValueLatticeElement &TrueVal = *OptTrueVal; + intersectAssumeOrGuardBlockValueConstantRange(SI->getTrueValue(), TrueVal, + SI); // If we hit overdefined, don't ask more queries. We want to avoid poisoning // extra slots in the table if we can. @@ -830,6 +832,8 @@ if (!OptFalseVal) return None; ValueLatticeElement &FalseVal = *OptFalseVal; + intersectAssumeOrGuardBlockValueConstantRange(SI->getFalseValue(), FalseVal, + SI); // If we hit overdefined, don't ask more queries. We want to avoid poisoning // extra slots in the table if we can. Index: llvm/test/Transforms/JumpThreading/assume.ll =================================================================== --- llvm/test/Transforms/JumpThreading/assume.ll +++ llvm/test/Transforms/JumpThreading/assume.ll @@ -229,6 +229,32 @@ store atomic i32 0, i32* @g unordered, align 4 ret void } + +define void @can_fold_assume5(i32, i32, i1 zeroext, i1 %cond) { +; CHECK-LABEL: can_fold_assume5 +; CHECK: @llvm.assume +; CHECK: @llvm.assume +; CHECK-NOT: @dummy(i1 true) + %4 = icmp slt i32 %0, 234 + tail call void @llvm.assume(i1 %4) + %5 = icmp sgt i32 %1, 789 + tail call void @llvm.assume(i1 %5) + %6 = select i1 %2, i32 %0, i32 %1 + %7 = add i32 %6, -234 + br i1 %cond, label %label0, label %label2 + +label0: + %8 = icmp ult i32 %7, 556 + br i1 %8, label %label1, label %label2 + +label1: + tail call void @dummy(i1 true) + br label %label2 + +label2: + ret void +} + ; Function Attrs: nounwind declare void @llvm.assume(i1) #1