forked from OSchip/llvm-project
[SLSR] garbage-collect unused instructions
Summary: After we rewrite a candidate, the instructions used by the old form may become unused. This patch cleans up these unused instructions so that we needn't run DCE after SLSR. Test Plan: removed -dce in all the SLSR tests Reviewers: broune, meheff Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D9101 llvm-svn: 235410
This commit is contained in:
parent
f763c3fd45
commit
f1edf3e88f
|
@ -68,6 +68,7 @@
|
|||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
|
||||
using namespace llvm;
|
||||
using namespace PatternMatch;
|
||||
|
@ -599,9 +600,14 @@ void StraightLineStrengthReduce::rewriteCandidateWithBasis(
|
|||
switch (C.CandidateKind) {
|
||||
case Candidate::Add:
|
||||
case Candidate::Mul:
|
||||
// C = Basis + Bump
|
||||
if (BinaryOperator::isNeg(Bump)) {
|
||||
// If Bump is a neg instruction, emit C = Basis - (-Bump).
|
||||
Reduced =
|
||||
Builder.CreateSub(Basis.Ins, BinaryOperator::getNegArgument(Bump));
|
||||
// We only use the negative argument of Bump, and Bump itself may be
|
||||
// trivially dead.
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Bump);
|
||||
} else {
|
||||
Reduced = Builder.CreateAdd(Basis.Ins, Bump);
|
||||
}
|
||||
|
@ -637,7 +643,6 @@ void StraightLineStrengthReduce::rewriteCandidateWithBasis(
|
|||
};
|
||||
Reduced->takeName(C.Ins);
|
||||
C.Ins->replaceAllUsesWith(Reduced);
|
||||
C.Ins->dropAllReferences();
|
||||
// Unlink C.Ins so that we can skip other candidates also corresponding to
|
||||
// C.Ins. The actual deletion is postponed to the end of runOnFunction.
|
||||
C.Ins->removeFromParent();
|
||||
|
@ -670,8 +675,13 @@ bool StraightLineStrengthReduce::runOnFunction(Function &F) {
|
|||
}
|
||||
|
||||
// Delete all unlink instructions.
|
||||
for (auto I : UnlinkedInstructions) {
|
||||
delete I;
|
||||
for (auto *UnlinkedInst : UnlinkedInstructions) {
|
||||
for (unsigned I = 0, E = UnlinkedInst->getNumOperands(); I != E; ++I) {
|
||||
Value *Op = UnlinkedInst->getOperand(I);
|
||||
UnlinkedInst->setOperand(I, nullptr);
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Op);
|
||||
}
|
||||
delete UnlinkedInst;
|
||||
}
|
||||
bool Ret = !UnlinkedInstructions.empty();
|
||||
UnlinkedInstructions.clear();
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt < %s -slsr -gvn -dce -S | FileCheck %s
|
||||
; RUN: opt < %s -slsr -gvn -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt < %s -slsr -gvn -dce -S | FileCheck %s
|
||||
; RUN: opt < %s -slsr -gvn -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt < %s -slsr -gvn -dce -S | FileCheck %s
|
||||
; RUN: opt < %s -slsr -gvn -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt < %s -slsr -gvn -dce -S | FileCheck %s
|
||||
; RUN: opt < %s -slsr -gvn -S | FileCheck %s
|
||||
|
||||
target datalayout = "e-i64:64-v16:16-v32:32-n16:32:64"
|
||||
|
||||
|
|
Loading…
Reference in New Issue