1
0
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:
Arthur Eubanks 2020-09-18 12:55:00 -07:00
parent d6e72b1648
commit c01a5baad9
20 changed files with 18 additions and 76 deletions

View File

@ -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&);

View File

@ -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();

View File

@ -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

View File

@ -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
//

View File

@ -41,7 +41,6 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
initializeConstraintEliminationPass(Registry);
initializeCorrelatedValuePropagationPass(Registry);
initializeDCELegacyPassPass(Registry);
initializeDeadInstEliminationPass(Registry);
initializeDivRemPairsLegacyPassPass(Registry);
initializeScalarizerLegacyPassPass(Registry);
initializeDSELegacyPassPass(Registry);

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(

View File

@ -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

View File

@ -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() {

View File

@ -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"

View File

@ -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() {

View File

@ -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:

View File

@ -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]

View File

@ -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:

View File

@ -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) {

View File

@ -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

View File

@ -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.