mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
LICM does get dead instructions input to it. Instead of sinking them
out of loops, just delete them. llvm-svn: 112451
This commit is contained in:
parent
aac9263929
commit
51639dea34
@ -43,6 +43,7 @@
|
|||||||
#include "llvm/Analysis/AliasSetTracker.h"
|
#include "llvm/Analysis/AliasSetTracker.h"
|
||||||
#include "llvm/Analysis/Dominators.h"
|
#include "llvm/Analysis/Dominators.h"
|
||||||
#include "llvm/Analysis/ScalarEvolution.h"
|
#include "llvm/Analysis/ScalarEvolution.h"
|
||||||
|
#include "llvm/Transforms/Utils/Local.h"
|
||||||
#include "llvm/Transforms/Utils/SSAUpdater.h"
|
#include "llvm/Transforms/Utils/SSAUpdater.h"
|
||||||
#include "llvm/Support/CFG.h"
|
#include "llvm/Support/CFG.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
@ -299,7 +300,7 @@ void LICM::SinkRegion(DomTreeNode *N) {
|
|||||||
// If this subregion is not in the top level loop at all, exit.
|
// If this subregion is not in the top level loop at all, exit.
|
||||||
if (!CurLoop->contains(BB)) return;
|
if (!CurLoop->contains(BB)) return;
|
||||||
|
|
||||||
// We are processing blocks in reverse dfo, so process children first...
|
// We are processing blocks in reverse dfo, so process children first.
|
||||||
const std::vector<DomTreeNode*> &Children = N->getChildren();
|
const std::vector<DomTreeNode*> &Children = N->getChildren();
|
||||||
for (unsigned i = 0, e = Children.size(); i != e; ++i)
|
for (unsigned i = 0, e = Children.size(); i != e; ++i)
|
||||||
SinkRegion(Children[i]);
|
SinkRegion(Children[i]);
|
||||||
@ -310,6 +311,16 @@ void LICM::SinkRegion(DomTreeNode *N) {
|
|||||||
|
|
||||||
for (BasicBlock::iterator II = BB->end(); II != BB->begin(); ) {
|
for (BasicBlock::iterator II = BB->end(); II != BB->begin(); ) {
|
||||||
Instruction &I = *--II;
|
Instruction &I = *--II;
|
||||||
|
|
||||||
|
// If the instruction is dead, we would try to sink it because it isn't used
|
||||||
|
// in the loop, instead, just delete it.
|
||||||
|
if (isInstructionTriviallyDead(&I)) {
|
||||||
|
++II;
|
||||||
|
CurAST->deleteValue(&I);
|
||||||
|
I.eraseFromParent();
|
||||||
|
Changed = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// Check to see if we can sink this instruction to the exit blocks
|
// Check to see if we can sink this instruction to the exit blocks
|
||||||
// of the loop. We can do this if the all users of the instruction are
|
// of the loop. We can do this if the all users of the instruction are
|
||||||
|
@ -233,3 +233,17 @@ Out: ; preds = %Loop
|
|||||||
; CHECK-NEXT: ret i32 %tmp.6
|
; CHECK-NEXT: ret i32 %tmp.6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Should delete, not sink, dead instructions.
|
||||||
|
define void @test11() {
|
||||||
|
br label %Loop
|
||||||
|
Loop:
|
||||||
|
%dead = getelementptr %Ty* @X2, i64 0, i32 0
|
||||||
|
br i1 false, label %Loop, label %Out
|
||||||
|
Out:
|
||||||
|
ret void
|
||||||
|
; CHECK: @test11
|
||||||
|
; CHECK: Out:
|
||||||
|
; CHECK-NEXT: ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user