Index: llvm/trunk/lib/Transforms/Scalar/DCE.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/DCE.cpp +++ llvm/trunk/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 @@ 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 @@ 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 @@ 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 Index: llvm/trunk/test/Other/debugcounter-dce.ll =================================================================== --- llvm/trunk/test/Other/debugcounter-dce.ll +++ llvm/trunk/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 +}