forked from OSchip/llvm-project
SimplifyInstruction does not imply DCE
We cannot remove an instruction with no uses just because SimplifyInstruction succeeds. It may have side effects. llvm-svn: 273711
This commit is contained in:
parent
f15064871a
commit
3b3e954ea2
|
@ -582,11 +582,18 @@ bool EarlyCSE::processNode(DomTreeNode *Node) {
|
|||
// its simpler value.
|
||||
if (Value *V = SimplifyInstruction(Inst, DL, &TLI, &DT, &AC)) {
|
||||
DEBUG(dbgs() << "EarlyCSE Simplify: " << *Inst << " to: " << *V << '\n');
|
||||
Inst->replaceAllUsesWith(V);
|
||||
Inst->eraseFromParent();
|
||||
Changed = true;
|
||||
++NumSimplify;
|
||||
continue;
|
||||
if (!Inst->use_empty()) {
|
||||
Inst->replaceAllUsesWith(V);
|
||||
Changed = true;
|
||||
}
|
||||
if (isInstructionTriviallyDead(Inst, &TLI)) {
|
||||
Inst->eraseFromParent();
|
||||
Changed = true;
|
||||
}
|
||||
if (Changed) {
|
||||
++NumSimplify;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// If this is a simple instruction that we can value number, process it.
|
||||
|
|
|
@ -2056,12 +2056,21 @@ bool GVN::processInstruction(Instruction *I) {
|
|||
// "%z = and i32 %x, %y" becomes "%z = and i32 %x, %x" which we now simplify.
|
||||
const DataLayout &DL = I->getModule()->getDataLayout();
|
||||
if (Value *V = SimplifyInstruction(I, DL, TLI, DT, AC)) {
|
||||
I->replaceAllUsesWith(V);
|
||||
if (MD && V->getType()->getScalarType()->isPointerTy())
|
||||
MD->invalidateCachedPointerInfo(V);
|
||||
markInstructionForDeletion(I);
|
||||
++NumGVNSimpl;
|
||||
return true;
|
||||
bool Changed = false;
|
||||
if (!I->use_empty()) {
|
||||
I->replaceAllUsesWith(V);
|
||||
Changed = true;
|
||||
}
|
||||
if (isInstructionTriviallyDead(I, TLI)) {
|
||||
markInstructionForDeletion(I);
|
||||
Changed = true;
|
||||
}
|
||||
if (Changed) {
|
||||
if (MD && V->getType()->getScalarType()->isPointerTy())
|
||||
MD->invalidateCachedPointerInfo(V);
|
||||
++NumGVNSimpl;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (IntrinsicInst *IntrinsicI = dyn_cast<IntrinsicInst>(I))
|
||||
|
|
|
@ -1746,13 +1746,18 @@ bool JumpThreadingPass::DuplicateCondBranchOnPHIIntoPred(
|
|||
// phi translation.
|
||||
if (Value *IV =
|
||||
SimplifyInstruction(New, BB->getModule()->getDataLayout())) {
|
||||
delete New;
|
||||
ValueMapping[&*BI] = IV;
|
||||
if (!New->mayHaveSideEffects()) {
|
||||
delete New;
|
||||
New = nullptr;
|
||||
}
|
||||
} else {
|
||||
ValueMapping[&*BI] = New;
|
||||
}
|
||||
if (New) {
|
||||
// Otherwise, insert the new instruction into the block.
|
||||
New->setName(BI->getName());
|
||||
PredBB->getInstList().insert(OldPredBranch->getIterator(), New);
|
||||
ValueMapping[&*BI] = New;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -312,13 +312,18 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
|
|||
if (V && LI->replacementPreservesLCSSAForm(C, V)) {
|
||||
// If so, then delete the temporary instruction and stick the folded value
|
||||
// in the map.
|
||||
delete C;
|
||||
ValueMap[Inst] = V;
|
||||
if (!C->mayHaveSideEffects()) {
|
||||
delete C;
|
||||
C = nullptr;
|
||||
}
|
||||
} else {
|
||||
ValueMap[Inst] = C;
|
||||
}
|
||||
if (C) {
|
||||
// Otherwise, stick the new instruction into the new block!
|
||||
C->setName(Inst->getName());
|
||||
C->insertBefore(LoopEntryBranch);
|
||||
ValueMap[Inst] = C;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -279,6 +279,7 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,
|
|||
II != IE; ++II) {
|
||||
|
||||
Instruction *NewInst = II->clone();
|
||||
VMap[&*II] = NewInst; // Add instruction map to value.
|
||||
|
||||
// Eagerly remap operands to the newly cloned instruction, except for PHI
|
||||
// nodes for which we defer processing until we update the CFG.
|
||||
|
@ -297,14 +298,15 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,
|
|||
V = MappedV;
|
||||
|
||||
VMap[&*II] = V;
|
||||
delete NewInst;
|
||||
continue;
|
||||
if (!NewInst->mayHaveSideEffects()) {
|
||||
delete NewInst;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (II->hasName())
|
||||
NewInst->setName(II->getName()+NameSuffix);
|
||||
VMap[&*II] = NewInst; // Add instruction map to value.
|
||||
NewBB->getInstList().push_back(NewInst);
|
||||
hasCalls |= (isa<CallInst>(II) && !isa<DbgInfoIntrinsic>(II));
|
||||
|
||||
|
|
|
@ -456,14 +456,23 @@ simplifyAndDCEInstruction(Instruction *I,
|
|||
if (Value *SimpleV = SimplifyInstruction(I, DL)) {
|
||||
// Add the users to the worklist. CAREFUL: an instruction can use itself,
|
||||
// in the case of a phi node.
|
||||
for (User *U : I->users())
|
||||
if (U != I)
|
||||
for (User *U : I->users()) {
|
||||
if (U != I) {
|
||||
WorkList.insert(cast<Instruction>(U));
|
||||
}
|
||||
}
|
||||
|
||||
// Replace the instruction with its simplified value.
|
||||
I->replaceAllUsesWith(SimpleV);
|
||||
I->eraseFromParent();
|
||||
return true;
|
||||
bool Changed = false;
|
||||
if (!I->use_empty()) {
|
||||
I->replaceAllUsesWith(SimpleV);
|
||||
Changed = true;
|
||||
}
|
||||
if (isInstructionTriviallyDead(I, TLI)) {
|
||||
I->eraseFromParent();
|
||||
Changed = true;
|
||||
}
|
||||
return Changed;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -623,18 +623,17 @@ bool llvm::UnrollLoop(Loop *L, unsigned Count, unsigned TripCount, bool Force,
|
|||
// go.
|
||||
const DataLayout &DL = Header->getModule()->getDataLayout();
|
||||
const std::vector<BasicBlock*> &NewLoopBlocks = L->getBlocks();
|
||||
for (BasicBlock *BB : NewLoopBlocks)
|
||||
for (BasicBlock *BB : NewLoopBlocks) {
|
||||
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) {
|
||||
Instruction *Inst = &*I++;
|
||||
|
||||
if (Value *V = SimplifyInstruction(Inst, DL))
|
||||
if (LI->replacementPreservesLCSSAForm(Inst, V))
|
||||
Inst->replaceAllUsesWith(V);
|
||||
if (isInstructionTriviallyDead(Inst))
|
||||
BB->getInstList().erase(Inst);
|
||||
else if (Value *V = SimplifyInstruction(Inst, DL))
|
||||
if (LI->replacementPreservesLCSSAForm(Inst, V)) {
|
||||
Inst->replaceAllUsesWith(V);
|
||||
BB->getInstList().erase(Inst);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NumCompletelyUnrolled += CompletelyUnroll;
|
||||
++NumUnrolled;
|
||||
|
|
|
@ -1885,14 +1885,19 @@ static bool FoldCondBranchOnPHI(BranchInst *BI, const DataLayout &DL) {
|
|||
|
||||
// Check for trivial simplification.
|
||||
if (Value *V = SimplifyInstruction(N, DL)) {
|
||||
TranslateMap[&*BBI] = V;
|
||||
delete N; // Instruction folded away, don't need actual inst
|
||||
if (!BBI->use_empty())
|
||||
TranslateMap[&*BBI] = V;
|
||||
if (!N->mayHaveSideEffects()) {
|
||||
delete N; // Instruction folded away, don't need actual inst
|
||||
N = nullptr;
|
||||
}
|
||||
} else {
|
||||
// Insert the new instruction into its new home.
|
||||
EdgeBB->getInstList().insert(InsertPt, N);
|
||||
if (!BBI->use_empty())
|
||||
TranslateMap[&*BBI] = N;
|
||||
}
|
||||
// Insert the new instruction into its new home.
|
||||
if (N)
|
||||
EdgeBB->getInstList().insert(InsertPt, N);
|
||||
}
|
||||
|
||||
// Loop over all of the edges from PredBB to BB, changing them to branch
|
||||
|
|
|
@ -152,6 +152,16 @@ exit:
|
|||
ret i32 %add
|
||||
}
|
||||
|
||||
define i32 @test9(i32* %V) {
|
||||
entry:
|
||||
%load = load volatile i32, i32* %V, !range !0
|
||||
ret i32 %load
|
||||
}
|
||||
; CHECK-LABEL: test9
|
||||
; CHECK: load volatile
|
||||
; CHECK: ret i32 0
|
||||
|
||||
declare void @use(i32) readonly
|
||||
declare void @clobber(i32* %p, i32* %q)
|
||||
|
||||
!0 = !{ i32 0, i32 1 }
|
||||
|
|
Loading…
Reference in New Issue