diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -2709,7 +2709,7 @@ // If there are more than 2 instructions, check that they are noops // i.e., they won't hurt the performance of the generated code. if (FreeInstrBB->size() != 2) { - for (const Instruction &Inst : *FreeInstrBB) { + for (const Instruction &Inst : FreeInstrBB->instructionsWithoutDebug()) { if (&Inst == &FI || &Inst == FreeInstrBBTerminator) continue; auto *Cast = dyn_cast(&Inst); diff --git a/llvm/test/Transforms/InstCombine/malloc-free-delete-dbginvar.ll b/llvm/test/Transforms/InstCombine/malloc-free-delete-dbginvar.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/malloc-free-delete-dbginvar.ll @@ -0,0 +1,22 @@ +; Check that the instcombine result is the same with/without debug info. +; This is a regression test for a function taken from malloc-free-delete.ll. + +; RUN: opt < %s -instcombine -S > %t.no_dbg.ll +; RUN: opt < %s -debugify-each -instcombine -S > %t.ll +; RUN: diff %t.no_dbg.ll %t.ll + +declare void @free(i8*) + +define void @test12(i32* %foo) minsize { +entry: + %tobool = icmp eq i32* %foo, null + br i1 %tobool, label %if.end, label %if.then + +if.then: ; preds = %entry + %bitcast = bitcast i32* %foo to i8* + tail call void @free(i8* %bitcast) + br label %if.end + +if.end: ; preds = %entry, %if.then + ret void +}