4747#include " llvm/Transforms/Utils/BasicBlockUtils.h"
4848#include " llvm/Transforms/Utils/Local.h"
4949#include " llvm/Transforms/Utils/SSAUpdater.h"
50+ #include " llvm/Transforms/Utils/SSAUpdaterBulk.h"
5051#include < cassert>
5152#include < utility>
5253
@@ -317,7 +318,7 @@ class StructurizeCFG {
317318
318319 void collectInfos ();
319320
320- void insertConditions (bool Loops);
321+ void insertConditions (bool Loops, SSAUpdaterBulk &PhiInserter );
321322
322323 void simplifyConditions ();
323324
@@ -600,10 +601,9 @@ void StructurizeCFG::collectInfos() {
600601}
601602
602603// / Insert the missing branch conditions
603- void StructurizeCFG::insertConditions (bool Loops) {
604+ void StructurizeCFG::insertConditions (bool Loops, SSAUpdaterBulk &PhiInserter ) {
604605 BranchVector &Conds = Loops ? LoopConds : Conditions;
605606 Value *Default = Loops ? BoolTrue : BoolFalse;
606- SSAUpdater PhiInserter;
607607
608608 for (BranchInst *Term : Conds) {
609609 assert (Term->isConditional ());
@@ -619,22 +619,23 @@ void StructurizeCFG::insertConditions(bool Loops) {
619619 Term->setCondition (PI.Pred );
620620 CondBranchWeights::setMetadata (*Term, PI.Weights );
621621 } else {
622- PhiInserter.Initialize (Boolean, " " );
623- PhiInserter.AddAvailableValue (Loops ? SuccFalse : Parent, Default);
622+ unsigned Variable = PhiInserter.AddVariable (" " , Boolean);
623+ PhiInserter.AddAvailableValue (Variable, Loops ? SuccFalse : Parent,
624+ Default);
624625
625626 NearestCommonDominator Dominator (DT);
626627 Dominator.addBlock (Parent);
627628
628629 for (auto [BB, PI] : Preds) {
629630 assert (BB != Parent);
630- PhiInserter.AddAvailableValue (BB, PI.Pred );
631+ PhiInserter.AddAvailableValue (Variable, BB, PI.Pred );
631632 Dominator.addAndRememberBlock (BB);
632633 }
633634
634635 if (!Dominator.resultIsRememberedBlock ())
635- PhiInserter.AddAvailableValue (Dominator.result (), Default);
636+ PhiInserter.AddAvailableValue (Variable, Dominator.result (), Default);
636637
637- Term->setCondition (PhiInserter. GetValueInMiddleOfBlock (Parent ));
638+ PhiInserter. AddUse (Variable, & Term->getOperandUse ( 0 ));
638639 }
639640 }
640641}
@@ -1321,8 +1322,12 @@ bool StructurizeCFG::run(Region *R, DominatorTree *DT) {
13211322 orderNodes ();
13221323 collectInfos ();
13231324 createFlow ();
1324- insertConditions (false );
1325- insertConditions (true );
1325+
1326+ SSAUpdaterBulk PhiInserter;
1327+ insertConditions (false , PhiInserter);
1328+ insertConditions (true , PhiInserter);
1329+ PhiInserter.RewriteAllUses (DT);
1330+
13261331 setPhiValues ();
13271332 simplifyConditions ();
13281333 simplifyAffectedPhis ();
0 commit comments