Chromium Code Reviews| Index: src/IceCfgNode.cpp |
| diff --git a/src/IceCfgNode.cpp b/src/IceCfgNode.cpp |
| index a87642d14c78a72370a6cd4393dfd8c3bc3141a0..059fef9066148401a1685117d35edd740e6c5d52 100644 |
| --- a/src/IceCfgNode.cpp |
| +++ b/src/IceCfgNode.cpp |
| @@ -37,10 +37,22 @@ 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 (auto *Br = llvm::dyn_cast<InstBr>(Instr)) { |
|
Jim Stichnoth
2016/04/04 21:26:51
You may also want to do the same for switch instru
Eric Holk
2016/04/04 22:23:22
Done.
|
| + if (auto *N = Br->getTargetTrue()) { |
| + N->addInEdge(this); |
| + addOutEdge(N); |
| + } |
| + if (auto *N = Br->getTargetFalse()) { |
| + 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 +93,8 @@ void CfgNode::computePredecessors() { |
| } |
| void CfgNode::computeSuccessors() { |
| + OutEdges.clear(); |
| + InEdges.clear(); |
| OutEdges = Insts.rbegin()->getTerminatorEdges(); |
| } |
| @@ -882,7 +896,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; |