mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[DCE] Add DebugCounter support
Patch by Zhizhou Yang! Differential Revision: https://reviews.llvm.org/D50092 llvm-svn: 342170
This commit is contained in:
parent
dcb41910dc
commit
0e8ba1b7ab
@ -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<Instruction *, 16> &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
|
||||
|
20
test/Other/debugcounter-dce.ll
Normal file
20
test/Other/debugcounter-dce.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user