From 0e8ba1b7ab281b1d0a599922ec462bf1b2cf279b Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Thu, 13 Sep 2018 20:29:50 +0000 Subject: [PATCH] [DCE] Add DebugCounter support Patch by Zhizhou Yang! Differential Revision: https://reviews.llvm.org/D50092 llvm-svn: 342170 --- lib/Transforms/Scalar/DCE.cpp | 8 ++++++++ test/Other/debugcounter-dce.ll | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 test/Other/debugcounter-dce.ll diff --git a/lib/Transforms/Scalar/DCE.cpp b/lib/Transforms/Scalar/DCE.cpp index 6078967a0f9..4c964e6e888 100644 --- a/lib/Transforms/Scalar/DCE.cpp +++ b/lib/Transforms/Scalar/DCE.cpp @@ -24,6 +24,7 @@ #include "llvm/IR/InstIterator.h" #include "llvm/IR/Instruction.h" #include "llvm/Pass.h" +#include "llvm/Support/DebugCounter.h" #include "llvm/Transforms/Scalar.h" using namespace llvm; @@ -31,6 +32,8 @@ using namespace llvm; STATISTIC(DIEEliminated, "Number of insts removed by DIE pass"); STATISTIC(DCEEliminated, "Number of insts removed"); +DEBUG_COUNTER(DCECounter, "dce-transform", + "Controls which instructions are eliminated"); namespace { //===--------------------------------------------------------------------===// @@ -50,6 +53,8 @@ namespace { for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) { Instruction *Inst = &*DI++; if (isInstructionTriviallyDead(Inst, TLI)) { + if (!DebugCounter::shouldExecute(DCECounter)) + continue; salvageDebugInfo(*Inst); Inst->eraseFromParent(); Changed = true; @@ -77,6 +82,9 @@ static bool DCEInstruction(Instruction *I, SmallSetVector &WorkList, const TargetLibraryInfo *TLI) { if (isInstructionTriviallyDead(I, TLI)) { + if (!DebugCounter::shouldExecute(DCECounter)) + return false; + salvageDebugInfo(*I); // Null out all of the instruction's operands to see if any operand becomes diff --git a/test/Other/debugcounter-dce.ll b/test/Other/debugcounter-dce.ll new file mode 100644 index 00000000000..b4914fe00fc --- /dev/null +++ b/test/Other/debugcounter-dce.ll @@ -0,0 +1,20 @@ +; REQUIRES: asserts +; RUN: opt -dce -S -debug-counter=dce-transform-skip=1,dce-transform-count=2 < %s | FileCheck %s +;; Test that, with debug counters on, we will skip the first DCE opportunity, perform next 2, +;; and ignore all the others left. + +; CHECK-LABEL: @test +; CHECK-NEXT: %add1 = add i32 1, 2 +; CHECK-NEXT: %sub1 = sub i32 %add1, 1 +; CHECK-NEXT: %add2 = add i32 1, 2 +; CHECK-NEXT: %add3 = add i32 1, 2 +; CHECK-NEXT: ret void +define void @test() { + %add1 = add i32 1, 2 + %sub1 = sub i32 %add1, 1 + %add2 = add i32 1, 2 + %sub2 = sub i32 %add2, 1 + %add3 = add i32 1, 2 + %sub3 = sub i32 %add3, 1 + ret void +}