From: George Burgess IV Date: Thu, 13 Sep 2018 20:29:50 +0000 (+0000) Subject: [DCE] Add DebugCounter support X-Git-Tag: llvmorg-8.0.0-rc1~8772 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7a8dc3dafa85a1bbbb9458f2162ac5d61a9dc91a;p=platform%2Fupstream%2Fllvm.git [DCE] Add DebugCounter support Patch by Zhizhou Yang! Differential Revision: https://reviews.llvm.org/D50092 llvm-svn: 342170 --- diff --git a/llvm/lib/Transforms/Scalar/DCE.cpp b/llvm/lib/Transforms/Scalar/DCE.cpp index 6078967..4c964e6 100644 --- a/llvm/lib/Transforms/Scalar/DCE.cpp +++ b/llvm/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/llvm/test/Other/debugcounter-dce.ll b/llvm/test/Other/debugcounter-dce.ll new file mode 100644 index 0000000..b4914fe --- /dev/null +++ b/llvm/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 +}