Chromium Code Reviews| Index: src/IceCfgNode.cpp |
| diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp |
| index a87642d14c78a72370a6cd4393dfd8c3bc3141a0..512ef928ef1a5d5467136d945ec1316c4b8b8407 100644 |
| --- a/src/IceCfgNode.cpp |
| +++ b/src/IceCfgNode.cpp |
| @@ -37,10 +37,20 @@ CfgNode::CfgNode(Cfg *Func, SizeT Number) : Func(Func), Number(Number) { |
| // Adds an instruction to either the Phi list or the regular instruction list. |
| // Validates that all Phis are added before all regular instructions. |
| -void CfgNode::appendInst(Inst *Instr) { |
| +void CfgNode::appendInst(Inst *Instr, bool AllowPhisAnywhere) { |
| ++InstCountEstimate; |
| + |
| + if (BuildDefs::wasm()) { |
| + if (Instr->getKind() == Inst::Switch || Instr->getKind() == Inst::Br) { |
|
Jim Stichnoth
2016/04/04 23:08:20
I think it would be more "standard" for the code b
Eric Holk
2016/04/04 23:16:07
Done.
|
| + for (auto *N : Instr->getTerminatorEdges()) { |
| + N->addInEdge(this); |
| + addOutEdge(N); |
| + } |
| + } |
| + } |
| + |
| if (auto *Phi = llvm::dyn_cast<InstPhi>(Instr)) { |
| - if (!Insts.empty()) { |
| + if (!AllowPhisAnywhere && !Insts.empty()) { |
| Func->setError("Phi instruction added to the middle of a block"); |
| return; |
| } |
| @@ -81,6 +91,8 @@ void CfgNode::computePredecessors() { |
| } |
| void CfgNode::computeSuccessors() { |
| + OutEdges.clear(); |
| + InEdges.clear(); |
| OutEdges = Insts.rbegin()->getTerminatorEdges(); |
| } |
| @@ -882,7 +894,7 @@ void CfgNode::contractIfEmpty() { |
| // Make sure there is actually a successor to repoint in-edges to. |
| if (OutEdges.empty()) |
| return; |
| - assert(OutEdges.size() == 1); |
| + assert(hasSingleOutEdge()); |
| // Don't try to delete a self-loop. |
| if (OutEdges[0] == this) |
| return; |