зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1331354
- IonMonkey: Use CopyWithNewTargets for more cases during CFG creation, r=nbp
This commit is contained in:
Родитель
306b562439
Коммит
a9848ce225
|
@ -101,19 +101,18 @@ ControlFlowGraph::init(TempAllocator& alloc, const CFGBlockVector& blocks)
|
||||||
switch (ins->type()) {
|
switch (ins->type()) {
|
||||||
case CFGControlInstruction::Type_Goto: {
|
case CFGControlInstruction::Type_Goto: {
|
||||||
CFGBlock* successor = &blocks_[ins->getSuccessor(0)->id()];
|
CFGBlock* successor = &blocks_[ins->getSuccessor(0)->id()];
|
||||||
copy = CFGGoto::New(alloc, successor, ins->toGoto()->popAmount());
|
copy = CFGGoto::CopyWithNewTargets(alloc, ins->toGoto(), successor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CFGControlInstruction::Type_BackEdge: {
|
case CFGControlInstruction::Type_BackEdge: {
|
||||||
CFGBlock* successor = &blocks_[ins->getSuccessor(0)->id()];
|
CFGBlock* successor = &blocks_[ins->getSuccessor(0)->id()];
|
||||||
copy = CFGBackEdge::New(alloc, successor);
|
copy = CFGBackEdge::CopyWithNewTargets(alloc, ins->toBackEdge(), successor);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CFGControlInstruction::Type_LoopEntry: {
|
case CFGControlInstruction::Type_LoopEntry: {
|
||||||
CFGLoopEntry* old = ins->toLoopEntry();
|
CFGLoopEntry* old = ins->toLoopEntry();
|
||||||
CFGBlock* successor = &blocks_[ins->getSuccessor(0)->id()];
|
CFGBlock* successor = &blocks_[ins->getSuccessor(0)->id()];
|
||||||
copy = CFGLoopEntry::New(alloc, successor, old->canOsr(), old->stackPhiCount(),
|
copy = CFGLoopEntry::CopyWithNewTargets(alloc, old, successor);
|
||||||
old->loopStopPc());
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CFGControlInstruction::Type_Throw: {
|
case CFGControlInstruction::Type_Throw: {
|
||||||
|
@ -124,7 +123,7 @@ ControlFlowGraph::init(TempAllocator& alloc, const CFGBlockVector& blocks)
|
||||||
CFGTest* old = ins->toTest();
|
CFGTest* old = ins->toTest();
|
||||||
CFGBlock* trueBranch = &blocks_[old->trueBranch()->id()];
|
CFGBlock* trueBranch = &blocks_[old->trueBranch()->id()];
|
||||||
CFGBlock* falseBranch = &blocks_[old->falseBranch()->id()];
|
CFGBlock* falseBranch = &blocks_[old->falseBranch()->id()];
|
||||||
copy = CFGTest::New(alloc, trueBranch, falseBranch, old->mustKeepCondition());
|
copy = CFGTest::CopyWithNewTargets(alloc, old, trueBranch, falseBranch);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CFGControlInstruction::Type_Compare: {
|
case CFGControlInstruction::Type_Compare: {
|
||||||
|
@ -148,7 +147,7 @@ ControlFlowGraph::init(TempAllocator& alloc, const CFGBlockVector& blocks)
|
||||||
CFGBlock* merge = nullptr;
|
CFGBlock* merge = nullptr;
|
||||||
if (old->numSuccessors() == 2)
|
if (old->numSuccessors() == 2)
|
||||||
merge = &blocks_[old->afterTryCatchBlock()->id()];
|
merge = &blocks_[old->afterTryCatchBlock()->id()];
|
||||||
copy = CFGTry::New(alloc, tryBlock, old->catchStartPc(), merge);
|
copy = CFGTry::CopyWithNewTargets(alloc, old, tryBlock, merge);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CFGControlInstruction::Type_TableSwitch: {
|
case CFGControlInstruction::Type_TableSwitch: {
|
||||||
|
|
|
@ -219,6 +219,12 @@ class CFGTry : public CFGControlInstruction
|
||||||
CFG_CONTROL_HEADER(Try)
|
CFG_CONTROL_HEADER(Try)
|
||||||
TRIVIAL_CFG_NEW_WRAPPERS
|
TRIVIAL_CFG_NEW_WRAPPERS
|
||||||
|
|
||||||
|
static CFGTry* CopyWithNewTargets(TempAllocator& alloc, CFGTry* old,
|
||||||
|
CFGBlock* tryBlock, CFGBlock* merge)
|
||||||
|
{
|
||||||
|
return new(alloc) CFGTry(tryBlock, old->catchStartPc(), merge);
|
||||||
|
}
|
||||||
|
|
||||||
size_t numSuccessors() const final override {
|
size_t numSuccessors() const final override {
|
||||||
return mergePoint_ ? 2 : 1;
|
return mergePoint_ ? 2 : 1;
|
||||||
}
|
}
|
||||||
|
@ -360,7 +366,6 @@ class CFGCompare : public CFGAryControlInstruction<2>
|
||||||
return new(alloc) CFGCompare(succ1, old->truePopAmount(), succ2, old->falsePopAmount());
|
return new(alloc) CFGCompare(succ1, old->truePopAmount(), succ2, old->falsePopAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CFGBlock* trueBranch() const {
|
CFGBlock* trueBranch() const {
|
||||||
return getSuccessor(0);
|
return getSuccessor(0);
|
||||||
}
|
}
|
||||||
|
@ -406,6 +411,12 @@ class CFGTest : public CFGAryControlInstruction<2>
|
||||||
CFG_CONTROL_HEADER(Test);
|
CFG_CONTROL_HEADER(Test);
|
||||||
TRIVIAL_CFG_NEW_WRAPPERS
|
TRIVIAL_CFG_NEW_WRAPPERS
|
||||||
|
|
||||||
|
static CFGTest* CopyWithNewTargets(TempAllocator& alloc, CFGTest* old,
|
||||||
|
CFGBlock* succ1, CFGBlock* succ2)
|
||||||
|
{
|
||||||
|
return new(alloc) CFGTest(succ1, succ2, old->mustKeepCondition());
|
||||||
|
}
|
||||||
|
|
||||||
CFGBlock* trueBranch() const {
|
CFGBlock* trueBranch() const {
|
||||||
return getSuccessor(0);
|
return getSuccessor(0);
|
||||||
}
|
}
|
||||||
|
@ -483,7 +494,7 @@ class CFGUnaryControlInstruction : public CFGAryControlInstruction<1>
|
||||||
*/
|
*/
|
||||||
class CFGGoto : public CFGUnaryControlInstruction
|
class CFGGoto : public CFGUnaryControlInstruction
|
||||||
{
|
{
|
||||||
size_t popAmount_;
|
const size_t popAmount_;
|
||||||
|
|
||||||
explicit CFGGoto(CFGBlock* block)
|
explicit CFGGoto(CFGBlock* block)
|
||||||
: CFGUnaryControlInstruction(block),
|
: CFGUnaryControlInstruction(block),
|
||||||
|
@ -499,6 +510,11 @@ class CFGGoto : public CFGUnaryControlInstruction
|
||||||
CFG_CONTROL_HEADER(Goto);
|
CFG_CONTROL_HEADER(Goto);
|
||||||
TRIVIAL_CFG_NEW_WRAPPERS
|
TRIVIAL_CFG_NEW_WRAPPERS
|
||||||
|
|
||||||
|
static CFGGoto* CopyWithNewTargets(TempAllocator& alloc, CFGGoto* old, CFGBlock* block)
|
||||||
|
{
|
||||||
|
return new(alloc) CFGGoto(block, old->popAmount());
|
||||||
|
}
|
||||||
|
|
||||||
size_t popAmount() const {
|
size_t popAmount() const {
|
||||||
return popAmount_;
|
return popAmount_;
|
||||||
}
|
}
|
||||||
|
@ -521,6 +537,11 @@ class CFGBackEdge : public CFGUnaryControlInstruction
|
||||||
public:
|
public:
|
||||||
CFG_CONTROL_HEADER(BackEdge);
|
CFG_CONTROL_HEADER(BackEdge);
|
||||||
TRIVIAL_CFG_NEW_WRAPPERS
|
TRIVIAL_CFG_NEW_WRAPPERS
|
||||||
|
|
||||||
|
static CFGBackEdge* CopyWithNewTargets(TempAllocator& alloc, CFGBackEdge* old, CFGBlock* block)
|
||||||
|
{
|
||||||
|
return new(alloc) CFGBackEdge(block);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -556,6 +577,13 @@ class CFGLoopEntry : public CFGUnaryControlInstruction
|
||||||
CFG_CONTROL_HEADER(LoopEntry);
|
CFG_CONTROL_HEADER(LoopEntry);
|
||||||
TRIVIAL_CFG_NEW_WRAPPERS
|
TRIVIAL_CFG_NEW_WRAPPERS
|
||||||
|
|
||||||
|
static CFGLoopEntry* CopyWithNewTargets(TempAllocator& alloc, CFGLoopEntry* old,
|
||||||
|
CFGBlock* loopEntry)
|
||||||
|
{
|
||||||
|
return new(alloc) CFGLoopEntry(loopEntry, old->canOsr(), old->stackPhiCount(),
|
||||||
|
old->loopStopPc());
|
||||||
|
}
|
||||||
|
|
||||||
void setCanOsr() {
|
void setCanOsr() {
|
||||||
canOsr_ = true;
|
canOsr_ = true;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче