mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[DIE] Remove DeadInstEliminationPass
This pass is like DeadCodeEliminationPass, but only does one pass through a function instead of iterating on users of eliminated instructions. DeadCodeEliminationPass should be used in all cases. Reviewed By: asbirlea Differential Revision: https://reviews.llvm.org/D87933
This commit is contained in:
parent
d6e72b1648
commit
c01a5baad9
@ -123,7 +123,6 @@ void initializeDAHPass(PassRegistry&);
|
||||
void initializeDCELegacyPassPass(PassRegistry&);
|
||||
void initializeDSELegacyPassPass(PassRegistry&);
|
||||
void initializeDataFlowSanitizerLegacyPassPass(PassRegistry &);
|
||||
void initializeDeadInstEliminationPass(PassRegistry&);
|
||||
void initializeDeadMachineInstructionElimPass(PassRegistry&);
|
||||
void initializeDebugifyMachineModulePass(PassRegistry &);
|
||||
void initializeDelinearizationPass(PassRegistry&);
|
||||
|
@ -93,7 +93,6 @@ namespace {
|
||||
(void) llvm::createCostModelAnalysisPass();
|
||||
(void) llvm::createDeadArgEliminationPass();
|
||||
(void) llvm::createDeadCodeEliminationPass();
|
||||
(void) llvm::createDeadInstEliminationPass();
|
||||
(void) llvm::createDeadStoreEliminationPass();
|
||||
(void) llvm::createDependenceAnalysisWrapperPass();
|
||||
(void) llvm::createDomOnlyPrinterPass();
|
||||
|
@ -37,13 +37,6 @@ FunctionPass *createAlignmentFromAssumptionsPass();
|
||||
//
|
||||
FunctionPass *createSCCPPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// DeadInstElimination - This pass quickly removes trivially dead instructions
|
||||
// without modifying the CFG of the function. It is a FunctionPass.
|
||||
//
|
||||
Pass *createDeadInstEliminationPass();
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// RedundantDbgInstElimination - This pass removes redundant dbg intrinsics
|
||||
|
@ -32,57 +32,10 @@ using namespace llvm;
|
||||
|
||||
#define DEBUG_TYPE "dce"
|
||||
|
||||
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 {
|
||||
//===--------------------------------------------------------------------===//
|
||||
// DeadInstElimination pass implementation
|
||||
//
|
||||
struct DeadInstElimination : public FunctionPass {
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
DeadInstElimination() : FunctionPass(ID) {
|
||||
initializeDeadInstEliminationPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
bool runOnFunction(Function &F) override {
|
||||
if (skipFunction(F))
|
||||
return false;
|
||||
auto *TLIP = getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>();
|
||||
TargetLibraryInfo *TLI = TLIP ? &TLIP->getTLI(F) : nullptr;
|
||||
|
||||
bool Changed = false;
|
||||
for (auto &BB : F) {
|
||||
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;
|
||||
++DIEEliminated;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Changed;
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
char DeadInstElimination::ID = 0;
|
||||
INITIALIZE_PASS(DeadInstElimination, "die",
|
||||
"Dead Instruction Elimination", false, false)
|
||||
|
||||
Pass *llvm::createDeadInstEliminationPass() {
|
||||
return new DeadInstElimination();
|
||||
}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
// RedundantDbgInstElimination pass implementation
|
||||
//
|
||||
|
@ -41,7 +41,6 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
|
||||
initializeConstraintEliminationPass(Registry);
|
||||
initializeCorrelatedValuePropagationPass(Registry);
|
||||
initializeDCELegacyPassPass(Registry);
|
||||
initializeDeadInstEliminationPass(Registry);
|
||||
initializeDivRemPairsLegacyPassPass(Registry);
|
||||
initializeScalarizerLegacyPassPass(Registry);
|
||||
initializeDSELegacyPassPass(Registry);
|
||||
|
@ -2,7 +2,7 @@
|
||||
; RUN: opt -O1 -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O1
|
||||
; RUN: opt -O2 -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O1 --check-prefix=O2O3
|
||||
; RUN: opt -O3 -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=O1 --check-prefix=O2O3
|
||||
; RUN: opt -dce -die -gvn-hoist -loweratomic -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=MORE
|
||||
; RUN: opt -dce -gvn-hoist -loweratomic -S -debug -enable-new-pm=0 %s 2>&1 | FileCheck %s --check-prefix=MORE
|
||||
; RUN: opt -indvars -licm -loop-deletion -loop-extract -loop-idiom -loop-instsimplify -loop-reduce -loop-reroll -loop-rotate -loop-unroll -loop-unswitch -enable-new-pm=0 -S -debug %s 2>&1 | FileCheck %s --check-prefix=LOOP
|
||||
; RUN: opt -enable-npm-optnone -S -debug-pass-manager -enable-new-pm %s 2>&1 | FileCheck %s --check-prefix=NPM-O0
|
||||
; RUN: opt -enable-npm-optnone -O1 -S -debug-pass-manager -enable-new-pm %s 2>&1 | FileCheck %s --check-prefix=NPM-O1
|
||||
@ -65,7 +65,6 @@ attributes #0 = { optnone noinline }
|
||||
|
||||
; Additional IR passes that opt doesn't turn on by default.
|
||||
; MORE-DAG: Skipping pass 'Dead Code Elimination'
|
||||
; MORE-DAG: Skipping pass 'Dead Instruction Elimination'
|
||||
; NPM-MORE-DAG: Skipping pass: DCEPass
|
||||
; NPM-MORE-DAG: Skipping pass: GVNHoistPass
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt < %s -deadargelim -die -S > %t
|
||||
; RUN: opt < %s -deadargelim -dce -S > %t
|
||||
; RUN: cat %t | grep 123
|
||||
|
||||
; This test tries to catch wrongful removal of return values for a specific case
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt < %s -deadargelim -die -S > %t
|
||||
; RUN: opt < %s -deadargelim -dce -S > %t
|
||||
; RUN: cat %t | not grep DEAD
|
||||
; RUN: cat %t | grep LIVE | count 4
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt < %s -data-layout="e-p:32:32:32-p1:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basic-aa -gvn -S -die | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="e-p:32:32:32-p1:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basic-aa -gvn -S -dce | FileCheck %s
|
||||
|
||||
define i8 @coerce_offset0_addrspacecast(i32 %V, i32* %P) {
|
||||
store i32 %V, i32* %P
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: opt < %s -data-layout="e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basic-aa -gvn -S -die | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="E-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-n32" -basic-aa -gvn -S -die | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basic-aa -gvn -S -dce | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="E-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-n32" -basic-aa -gvn -S -dce | FileCheck %s
|
||||
|
||||
;; Trivial RLE test.
|
||||
define i32 @test0(i32 %V, i32* %P) {
|
||||
@ -772,7 +772,7 @@ entry:
|
||||
|
||||
%tmp3 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 4), align 1
|
||||
%conv4 = zext i8 %tmp3 to i32
|
||||
%add3 = add nsw i32 %add2, %conv3
|
||||
%add3 = add nsw i32 %add2, %conv4
|
||||
|
||||
ret i32 %add3
|
||||
; CHECK-LABEL: @test_widening2(
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: opt < %s -instcombine -S | grep "ret i32 %A"
|
||||
; RUN: opt < %s -die -S | not grep call.*llvm
|
||||
; RUN: opt < %s -dce -S | not grep call.*llvm
|
||||
|
||||
define i32 @test(i32 %A) {
|
||||
%X = or i1 false, false
|
||||
|
@ -1,6 +1,6 @@
|
||||
; SetCC on boolean values was not implemented!
|
||||
|
||||
; RUN: opt < %s -instsimplify -die -S | \
|
||||
; RUN: opt < %s -instsimplify -dce -S | \
|
||||
; RUN: not grep set
|
||||
|
||||
define i1 @test1() {
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: opt < %s -instsimplify -die -S | FileCheck %s
|
||||
; RUN: opt < %s -instsimplify -dce -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-macosx10.7.2"
|
||||
|
@ -1,6 +1,6 @@
|
||||
; Ensure constant propagation of logical instructions is working correctly.
|
||||
|
||||
; RUN: opt < %s -instsimplify -die -S | FileCheck %s
|
||||
; RUN: opt < %s -instsimplify -dce -S | FileCheck %s
|
||||
; CHECK-NOT: {{and|or|xor}}
|
||||
|
||||
define i32 @test1() {
|
||||
|
@ -1,7 +1,7 @@
|
||||
; This is a basic sanity check for constant propagation. The add instruction
|
||||
; should be eliminated.
|
||||
|
||||
; RUN: opt < %s -instsimplify -die -S | not grep phi
|
||||
; RUN: opt < %s -instsimplify -dce -S | not grep phi
|
||||
|
||||
define i32 @test(i1 %B) {
|
||||
BB0:
|
||||
|
@ -1,6 +1,6 @@
|
||||
; Ensure constant propagation of remainder instructions is working correctly.
|
||||
|
||||
; RUN: opt < %s -instsimplify -die -S | not grep rem
|
||||
; RUN: opt < %s -instsimplify -dce -S | not grep rem
|
||||
|
||||
define i32 @test1() {
|
||||
%R = srem i32 4, 3 ; <i32> [#uses=1]
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: opt < %s -data-layout="e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basic-aa -newgvn -S -die | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="E-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-n32" -basic-aa -newgvn -S -die | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basic-aa -newgvn -S -dce | FileCheck %s
|
||||
; RUN: opt < %s -data-layout="E-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-n32" -basic-aa -newgvn -S -dce | FileCheck %s
|
||||
; memset -> i16 forwarding.
|
||||
define signext i16 @memset_to_i16_local(i16* %A) nounwind ssp {
|
||||
entry:
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt < %s -reassociate -die -S | FileCheck %s
|
||||
; RUN: opt < %s -reassociate -dce -S | FileCheck %s
|
||||
|
||||
; (A&B)&~A == 0
|
||||
define i32 @test1(i32 %a, i32 %b) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
; Reassociation should apply to Add, Mul, And, Or, & Xor
|
||||
;
|
||||
; RUN: opt < %s -reassociate -instcombine -die -S | FileCheck %s
|
||||
; RUN: opt < %s -reassociate -instcombine -dce -S | FileCheck %s
|
||||
|
||||
define i32 @test_mul(i32 %arg) {
|
||||
; CHECK-LABEL: test_mul
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
||||
; RUN: opt -S -reassociate -die < %s | FileCheck %s
|
||||
; RUN: opt -S -reassociate -dce < %s | FileCheck %s
|
||||
|
||||
; The two va_arg instructions depend on the memory/context, are therfore not
|
||||
; identical and the sub should not be optimized to 0 by reassociate.
|
||||
|
Loading…
Reference in New Issue
Block a user