1 //===- StructurizeCFG.cpp -------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ADT/DenseMap.h"
10 #include "llvm/ADT/MapVector.h"
11 #include "llvm/ADT/PostOrderIterator.h"
12 #include "llvm/ADT/STLExtras.h"
13 #include "llvm/ADT/SmallPtrSet.h"
14 #include "llvm/ADT/SmallVector.h"
15 #include "llvm/Analysis/InstructionSimplify.h"
16 #include "llvm/Analysis/LegacyDivergenceAnalysis.h"
17 #include "llvm/Analysis/LoopInfo.h"
18 #include "llvm/Analysis/RegionInfo.h"
19 #include "llvm/Analysis/RegionIterator.h"
20 #include "llvm/Analysis/RegionPass.h"
21 #include "llvm/IR/Argument.h"
22 #include "llvm/IR/BasicBlock.h"
23 #include "llvm/IR/CFG.h"
24 #include "llvm/IR/Constant.h"
25 #include "llvm/IR/Constants.h"
26 #include "llvm/IR/Dominators.h"
27 #include "llvm/IR/Function.h"
28 #include "llvm/IR/InstrTypes.h"
29 #include "llvm/IR/Instruction.h"
30 #include "llvm/IR/Instructions.h"
31 #include "llvm/IR/Metadata.h"
32 #include "llvm/IR/PatternMatch.h"
33 #include "llvm/IR/Type.h"
34 #include "llvm/IR/Use.h"
35 #include "llvm/IR/User.h"
36 #include "llvm/IR/Value.h"
37 #include "llvm/InitializePasses.h"
38 #include "llvm/Pass.h"
39 #include "llvm/Support/Casting.h"
40 #include "llvm/Support/CommandLine.h"
41 #include "llvm/Support/Debug.h"
42 #include "llvm/Support/ErrorHandling.h"
43 #include "llvm/Support/raw_ostream.h"
44 #include "llvm/Transforms/Scalar.h"
45 #include "llvm/Transforms/Utils.h"
46 #include "llvm/Transforms/Utils/SSAUpdater.h"
47 #include <algorithm>
48 #include <cassert>
49 #include <utility>
50 
51 using namespace llvm;
52 using namespace llvm::PatternMatch;
53 
54 #define DEBUG_TYPE "structurizecfg"
55 
56 // The name for newly created blocks.
57 static const char *const FlowBlockName = "Flow";
58 
59 namespace {
60 
61 static cl::opt<bool> ForceSkipUniformRegions(
62   "structurizecfg-skip-uniform-regions",
63   cl::Hidden,
64   cl::desc("Force whether the StructurizeCFG pass skips uniform regions"),
65   cl::init(false));
66 
67 static cl::opt<bool>
68     RelaxedUniformRegions("structurizecfg-relaxed-uniform-regions", cl::Hidden,
69                           cl::desc("Allow relaxed uniform region checks"),
70                           cl::init(true));
71 
72 // Definition of the complex types used in this pass.
73 
74 using BBValuePair = std::pair<BasicBlock *, Value *>;
75 
76 using RNVector = SmallVector<RegionNode *, 8>;
77 using BBVector = SmallVector<BasicBlock *, 8>;
78 using BranchVector = SmallVector<BranchInst *, 8>;
79 using BBValueVector = SmallVector<BBValuePair, 2>;
80 
81 using BBSet = SmallPtrSet<BasicBlock *, 8>;
82 
83 using PhiMap = MapVector<PHINode *, BBValueVector>;
84 using BB2BBVecMap = MapVector<BasicBlock *, BBVector>;
85 
86 using BBPhiMap = DenseMap<BasicBlock *, PhiMap>;
87 using BBPredicates = DenseMap<BasicBlock *, Value *>;
88 using PredMap = DenseMap<BasicBlock *, BBPredicates>;
89 using BB2BBMap = DenseMap<BasicBlock *, BasicBlock *>;
90 
91 /// Finds the nearest common dominator of a set of BasicBlocks.
92 ///
93 /// For every BB you add to the set, you can specify whether we "remember" the
94 /// block.  When you get the common dominator, you can also ask whether it's one
95 /// of the blocks we remembered.
96 class NearestCommonDominator {
97   DominatorTree *DT;
98   BasicBlock *Result = nullptr;
99   bool ResultIsRemembered = false;
100 
101   /// Add BB to the resulting dominator.
102   void addBlock(BasicBlock *BB, bool Remember) {
103     if (!Result) {
104       Result = BB;
105       ResultIsRemembered = Remember;
106       return;
107     }
108 
109     BasicBlock *NewResult = DT->findNearestCommonDominator(Result, BB);
110     if (NewResult != Result)
111       ResultIsRemembered = false;
112     if (NewResult == BB)
113       ResultIsRemembered |= Remember;
114     Result = NewResult;
115   }
116 
117 public:
118   explicit NearestCommonDominator(DominatorTree *DomTree) : DT(DomTree) {}
119 
120   void addBlock(BasicBlock *BB) {
121     addBlock(BB, /* Remember = */ false);
122   }
123 
124   void addAndRememberBlock(BasicBlock *BB) {
125     addBlock(BB, /* Remember = */ true);
126   }
127 
128   /// Get the nearest common dominator of all the BBs added via addBlock() and
129   /// addAndRememberBlock().
130   BasicBlock *result() { return Result; }
131 
132   /// Is the BB returned by getResult() one of the blocks we added to the set
133   /// with addAndRememberBlock()?
134   bool resultIsRememberedBlock() { return ResultIsRemembered; }
135 };
136 
137 /// Transforms the control flow graph on one single entry/exit region
138 /// at a time.
139 ///
140 /// After the transform all "If"/"Then"/"Else" style control flow looks like
141 /// this:
142 ///
143 /// \verbatim
144 /// 1
145 /// ||
146 /// | |
147 /// 2 |
148 /// | /
149 /// |/
150 /// 3
151 /// ||   Where:
152 /// | |  1 = "If" block, calculates the condition
153 /// 4 |  2 = "Then" subregion, runs if the condition is true
154 /// | /  3 = "Flow" blocks, newly inserted flow blocks, rejoins the flow
155 /// |/   4 = "Else" optional subregion, runs if the condition is false
156 /// 5    5 = "End" block, also rejoins the control flow
157 /// \endverbatim
158 ///
159 /// Control flow is expressed as a branch where the true exit goes into the
160 /// "Then"/"Else" region, while the false exit skips the region
161 /// The condition for the optional "Else" region is expressed as a PHI node.
162 /// The incoming values of the PHI node are true for the "If" edge and false
163 /// for the "Then" edge.
164 ///
165 /// Additionally to that even complicated loops look like this:
166 ///
167 /// \verbatim
168 /// 1
169 /// ||
170 /// | |
171 /// 2 ^  Where:
172 /// | /  1 = "Entry" block
173 /// |/   2 = "Loop" optional subregion, with all exits at "Flow" block
174 /// 3    3 = "Flow" block, with back edge to entry block
175 /// |
176 /// \endverbatim
177 ///
178 /// The back edge of the "Flow" block is always on the false side of the branch
179 /// while the true side continues the general flow. So the loop condition
180 /// consist of a network of PHI nodes where the true incoming values expresses
181 /// breaks and the false values expresses continue states.
182 class StructurizeCFG : public RegionPass {
183   bool SkipUniformRegions;
184 
185   Type *Boolean;
186   ConstantInt *BoolTrue;
187   ConstantInt *BoolFalse;
188   UndefValue *BoolUndef;
189 
190   Function *Func;
191   Region *ParentRegion;
192 
193   LegacyDivergenceAnalysis *DA;
194   DominatorTree *DT;
195   LoopInfo *LI;
196 
197   SmallVector<RegionNode *, 8> Order;
198   BBSet Visited;
199 
200   BBPhiMap DeletedPhis;
201   BB2BBVecMap AddedPhis;
202 
203   PredMap Predicates;
204   BranchVector Conditions;
205 
206   BB2BBMap Loops;
207   PredMap LoopPreds;
208   BranchVector LoopConds;
209 
210   RegionNode *PrevNode;
211 
212   void orderNodes();
213 
214   Loop *getAdjustedLoop(RegionNode *RN);
215   unsigned getAdjustedLoopDepth(RegionNode *RN);
216 
217   void analyzeLoops(RegionNode *N);
218 
219   Value *invert(Value *Condition);
220 
221   Value *buildCondition(BranchInst *Term, unsigned Idx, bool Invert);
222 
223   void gatherPredicates(RegionNode *N);
224 
225   void collectInfos();
226 
227   void insertConditions(bool Loops);
228 
229   void delPhiValues(BasicBlock *From, BasicBlock *To);
230 
231   void addPhiValues(BasicBlock *From, BasicBlock *To);
232 
233   void setPhiValues();
234 
235   void killTerminator(BasicBlock *BB);
236 
237   void changeExit(RegionNode *Node, BasicBlock *NewExit,
238                   bool IncludeDominator);
239 
240   BasicBlock *getNextFlow(BasicBlock *Dominator);
241 
242   BasicBlock *needPrefix(bool NeedEmpty);
243 
244   BasicBlock *needPostfix(BasicBlock *Flow, bool ExitUseAllowed);
245 
246   void setPrevNode(BasicBlock *BB);
247 
248   bool dominatesPredicates(BasicBlock *BB, RegionNode *Node);
249 
250   bool isPredictableTrue(RegionNode *Node);
251 
252   void wireFlow(bool ExitUseAllowed, BasicBlock *LoopEnd);
253 
254   void handleLoops(bool ExitUseAllowed, BasicBlock *LoopEnd);
255 
256   void createFlow();
257 
258   void rebuildSSA();
259 
260 public:
261   static char ID;
262 
263   explicit StructurizeCFG(bool SkipUniformRegions_ = false)
264       : RegionPass(ID),
265         SkipUniformRegions(SkipUniformRegions_) {
266     if (ForceSkipUniformRegions.getNumOccurrences())
267       SkipUniformRegions = ForceSkipUniformRegions.getValue();
268     initializeStructurizeCFGPass(*PassRegistry::getPassRegistry());
269   }
270 
271   bool doInitialization(Region *R, RGPassManager &RGM) override;
272 
273   bool runOnRegion(Region *R, RGPassManager &RGM) override;
274 
275   StringRef getPassName() const override { return "Structurize control flow"; }
276 
277   void getAnalysisUsage(AnalysisUsage &AU) const override {
278     if (SkipUniformRegions)
279       AU.addRequired<LegacyDivergenceAnalysis>();
280     AU.addRequiredID(LowerSwitchID);
281     AU.addRequired<DominatorTreeWrapperPass>();
282     AU.addRequired<LoopInfoWrapperPass>();
283 
284     AU.addPreserved<DominatorTreeWrapperPass>();
285     RegionPass::getAnalysisUsage(AU);
286   }
287 };
288 
289 } // end anonymous namespace
290 
291 char StructurizeCFG::ID = 0;
292 
293 INITIALIZE_PASS_BEGIN(StructurizeCFG, "structurizecfg", "Structurize the CFG",
294                       false, false)
295 INITIALIZE_PASS_DEPENDENCY(LegacyDivergenceAnalysis)
296 INITIALIZE_PASS_DEPENDENCY(LowerSwitch)
297 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
298 INITIALIZE_PASS_DEPENDENCY(RegionInfoPass)
299 INITIALIZE_PASS_END(StructurizeCFG, "structurizecfg", "Structurize the CFG",
300                     false, false)
301 
302 /// Initialize the types and constants used in the pass
303 bool StructurizeCFG::doInitialization(Region *R, RGPassManager &RGM) {
304   LLVMContext &Context = R->getEntry()->getContext();
305 
306   Boolean = Type::getInt1Ty(Context);
307   BoolTrue = ConstantInt::getTrue(Context);
308   BoolFalse = ConstantInt::getFalse(Context);
309   BoolUndef = UndefValue::get(Boolean);
310 
311   return false;
312 }
313 
314 /// Use the exit block to determine the loop if RN is a SubRegion.
315 Loop *StructurizeCFG::getAdjustedLoop(RegionNode *RN) {
316   if (RN->isSubRegion()) {
317     Region *SubRegion = RN->getNodeAs<Region>();
318     return LI->getLoopFor(SubRegion->getExit());
319   }
320 
321   return LI->getLoopFor(RN->getEntry());
322 }
323 
324 /// Use the exit block to determine the loop depth if RN is a SubRegion.
325 unsigned StructurizeCFG::getAdjustedLoopDepth(RegionNode *RN) {
326   if (RN->isSubRegion()) {
327     Region *SubR = RN->getNodeAs<Region>();
328     return LI->getLoopDepth(SubR->getExit());
329   }
330 
331   return LI->getLoopDepth(RN->getEntry());
332 }
333 
334 /// Build up the general order of nodes
335 void StructurizeCFG::orderNodes() {
336   ReversePostOrderTraversal<Region*> RPOT(ParentRegion);
337   SmallDenseMap<Loop*, unsigned, 8> LoopBlocks;
338 
339   // The reverse post-order traversal of the list gives us an ordering close
340   // to what we want.  The only problem with it is that sometimes backedges
341   // for outer loops will be visited before backedges for inner loops.
342   for (RegionNode *RN : RPOT) {
343     Loop *Loop = getAdjustedLoop(RN);
344     ++LoopBlocks[Loop];
345   }
346 
347   unsigned CurrentLoopDepth = 0;
348   Loop *CurrentLoop = nullptr;
349   for (auto I = RPOT.begin(), E = RPOT.end(); I != E; ++I) {
350     RegionNode *RN = cast<RegionNode>(*I);
351     unsigned LoopDepth = getAdjustedLoopDepth(RN);
352 
353     if (is_contained(Order, *I))
354       continue;
355 
356     if (LoopDepth < CurrentLoopDepth) {
357       // Make sure we have visited all blocks in this loop before moving back to
358       // the outer loop.
359 
360       auto LoopI = I;
361       while (unsigned &BlockCount = LoopBlocks[CurrentLoop]) {
362         LoopI++;
363         if (getAdjustedLoop(cast<RegionNode>(*LoopI)) == CurrentLoop) {
364           --BlockCount;
365           Order.push_back(*LoopI);
366         }
367       }
368     }
369 
370     CurrentLoop = getAdjustedLoop(RN);
371     if (CurrentLoop)
372       LoopBlocks[CurrentLoop]--;
373 
374     CurrentLoopDepth = LoopDepth;
375     Order.push_back(*I);
376   }
377 
378   // This pass originally used a post-order traversal and then operated on
379   // the list in reverse. Now that we are using a reverse post-order traversal
380   // rather than re-working the whole pass to operate on the list in order,
381   // we just reverse the list and continue to operate on it in reverse.
382   std::reverse(Order.begin(), Order.end());
383 }
384 
385 /// Determine the end of the loops
386 void StructurizeCFG::analyzeLoops(RegionNode *N) {
387   if (N->isSubRegion()) {
388     // Test for exit as back edge
389     BasicBlock *Exit = N->getNodeAs<Region>()->getExit();
390     if (Visited.count(Exit))
391       Loops[Exit] = N->getEntry();
392 
393   } else {
394     // Test for successors as back edge
395     BasicBlock *BB = N->getNodeAs<BasicBlock>();
396     BranchInst *Term = cast<BranchInst>(BB->getTerminator());
397 
398     for (BasicBlock *Succ : Term->successors())
399       if (Visited.count(Succ))
400         Loops[Succ] = BB;
401   }
402 }
403 
404 /// Invert the given condition
405 Value *StructurizeCFG::invert(Value *Condition) {
406   // First: Check if it's a constant
407   if (Constant *C = dyn_cast<Constant>(Condition))
408     return ConstantExpr::getNot(C);
409 
410   // Second: If the condition is already inverted, return the original value
411   Value *NotCondition;
412   if (match(Condition, m_Not(m_Value(NotCondition))))
413     return NotCondition;
414 
415   if (Instruction *Inst = dyn_cast<Instruction>(Condition)) {
416     // Third: Check all the users for an invert
417     BasicBlock *Parent = Inst->getParent();
418     for (User *U : Condition->users())
419       if (Instruction *I = dyn_cast<Instruction>(U))
420         if (I->getParent() == Parent && match(I, m_Not(m_Specific(Condition))))
421           return I;
422 
423     // Last option: Create a new instruction
424     return BinaryOperator::CreateNot(Condition, "", Parent->getTerminator());
425   }
426 
427   if (Argument *Arg = dyn_cast<Argument>(Condition)) {
428     BasicBlock &EntryBlock = Arg->getParent()->getEntryBlock();
429     return BinaryOperator::CreateNot(Condition,
430                                      Arg->getName() + ".inv",
431                                      EntryBlock.getTerminator());
432   }
433 
434   llvm_unreachable("Unhandled condition to invert");
435 }
436 
437 /// Build the condition for one edge
438 Value *StructurizeCFG::buildCondition(BranchInst *Term, unsigned Idx,
439                                       bool Invert) {
440   Value *Cond = Invert ? BoolFalse : BoolTrue;
441   if (Term->isConditional()) {
442     Cond = Term->getCondition();
443 
444     if (Idx != (unsigned)Invert)
445       Cond = invert(Cond);
446   }
447   return Cond;
448 }
449 
450 /// Analyze the predecessors of each block and build up predicates
451 void StructurizeCFG::gatherPredicates(RegionNode *N) {
452   RegionInfo *RI = ParentRegion->getRegionInfo();
453   BasicBlock *BB = N->getEntry();
454   BBPredicates &Pred = Predicates[BB];
455   BBPredicates &LPred = LoopPreds[BB];
456 
457   for (BasicBlock *P : predecessors(BB)) {
458     // Ignore it if it's a branch from outside into our region entry
459     if (!ParentRegion->contains(P))
460       continue;
461 
462     Region *R = RI->getRegionFor(P);
463     if (R == ParentRegion) {
464       // It's a top level block in our region
465       BranchInst *Term = cast<BranchInst>(P->getTerminator());
466       for (unsigned i = 0, e = Term->getNumSuccessors(); i != e; ++i) {
467         BasicBlock *Succ = Term->getSuccessor(i);
468         if (Succ != BB)
469           continue;
470 
471         if (Visited.count(P)) {
472           // Normal forward edge
473           if (Term->isConditional()) {
474             // Try to treat it like an ELSE block
475             BasicBlock *Other = Term->getSuccessor(!i);
476             if (Visited.count(Other) && !Loops.count(Other) &&
477                 !Pred.count(Other) && !Pred.count(P)) {
478 
479               Pred[Other] = BoolFalse;
480               Pred[P] = BoolTrue;
481               continue;
482             }
483           }
484           Pred[P] = buildCondition(Term, i, false);
485         } else {
486           // Back edge
487           LPred[P] = buildCondition(Term, i, true);
488         }
489       }
490     } else {
491       // It's an exit from a sub region
492       while (R->getParent() != ParentRegion)
493         R = R->getParent();
494 
495       // Edge from inside a subregion to its entry, ignore it
496       if (*R == *N)
497         continue;
498 
499       BasicBlock *Entry = R->getEntry();
500       if (Visited.count(Entry))
501         Pred[Entry] = BoolTrue;
502       else
503         LPred[Entry] = BoolFalse;
504     }
505   }
506 }
507 
508 /// Collect various loop and predicate infos
509 void StructurizeCFG::collectInfos() {
510   // Reset predicate
511   Predicates.clear();
512 
513   // and loop infos
514   Loops.clear();
515   LoopPreds.clear();
516 
517   // Reset the visited nodes
518   Visited.clear();
519 
520   for (RegionNode *RN : reverse(Order)) {
521     LLVM_DEBUG(dbgs() << "Visiting: "
522                       << (RN->isSubRegion() ? "SubRegion with entry: " : "")
523                       << RN->getEntry()->getName() << " Loop Depth: "
524                       << LI->getLoopDepth(RN->getEntry()) << "\n");
525 
526     // Analyze all the conditions leading to a node
527     gatherPredicates(RN);
528 
529     // Remember that we've seen this node
530     Visited.insert(RN->getEntry());
531 
532     // Find the last back edges
533     analyzeLoops(RN);
534   }
535 }
536 
537 /// Insert the missing branch conditions
538 void StructurizeCFG::insertConditions(bool Loops) {
539   BranchVector &Conds = Loops ? LoopConds : Conditions;
540   Value *Default = Loops ? BoolTrue : BoolFalse;
541   SSAUpdater PhiInserter;
542 
543   for (BranchInst *Term : Conds) {
544     assert(Term->isConditional());
545 
546     BasicBlock *Parent = Term->getParent();
547     BasicBlock *SuccTrue = Term->getSuccessor(0);
548     BasicBlock *SuccFalse = Term->getSuccessor(1);
549 
550     PhiInserter.Initialize(Boolean, "");
551     PhiInserter.AddAvailableValue(&Func->getEntryBlock(), Default);
552     PhiInserter.AddAvailableValue(Loops ? SuccFalse : Parent, Default);
553 
554     BBPredicates &Preds = Loops ? LoopPreds[SuccFalse] : Predicates[SuccTrue];
555 
556     NearestCommonDominator Dominator(DT);
557     Dominator.addBlock(Parent);
558 
559     Value *ParentValue = nullptr;
560     for (std::pair<BasicBlock *, Value *> BBAndPred : Preds) {
561       BasicBlock *BB = BBAndPred.first;
562       Value *Pred = BBAndPred.second;
563 
564       if (BB == Parent) {
565         ParentValue = Pred;
566         break;
567       }
568       PhiInserter.AddAvailableValue(BB, Pred);
569       Dominator.addAndRememberBlock(BB);
570     }
571 
572     if (ParentValue) {
573       Term->setCondition(ParentValue);
574     } else {
575       if (!Dominator.resultIsRememberedBlock())
576         PhiInserter.AddAvailableValue(Dominator.result(), Default);
577 
578       Term->setCondition(PhiInserter.GetValueInMiddleOfBlock(Parent));
579     }
580   }
581 }
582 
583 /// Remove all PHI values coming from "From" into "To" and remember
584 /// them in DeletedPhis
585 void StructurizeCFG::delPhiValues(BasicBlock *From, BasicBlock *To) {
586   PhiMap &Map = DeletedPhis[To];
587   for (PHINode &Phi : To->phis()) {
588     while (Phi.getBasicBlockIndex(From) != -1) {
589       Value *Deleted = Phi.removeIncomingValue(From, false);
590       Map[&Phi].push_back(std::make_pair(From, Deleted));
591     }
592   }
593 }
594 
595 /// Add a dummy PHI value as soon as we knew the new predecessor
596 void StructurizeCFG::addPhiValues(BasicBlock *From, BasicBlock *To) {
597   for (PHINode &Phi : To->phis()) {
598     Value *Undef = UndefValue::get(Phi.getType());
599     Phi.addIncoming(Undef, From);
600   }
601   AddedPhis[To].push_back(From);
602 }
603 
604 /// Add the real PHI value as soon as everything is set up
605 void StructurizeCFG::setPhiValues() {
606   SmallVector<PHINode *, 8> InsertedPhis;
607   SSAUpdater Updater(&InsertedPhis);
608   for (const auto &AddedPhi : AddedPhis) {
609     BasicBlock *To = AddedPhi.first;
610     const BBVector &From = AddedPhi.second;
611 
612     if (!DeletedPhis.count(To))
613       continue;
614 
615     PhiMap &Map = DeletedPhis[To];
616     for (const auto &PI : Map) {
617       PHINode *Phi = PI.first;
618       Value *Undef = UndefValue::get(Phi->getType());
619       Updater.Initialize(Phi->getType(), "");
620       Updater.AddAvailableValue(&Func->getEntryBlock(), Undef);
621       Updater.AddAvailableValue(To, Undef);
622 
623       NearestCommonDominator Dominator(DT);
624       Dominator.addBlock(To);
625       for (const auto &VI : PI.second) {
626         Updater.AddAvailableValue(VI.first, VI.second);
627         Dominator.addAndRememberBlock(VI.first);
628       }
629 
630       if (!Dominator.resultIsRememberedBlock())
631         Updater.AddAvailableValue(Dominator.result(), Undef);
632 
633       for (BasicBlock *FI : From)
634         Phi->setIncomingValueForBlock(FI, Updater.GetValueAtEndOfBlock(FI));
635     }
636 
637     DeletedPhis.erase(To);
638   }
639   assert(DeletedPhis.empty());
640 
641   // Simplify any phis inserted by the SSAUpdater if possible
642   bool Changed;
643   do {
644     Changed = false;
645 
646     SimplifyQuery Q(Func->getParent()->getDataLayout());
647     Q.DT = DT;
648     for (size_t i = 0; i < InsertedPhis.size(); ++i) {
649       PHINode *Phi = InsertedPhis[i];
650       if (Value *V = SimplifyInstruction(Phi, Q)) {
651         Phi->replaceAllUsesWith(V);
652         Phi->eraseFromParent();
653         InsertedPhis[i] = InsertedPhis.back();
654         InsertedPhis.pop_back();
655         i--;
656         Changed = true;
657       }
658     }
659   } while (Changed);
660 }
661 
662 /// Remove phi values from all successors and then remove the terminator.
663 void StructurizeCFG::killTerminator(BasicBlock *BB) {
664   Instruction *Term = BB->getTerminator();
665   if (!Term)
666     return;
667 
668   for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB);
669        SI != SE; ++SI)
670     delPhiValues(BB, *SI);
671 
672   if (DA)
673     DA->removeValue(Term);
674   Term->eraseFromParent();
675 }
676 
677 /// Let node exit(s) point to NewExit
678 void StructurizeCFG::changeExit(RegionNode *Node, BasicBlock *NewExit,
679                                 bool IncludeDominator) {
680   if (Node->isSubRegion()) {
681     Region *SubRegion = Node->getNodeAs<Region>();
682     BasicBlock *OldExit = SubRegion->getExit();
683     BasicBlock *Dominator = nullptr;
684 
685     // Find all the edges from the sub region to the exit
686     for (auto BBI = pred_begin(OldExit), E = pred_end(OldExit); BBI != E;) {
687       // Incrememt BBI before mucking with BB's terminator.
688       BasicBlock *BB = *BBI++;
689 
690       if (!SubRegion->contains(BB))
691         continue;
692 
693       // Modify the edges to point to the new exit
694       delPhiValues(BB, OldExit);
695       BB->getTerminator()->replaceUsesOfWith(OldExit, NewExit);
696       addPhiValues(BB, NewExit);
697 
698       // Find the new dominator (if requested)
699       if (IncludeDominator) {
700         if (!Dominator)
701           Dominator = BB;
702         else
703           Dominator = DT->findNearestCommonDominator(Dominator, BB);
704       }
705     }
706 
707     // Change the dominator (if requested)
708     if (Dominator)
709       DT->changeImmediateDominator(NewExit, Dominator);
710 
711     // Update the region info
712     SubRegion->replaceExit(NewExit);
713   } else {
714     BasicBlock *BB = Node->getNodeAs<BasicBlock>();
715     killTerminator(BB);
716     BranchInst::Create(NewExit, BB);
717     addPhiValues(BB, NewExit);
718     if (IncludeDominator)
719       DT->changeImmediateDominator(NewExit, BB);
720   }
721 }
722 
723 /// Create a new flow node and update dominator tree and region info
724 BasicBlock *StructurizeCFG::getNextFlow(BasicBlock *Dominator) {
725   LLVMContext &Context = Func->getContext();
726   BasicBlock *Insert = Order.empty() ? ParentRegion->getExit() :
727                        Order.back()->getEntry();
728   BasicBlock *Flow = BasicBlock::Create(Context, FlowBlockName,
729                                         Func, Insert);
730   DT->addNewBlock(Flow, Dominator);
731   ParentRegion->getRegionInfo()->setRegionFor(Flow, ParentRegion);
732   return Flow;
733 }
734 
735 /// Create a new or reuse the previous node as flow node
736 BasicBlock *StructurizeCFG::needPrefix(bool NeedEmpty) {
737   BasicBlock *Entry = PrevNode->getEntry();
738 
739   if (!PrevNode->isSubRegion()) {
740     killTerminator(Entry);
741     if (!NeedEmpty || Entry->getFirstInsertionPt() == Entry->end())
742       return Entry;
743   }
744 
745   // create a new flow node
746   BasicBlock *Flow = getNextFlow(Entry);
747 
748   // and wire it up
749   changeExit(PrevNode, Flow, true);
750   PrevNode = ParentRegion->getBBNode(Flow);
751   return Flow;
752 }
753 
754 /// Returns the region exit if possible, otherwise just a new flow node
755 BasicBlock *StructurizeCFG::needPostfix(BasicBlock *Flow,
756                                         bool ExitUseAllowed) {
757   if (!Order.empty() || !ExitUseAllowed)
758     return getNextFlow(Flow);
759 
760   BasicBlock *Exit = ParentRegion->getExit();
761   DT->changeImmediateDominator(Exit, Flow);
762   addPhiValues(Flow, Exit);
763   return Exit;
764 }
765 
766 /// Set the previous node
767 void StructurizeCFG::setPrevNode(BasicBlock *BB) {
768   PrevNode = ParentRegion->contains(BB) ? ParentRegion->getBBNode(BB)
769                                         : nullptr;
770 }
771 
772 /// Does BB dominate all the predicates of Node?
773 bool StructurizeCFG::dominatesPredicates(BasicBlock *BB, RegionNode *Node) {
774   BBPredicates &Preds = Predicates[Node->getEntry()];
775   return llvm::all_of(Preds, [&](std::pair<BasicBlock *, Value *> Pred) {
776     return DT->dominates(BB, Pred.first);
777   });
778 }
779 
780 /// Can we predict that this node will always be called?
781 bool StructurizeCFG::isPredictableTrue(RegionNode *Node) {
782   BBPredicates &Preds = Predicates[Node->getEntry()];
783   bool Dominated = false;
784 
785   // Regionentry is always true
786   if (!PrevNode)
787     return true;
788 
789   for (std::pair<BasicBlock*, Value*> Pred : Preds) {
790     BasicBlock *BB = Pred.first;
791     Value *V = Pred.second;
792 
793     if (V != BoolTrue)
794       return false;
795 
796     if (!Dominated && DT->dominates(BB, PrevNode->getEntry()))
797       Dominated = true;
798   }
799 
800   // TODO: The dominator check is too strict
801   return Dominated;
802 }
803 
804 /// Take one node from the order vector and wire it up
805 void StructurizeCFG::wireFlow(bool ExitUseAllowed,
806                               BasicBlock *LoopEnd) {
807   RegionNode *Node = Order.pop_back_val();
808   Visited.insert(Node->getEntry());
809 
810   if (isPredictableTrue(Node)) {
811     // Just a linear flow
812     if (PrevNode) {
813       changeExit(PrevNode, Node->getEntry(), true);
814     }
815     PrevNode = Node;
816   } else {
817     // Insert extra prefix node (or reuse last one)
818     BasicBlock *Flow = needPrefix(false);
819 
820     // Insert extra postfix node (or use exit instead)
821     BasicBlock *Entry = Node->getEntry();
822     BasicBlock *Next = needPostfix(Flow, ExitUseAllowed);
823 
824     // let it point to entry and next block
825     Conditions.push_back(BranchInst::Create(Entry, Next, BoolUndef, Flow));
826     addPhiValues(Flow, Entry);
827     DT->changeImmediateDominator(Entry, Flow);
828 
829     PrevNode = Node;
830     while (!Order.empty() && !Visited.count(LoopEnd) &&
831            dominatesPredicates(Entry, Order.back())) {
832       handleLoops(false, LoopEnd);
833     }
834 
835     changeExit(PrevNode, Next, false);
836     setPrevNode(Next);
837   }
838 }
839 
840 void StructurizeCFG::handleLoops(bool ExitUseAllowed,
841                                  BasicBlock *LoopEnd) {
842   RegionNode *Node = Order.back();
843   BasicBlock *LoopStart = Node->getEntry();
844 
845   if (!Loops.count(LoopStart)) {
846     wireFlow(ExitUseAllowed, LoopEnd);
847     return;
848   }
849 
850   if (!isPredictableTrue(Node))
851     LoopStart = needPrefix(true);
852 
853   LoopEnd = Loops[Node->getEntry()];
854   wireFlow(false, LoopEnd);
855   while (!Visited.count(LoopEnd)) {
856     handleLoops(false, LoopEnd);
857   }
858 
859   // If the start of the loop is the entry block, we can't branch to it so
860   // insert a new dummy entry block.
861   Function *LoopFunc = LoopStart->getParent();
862   if (LoopStart == &LoopFunc->getEntryBlock()) {
863     LoopStart->setName("entry.orig");
864 
865     BasicBlock *NewEntry =
866       BasicBlock::Create(LoopStart->getContext(),
867                          "entry",
868                          LoopFunc,
869                          LoopStart);
870     BranchInst::Create(LoopStart, NewEntry);
871     DT->setNewRoot(NewEntry);
872   }
873 
874   // Create an extra loop end node
875   LoopEnd = needPrefix(false);
876   BasicBlock *Next = needPostfix(LoopEnd, ExitUseAllowed);
877   LoopConds.push_back(BranchInst::Create(Next, LoopStart,
878                                          BoolUndef, LoopEnd));
879   addPhiValues(LoopEnd, LoopStart);
880   setPrevNode(Next);
881 }
882 
883 /// After this function control flow looks like it should be, but
884 /// branches and PHI nodes only have undefined conditions.
885 void StructurizeCFG::createFlow() {
886   BasicBlock *Exit = ParentRegion->getExit();
887   bool EntryDominatesExit = DT->dominates(ParentRegion->getEntry(), Exit);
888 
889   DeletedPhis.clear();
890   AddedPhis.clear();
891   Conditions.clear();
892   LoopConds.clear();
893 
894   PrevNode = nullptr;
895   Visited.clear();
896 
897   while (!Order.empty()) {
898     handleLoops(EntryDominatesExit, nullptr);
899   }
900 
901   if (PrevNode)
902     changeExit(PrevNode, Exit, EntryDominatesExit);
903   else
904     assert(EntryDominatesExit);
905 }
906 
907 /// Handle a rare case where the disintegrated nodes instructions
908 /// no longer dominate all their uses. Not sure if this is really necessary
909 void StructurizeCFG::rebuildSSA() {
910   SSAUpdater Updater;
911   for (BasicBlock *BB : ParentRegion->blocks())
912     for (Instruction &I : *BB) {
913       bool Initialized = false;
914       // We may modify the use list as we iterate over it, so be careful to
915       // compute the next element in the use list at the top of the loop.
916       for (auto UI = I.use_begin(), E = I.use_end(); UI != E;) {
917         Use &U = *UI++;
918         Instruction *User = cast<Instruction>(U.getUser());
919         if (User->getParent() == BB) {
920           continue;
921         } else if (PHINode *UserPN = dyn_cast<PHINode>(User)) {
922           if (UserPN->getIncomingBlock(U) == BB)
923             continue;
924         }
925 
926         if (DT->dominates(&I, User))
927           continue;
928 
929         if (!Initialized) {
930           Value *Undef = UndefValue::get(I.getType());
931           Updater.Initialize(I.getType(), "");
932           Updater.AddAvailableValue(&Func->getEntryBlock(), Undef);
933           Updater.AddAvailableValue(BB, &I);
934           Initialized = true;
935         }
936         Updater.RewriteUseAfterInsertions(U);
937       }
938     }
939 }
940 
941 static bool hasOnlyUniformBranches(Region *R, unsigned UniformMDKindID,
942                                    const LegacyDivergenceAnalysis &DA) {
943   // Bool for if all sub-regions are uniform.
944   bool SubRegionsAreUniform = true;
945   // Count of how many direct children are conditional.
946   unsigned ConditionalDirectChildren = 0;
947 
948   for (auto E : R->elements()) {
949     if (!E->isSubRegion()) {
950       auto Br = dyn_cast<BranchInst>(E->getEntry()->getTerminator());
951       if (!Br || !Br->isConditional())
952         continue;
953 
954       if (!DA.isUniform(Br))
955         return false;
956 
957       // One of our direct children is conditional.
958       ConditionalDirectChildren++;
959 
960       LLVM_DEBUG(dbgs() << "BB: " << Br->getParent()->getName()
961                         << " has uniform terminator\n");
962     } else {
963       // Explicitly refuse to treat regions as uniform if they have non-uniform
964       // subregions. We cannot rely on DivergenceAnalysis for branches in
965       // subregions because those branches may have been removed and re-created,
966       // so we look for our metadata instead.
967       //
968       // Warning: It would be nice to treat regions as uniform based only on
969       // their direct child basic blocks' terminators, regardless of whether
970       // subregions are uniform or not. However, this requires a very careful
971       // look at SIAnnotateControlFlow to make sure nothing breaks there.
972       for (auto BB : E->getNodeAs<Region>()->blocks()) {
973         auto Br = dyn_cast<BranchInst>(BB->getTerminator());
974         if (!Br || !Br->isConditional())
975           continue;
976 
977         if (!Br->getMetadata(UniformMDKindID)) {
978           // Early exit if we cannot have relaxed uniform regions.
979           if (!RelaxedUniformRegions)
980             return false;
981 
982           SubRegionsAreUniform = false;
983           break;
984         }
985       }
986     }
987   }
988 
989   // Our region is uniform if:
990   // 1. All conditional branches that are direct children are uniform (checked
991   // above).
992   // 2. And either:
993   //   a. All sub-regions are uniform.
994   //   b. There is one or less conditional branches among the direct children.
995   return SubRegionsAreUniform || (ConditionalDirectChildren <= 1);
996 }
997 
998 /// Run the transformation for each region found
999 bool StructurizeCFG::runOnRegion(Region *R, RGPassManager &RGM) {
1000   if (R->isTopLevelRegion())
1001     return false;
1002 
1003   DA = nullptr;
1004 
1005   if (SkipUniformRegions) {
1006     // TODO: We could probably be smarter here with how we handle sub-regions.
1007     // We currently rely on the fact that metadata is set by earlier invocations
1008     // of the pass on sub-regions, and that this metadata doesn't get lost --
1009     // but we shouldn't rely on metadata for correctness!
1010     unsigned UniformMDKindID =
1011         R->getEntry()->getContext().getMDKindID("structurizecfg.uniform");
1012     DA = &getAnalysis<LegacyDivergenceAnalysis>();
1013 
1014     if (hasOnlyUniformBranches(R, UniformMDKindID, *DA)) {
1015       LLVM_DEBUG(dbgs() << "Skipping region with uniform control flow: " << *R
1016                         << '\n');
1017 
1018       // Mark all direct child block terminators as having been treated as
1019       // uniform. To account for a possible future in which non-uniform
1020       // sub-regions are treated more cleverly, indirect children are not
1021       // marked as uniform.
1022       MDNode *MD = MDNode::get(R->getEntry()->getParent()->getContext(), {});
1023       for (RegionNode *E : R->elements()) {
1024         if (E->isSubRegion())
1025           continue;
1026 
1027         if (Instruction *Term = E->getEntry()->getTerminator())
1028           Term->setMetadata(UniformMDKindID, MD);
1029       }
1030 
1031       return false;
1032     }
1033   }
1034 
1035   Func = R->getEntry()->getParent();
1036   ParentRegion = R;
1037 
1038   DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
1039   LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
1040 
1041   orderNodes();
1042   collectInfos();
1043   createFlow();
1044   insertConditions(false);
1045   insertConditions(true);
1046   setPhiValues();
1047   rebuildSSA();
1048 
1049   // Cleanup
1050   Order.clear();
1051   Visited.clear();
1052   DeletedPhis.clear();
1053   AddedPhis.clear();
1054   Predicates.clear();
1055   Conditions.clear();
1056   Loops.clear();
1057   LoopPreds.clear();
1058   LoopConds.clear();
1059 
1060   return true;
1061 }
1062 
1063 Pass *llvm::createStructurizeCFGPass(bool SkipUniformRegions) {
1064   return new StructurizeCFG(SkipUniformRegions);
1065 }
1066