mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 843518: IonMonkey: Run alias analysis when UCE removes dependency of an instruction, r=nmatsakis
This commit is contained in:
parent
25122a53f6
commit
407104ef88
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#include "UnreachableCodeElimination.h"
|
#include "UnreachableCodeElimination.h"
|
||||||
#include "IonAnalysis.h"
|
#include "IonAnalysis.h"
|
||||||
|
#include "AliasAnalysis.h"
|
||||||
|
|
||||||
using namespace js;
|
using namespace js;
|
||||||
using namespace ion;
|
using namespace ion;
|
||||||
@ -70,6 +71,13 @@ UnreachableCodeElimination::removeUnmarkedBlocksAndCleanup()
|
|||||||
if (redundantPhis_ && !EliminatePhis(mir_, graph_, ConservativeObservability))
|
if (redundantPhis_ && !EliminatePhis(mir_, graph_, ConservativeObservability))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// Pass 4: Rerun alias analysis
|
||||||
|
if (rerunAliasAnalysis_) {
|
||||||
|
AliasAnalysis analysis(mir_, graph_);
|
||||||
|
if (!analysis.analyze())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,8 +136,13 @@ UnreachableCodeElimination::prunePointlessBranchesAndMarkReachableBlocks()
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
UnreachableCodeElimination::removeUsesFromUnmarkedBlocks(MDefinition *instr)
|
UnreachableCodeElimination::checkDependencyAndRemoveUsesFromUnmarkedBlocks(MDefinition *instr)
|
||||||
{
|
{
|
||||||
|
// When the instruction depends on removed block,
|
||||||
|
// alias analysis needs to get rerun to have the right dependency.
|
||||||
|
if (instr->dependency() && !instr->dependency()->block()->isMarked())
|
||||||
|
rerunAliasAnalysis_ = true;
|
||||||
|
|
||||||
for (MUseIterator iter(instr->usesBegin()); iter != instr->usesEnd(); ) {
|
for (MUseIterator iter(instr->usesBegin()); iter != instr->usesEnd(); ) {
|
||||||
if (!iter->consumer()->block()->isMarked())
|
if (!iter->consumer()->block()->isMarked())
|
||||||
iter = instr->removeUse(iter);
|
iter = instr->removeUse(iter);
|
||||||
@ -161,9 +174,9 @@ UnreachableCodeElimination::removeUnmarkedBlocksAndClearDominators()
|
|||||||
if (block->isMarked()) {
|
if (block->isMarked()) {
|
||||||
block->setId(--id);
|
block->setId(--id);
|
||||||
for (MPhiIterator iter(block->phisBegin()); iter != block->phisEnd(); iter++)
|
for (MPhiIterator iter(block->phisBegin()); iter != block->phisEnd(); iter++)
|
||||||
removeUsesFromUnmarkedBlocks(*iter);
|
checkDependencyAndRemoveUsesFromUnmarkedBlocks(*iter);
|
||||||
for (MInstructionIterator iter(block->begin()); iter != block->end(); iter++)
|
for (MInstructionIterator iter(block->begin()); iter != block->end(); iter++)
|
||||||
removeUsesFromUnmarkedBlocks(*iter);
|
checkDependencyAndRemoveUsesFromUnmarkedBlocks(*iter);
|
||||||
} else {
|
} else {
|
||||||
if (block->numPredecessors() > 1) {
|
if (block->numPredecessors() > 1) {
|
||||||
// If this block had phis, then any reachable
|
// If this block had phis, then any reachable
|
||||||
|
@ -22,9 +22,10 @@ class UnreachableCodeElimination
|
|||||||
MIRGraph &graph_;
|
MIRGraph &graph_;
|
||||||
uint32_t marked_;
|
uint32_t marked_;
|
||||||
bool redundantPhis_;
|
bool redundantPhis_;
|
||||||
|
bool rerunAliasAnalysis_;
|
||||||
|
|
||||||
bool prunePointlessBranchesAndMarkReachableBlocks();
|
bool prunePointlessBranchesAndMarkReachableBlocks();
|
||||||
void removeUsesFromUnmarkedBlocks(MDefinition *instr);
|
void checkDependencyAndRemoveUsesFromUnmarkedBlocks(MDefinition *instr);
|
||||||
bool removeUnmarkedBlocksAndClearDominators();
|
bool removeUnmarkedBlocksAndClearDominators();
|
||||||
bool removeUnmarkedBlocksAndCleanup();
|
bool removeUnmarkedBlocksAndCleanup();
|
||||||
|
|
||||||
@ -33,7 +34,8 @@ class UnreachableCodeElimination
|
|||||||
: mir_(mir),
|
: mir_(mir),
|
||||||
graph_(graph),
|
graph_(graph),
|
||||||
marked_(0),
|
marked_(0),
|
||||||
redundantPhis_(false)
|
redundantPhis_(false),
|
||||||
|
rerunAliasAnalysis_(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// Walks the graph and discovers what is reachable. Removes everything else.
|
// Walks the graph and discovers what is reachable. Removes everything else.
|
||||||
|
Loading…
Reference in New Issue
Block a user