Index: llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp =================================================================== --- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1433,6 +1433,10 @@ if (match(Next, m_Intrinsic(m_Specific(IIOperand)))) return eraseInstFromFunction(CI); + // If this assume is in an unreachable block, it can't be useful. + if (isa(II->getParent()->getTerminator())) + return eraseInstFromFunction(*II); + // Canonicalize assume(a && b) -> assume(a); assume(b); // Note: New assumption intrinsics created here are registered by // the InstCombineIRInserter object. Index: llvm/test/Transforms/InstCombine/assume.ll =================================================================== --- llvm/test/Transforms/InstCombine/assume.ll +++ llvm/test/Transforms/InstCombine/assume.ll @@ -543,7 +543,6 @@ define void @PR36270(i32 %b) { ; CHECK-LABEL: @PR36270( -; CHECK-NEXT: tail call void @llvm.assume(i1 false) ; CHECK-NEXT: unreachable ; %B7 = xor i32 -1, 2147483647 @@ -573,8 +572,6 @@ ; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP3]]) ; CHECK-NEXT: br label [[EXIT]] ; CHECK: exit: -; CHECK-NEXT: [[CMP4:%.*]] = icmp eq i32 [[X]], 2 -; CHECK-NEXT: tail call void @llvm.assume(i1 [[CMP4]]) ; CHECK-NEXT: unreachable ; entry: