Index: llvm/lib/Transforms/Scalar/ADCE.cpp =================================================================== --- llvm/lib/Transforms/Scalar/ADCE.cpp +++ llvm/lib/Transforms/Scalar/ADCE.cpp @@ -538,7 +538,7 @@ // that have no side effects and do not influence the control flow or return // value of the function, and may therefore be deleted safely. // NOTE: We reuse the Worklist vector here for memory efficiency. - for (Instruction &I : instructions(F)) { + for (Instruction &I : llvm::reverse(instructions(F))) { // Check if the instruction is alive. if (isLive(&I)) continue; @@ -554,9 +554,11 @@ // Prepare to delete. Worklist.push_back(&I); salvageDebugInfo(I); - I.dropAllReferences(); } + for (Instruction *&I : Worklist) + I->dropAllReferences(); + for (Instruction *&I : Worklist) { ++NumRemoved; I->eraseFromParent(); Index: llvm/test/Transforms/Util/salvage-debuginfo.ll =================================================================== --- llvm/test/Transforms/Util/salvage-debuginfo.ll +++ llvm/test/Transforms/Util/salvage-debuginfo.ll @@ -5,8 +5,10 @@ entry: %p_x = inttoptr i32 %0 to i8* %i_x = ptrtoint i8* %p_x to i32 - ; CHECK: call void @llvm.dbg.value(metadata i8* undef, - ; CHECK-SAME: !DIExpression(DW_OP_LLVM_convert, 64, DW_ATE_unsigned, + ; CHECK: call void @llvm.dbg.value(metadata i32 %0, + ; CHECK-SAME: !DIExpression(DW_OP_LLVM_convert, 32, DW_ATE_unsigned, + ; CHECK-SAME: DW_OP_LLVM_convert, 64, DW_ATE_unsigned, + ; CHECK-SAME: DW_OP_LLVM_convert, 64, DW_ATE_unsigned, ; CHECK-SAME: DW_OP_LLVM_convert, 32, DW_ATE_unsigned, DW_OP_stack_value)) call void @llvm.dbg.value(metadata i32 %i_x, metadata !11, metadata !DIExpression()), !dbg !13 ret void, !dbg !13