mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-02 00:37:09 +00:00
Free instructions kill values too. This implements DeadStoreElim/free.llx
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15199 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ec6e46ad8
commit
a9e2f3d0ab
@ -79,7 +79,8 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!isa<StoreInst>(I) || cast<StoreInst>(I)->isVolatile()) {
|
||||
if (!isa<FreeInst>(I) &&
|
||||
(!isa<StoreInst>(I) || cast<StoreInst>(I)->isVolatile())) {
|
||||
// If this is a non-store instruction, it makes everything referenced no
|
||||
// longer killed. Remove anything aliased from the alias set tracker.
|
||||
KillLocs.remove(I);
|
||||
@ -90,8 +91,16 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
||||
// the stored location is already in the tracker, then this is a dead
|
||||
// store. We can just delete it here, but while we're at it, we also
|
||||
// delete any trivially dead expression chains.
|
||||
unsigned ValSize = TD.getTypeSize(I->getOperand(0)->getType());
|
||||
Value *Ptr = I->getOperand(1);
|
||||
unsigned ValSize;
|
||||
Value *Ptr;
|
||||
if (isa<StoreInst>(I)) {
|
||||
Ptr = I->getOperand(1);
|
||||
ValSize = TD.getTypeSize(I->getOperand(0)->getType());
|
||||
} else {
|
||||
Ptr = I->getOperand(0);
|
||||
ValSize = ~0;
|
||||
}
|
||||
|
||||
if (AliasSet *AS = KillLocs.getAliasSetForPointerIfExists(Ptr, ValSize))
|
||||
for (AliasSet::iterator ASI = AS->begin(), E = AS->end(); ASI != E; ++ASI)
|
||||
if (AA.alias(ASI.getPointer(), ASI.getSize(), Ptr, ValSize)
|
||||
@ -110,7 +119,7 @@ bool DSE::runOnBasicBlock(BasicBlock &BB) {
|
||||
|
||||
// Otherwise, this is a non-dead store just add it to the set of dead
|
||||
// locations.
|
||||
KillLocs.add(cast<StoreInst>(I));
|
||||
KillLocs.add(I);
|
||||
BigContinue:;
|
||||
}
|
||||
return MadeChange;
|
||||
|
Loading…
Reference in New Issue
Block a user