From 9232ca4712cf3f3a99a8cd095165241daf0ddc4e Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Mon, 27 Sep 2021 10:51:04 -0700 Subject: [PATCH] Improve the effectiveness of BDCE's debug info salvaging This patch improves the effectiveness of BDCE's debug info salvaging by processing the instructions in reverse order and delaying dropAllReferences until after debug info salvaging. This allows salvaging of entire chains of deleted instructions! Previously we would remove all references from an instruction, which would make it impossible to use that instruction to salvage a later instruction in the instruction stream, because its operands were already removed. This reapplies the previous patch with a fix for a use-after-free. Differential Revision: https://reviews.llvm.org/D110568 --- llvm/lib/Transforms/Scalar/BDCE.cpp | 7 +++++-- llvm/test/Transforms/Util/salvage-debuginfo.ll | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/BDCE.cpp b/llvm/lib/Transforms/Scalar/BDCE.cpp index c06125788f37..23ab17ffdde6 100644 --- a/llvm/lib/Transforms/Scalar/BDCE.cpp +++ b/llvm/lib/Transforms/Scalar/BDCE.cpp @@ -106,9 +106,7 @@ static bool bitTrackingDCE(Function &F, DemandedBits &DB) { (I.getType()->isIntOrIntVectorTy() && DB.getDemandedBits(&I).isNullValue() && wouldInstructionBeTriviallyDead(&I))) { - salvageDebugInfo(I); Worklist.push_back(&I); - I.dropAllReferences(); Changed = true; continue; } @@ -155,6 +153,11 @@ static bool bitTrackingDCE(Function &F, DemandedBits &DB) { } } + for (Instruction *&I : llvm::reverse(Worklist)) { + salvageDebugInfo(*I); + I->dropAllReferences(); + } + for (Instruction *&I : Worklist) { ++NumRemoved; I->eraseFromParent(); diff --git a/llvm/test/Transforms/Util/salvage-debuginfo.ll b/llvm/test/Transforms/Util/salvage-debuginfo.ll index ed1baa56017a..d72b239e3164 100644 --- a/llvm/test/Transforms/Util/salvage-debuginfo.ll +++ b/llvm/test/Transforms/Util/salvage-debuginfo.ll @@ -1,4 +1,5 @@ ; RUN: opt -adce %s -S -o - | FileCheck %s +; RUN: opt -bdce %s -S -o - | FileCheck %s target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-apple-macosx" define void @f(i32) !dbg !8 {