Index: lib/Transforms/Scalar/IndVarSimplify.cpp =================================================================== --- lib/Transforms/Scalar/IndVarSimplify.cpp +++ lib/Transforms/Scalar/IndVarSimplify.cpp @@ -2490,8 +2490,10 @@ // which are now dead. while (!DeadInsts.empty()) if (Instruction *Inst = - dyn_cast_or_null(DeadInsts.pop_back_val())) + dyn_cast_or_null(DeadInsts.pop_back_val())) { + Changed = true; RecursivelyDeleteTriviallyDeadInstructions(Inst, TLI); + } // The Rewriter may not be used from this point on. Index: test/Transforms/IndVarSimplify/pr38855.ll =================================================================== --- test/Transforms/IndVarSimplify/pr38855.ll +++ test/Transforms/IndVarSimplify/pr38855.ll @@ -0,0 +1,24 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt -S -inline -functionattrs -indvars < %s | FileCheck %s + +; Check that the invalidation happens correctly and the test does not crash. +define void @f2() { +; CHECK-LABEL: @f2( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[FOR_COND:%.*]] +; CHECK: for.cond: +; CHECK-NEXT: br label [[FOR_COND]] +; +entry: + br label %for.cond + +for.cond: ; preds = %for.cond, %entry + %a.0 = phi i32 [ 1, %entry ], [ 0, %for.cond ] + call void @f1(i32 %a.0) + br label %for.cond +} + +define internal void @f1(i32 %p1) noinline { +entry: + ret void +}