1 //===----- ScopDetection.cpp  - Detect Scops --------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Detect the maximal Scops of a function.
11 //
12 // A static control part (Scop) is a subgraph of the control flow graph (CFG)
13 // that only has statically known control flow and can therefore be described
14 // within the polyhedral model.
15 //
16 // Every Scop fullfills these restrictions:
17 //
18 // * It is a single entry single exit region
19 //
20 // * Only affine linear bounds in the loops
21 //
22 // Every natural loop in a Scop must have a number of loop iterations that can
23 // be described as an affine linear function in surrounding loop iterators or
24 // parameters. (A parameter is a scalar that does not change its value during
25 // execution of the Scop).
26 //
27 // * Only comparisons of affine linear expressions in conditions
28 //
29 // * All loops and conditions perfectly nested
30 //
31 // The control flow needs to be structured such that it could be written using
32 // just 'for' and 'if' statements, without the need for any 'goto', 'break' or
33 // 'continue'.
34 //
35 // * Side effect free functions call
36 //
37 // Only function calls and intrinsics that do not have side effects are allowed
38 // (readnone).
39 //
40 // The Scop detection finds the largest Scops by checking if the largest
41 // region is a Scop. If this is not the case, its canonical subregions are
42 // checked until a region is a Scop. It is now tried to extend this Scop by
43 // creating a larger non canonical region.
44 //
45 //===----------------------------------------------------------------------===//
46 
47 #include "polly/CodeGen/BlockGenerators.h"
48 #include "polly/LinkAllPasses.h"
49 #include "polly/Options.h"
50 #include "polly/ScopDetectionDiagnostic.h"
51 #include "polly/ScopDetection.h"
52 #include "polly/Support/SCEVValidator.h"
53 #include "polly/Support/ScopHelper.h"
54 #include "llvm/ADT/Statistic.h"
55 #include "llvm/Analysis/AliasAnalysis.h"
56 #include "llvm/Analysis/LoopInfo.h"
57 #include "llvm/Analysis/RegionIterator.h"
58 #include "llvm/Analysis/ScalarEvolution.h"
59 #include "llvm/Analysis/ScalarEvolutionExpressions.h"
60 #include "llvm/IR/DebugInfo.h"
61 #include "llvm/IR/DiagnosticInfo.h"
62 #include "llvm/IR/DiagnosticPrinter.h"
63 #include "llvm/IR/LLVMContext.h"
64 
65 #define DEBUG_TYPE "polly-detect"
66 #include "llvm/Support/Debug.h"
67 
68 #include <set>
69 
70 using namespace llvm;
71 using namespace polly;
72 
73 static cl::opt<bool>
74 DetectScopsWithoutLoops("polly-detect-scops-in-functions-without-loops",
75                         cl::desc("Detect scops in functions without loops"),
76                         cl::Hidden, cl::init(false), cl::ZeroOrMore,
77                         cl::cat(PollyCategory));
78 
79 static cl::opt<bool>
80 DetectRegionsWithoutLoops("polly-detect-scops-in-regions-without-loops",
81                           cl::desc("Detect scops in regions without loops"),
82                           cl::Hidden, cl::init(false), cl::ZeroOrMore,
83                           cl::cat(PollyCategory));
84 
85 static cl::opt<std::string>
86 OnlyFunction("polly-only-func", cl::desc("Only run on a single function"),
87              cl::value_desc("function-name"), cl::ValueRequired, cl::init(""),
88              cl::cat(PollyCategory));
89 
90 static cl::opt<std::string>
91 OnlyRegion("polly-only-region",
92            cl::desc("Only run on certain regions (The provided identifier must "
93                     "appear in the name of the region's entry block"),
94            cl::value_desc("identifier"), cl::ValueRequired, cl::init(""),
95            cl::cat(PollyCategory));
96 
97 static cl::opt<bool>
98 IgnoreAliasing("polly-ignore-aliasing",
99                cl::desc("Ignore possible aliasing of the array bases"),
100                cl::Hidden, cl::init(false), cl::ZeroOrMore,
101                cl::cat(PollyCategory));
102 
103 static cl::opt<bool>
104 ReportLevel("polly-report",
105             cl::desc("Print information about the activities of Polly"),
106             cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory));
107 
108 static cl::opt<bool>
109 AllowNonAffine("polly-allow-nonaffine",
110                cl::desc("Allow non affine access functions in arrays"),
111                cl::Hidden, cl::init(false), cl::ZeroOrMore,
112                cl::cat(PollyCategory));
113 
114 static cl::opt<bool, true>
115 TrackFailures("polly-detect-track-failures",
116               cl::desc("Track failure strings in detecting scop regions"),
117               cl::location(PollyTrackFailures), cl::Hidden, cl::ZeroOrMore,
118               cl::init(false), cl::cat(PollyCategory));
119 
120 static cl::opt<bool, true>
121 PollyDelinearizeX("polly-delinearize",
122                   cl::desc("Delinearize array access functions"),
123                   cl::location(PollyDelinearize), cl::Hidden, cl::ZeroOrMore,
124                   cl::init(false), cl::cat(PollyCategory));
125 
126 static cl::opt<bool>
127 VerifyScops("polly-detect-verify",
128             cl::desc("Verify the detected SCoPs after each transformation"),
129             cl::Hidden, cl::init(false), cl::ZeroOrMore,
130             cl::cat(PollyCategory));
131 
132 bool polly::PollyTrackFailures = false;
133 bool polly::PollyDelinearize = false;
134 
135 //===----------------------------------------------------------------------===//
136 // Statistics.
137 
138 STATISTIC(ValidRegion, "Number of regions that a valid part of Scop");
139 
140 class DiagnosticScopFound : public DiagnosticInfo {
141 private:
142   static int PluginDiagnosticKind;
143 
144   Function &F;
145   std::string FileName;
146   unsigned EntryLine, ExitLine;
147 
148 public:
149   DiagnosticScopFound(Function &F, std::string FileName, unsigned EntryLine,
150                       unsigned ExitLine)
151       : DiagnosticInfo(PluginDiagnosticKind, DS_Note), F(F), FileName(FileName),
152         EntryLine(EntryLine), ExitLine(ExitLine) {}
153 
154   virtual void print(DiagnosticPrinter &DP) const;
155 
156   static bool classof(const DiagnosticInfo *DI) {
157     return DI->getKind() == PluginDiagnosticKind;
158   }
159 };
160 
161 int DiagnosticScopFound::PluginDiagnosticKind = 10;
162 
163 void DiagnosticScopFound::print(DiagnosticPrinter &DP) const {
164   DP << "Polly detected an optimizable loop region (scop) in function '" << F
165      << "'\n";
166 
167   if (FileName.empty()) {
168     DP << "Scop location is unknown. Compile with debug info "
169           "(-g) to get more precise information. ";
170     return;
171   }
172 
173   DP << FileName << ":" << EntryLine << ": Start of scop\n";
174   DP << FileName << ":" << ExitLine << ": End of scop";
175 }
176 
177 //===----------------------------------------------------------------------===//
178 // ScopDetection.
179 
180 template <class RR, typename... Args>
181 inline bool ScopDetection::invalid(DetectionContext &Context, bool Assert,
182                                    Args &&... Arguments) const {
183 
184   if (!Context.Verifying) {
185     RR RejectReason = RR(Arguments...);
186     if (PollyTrackFailures)
187       LastFailure = RejectReason.getMessage();
188 
189     DEBUG(dbgs() << RejectReason.getMessage());
190     DEBUG(dbgs() << "\n");
191   } else {
192     assert(!Assert && "Verification of detected scop failed");
193   }
194 
195   return false;
196 }
197 
198 bool ScopDetection::isMaxRegionInScop(const Region &R, bool Verify) const {
199   if (!ValidRegions.count(&R))
200     return false;
201 
202   if (Verify)
203     return isValidRegion(const_cast<Region &>(R));
204 
205   return true;
206 }
207 
208 std::string ScopDetection::regionIsInvalidBecause(const Region *R) const {
209   if (!InvalidRegions.count(R))
210     return "";
211 
212   return InvalidRegions.find(R)->second;
213 }
214 
215 bool ScopDetection::isValidCFG(BasicBlock &BB,
216                                DetectionContext &Context) const {
217   Region &RefRegion = Context.CurRegion;
218   TerminatorInst *TI = BB.getTerminator();
219 
220   // Return instructions are only valid if the region is the top level region.
221   if (isa<ReturnInst>(TI) && !RefRegion.getExit() && TI->getNumOperands() == 0)
222     return true;
223 
224   BranchInst *Br = dyn_cast<BranchInst>(TI);
225 
226   if (!Br)
227     return invalid<ReportNonBranchTerminator>(Context, /*Assert=*/true, &BB);
228 
229   if (Br->isUnconditional())
230     return true;
231 
232   Value *Condition = Br->getCondition();
233 
234   // UndefValue is not allowed as condition.
235   if (isa<UndefValue>(Condition))
236     return invalid<ReportUndefCond>(Context, /*Assert=*/true, &BB);
237 
238   // Only Constant and ICmpInst are allowed as condition.
239   if (!(isa<Constant>(Condition) || isa<ICmpInst>(Condition)))
240     return invalid<ReportInvalidCond>(Context, /*Assert=*/true, &BB);
241 
242   // Allow perfectly nested conditions.
243   assert(Br->getNumSuccessors() == 2 && "Unexpected number of successors");
244 
245   if (ICmpInst *ICmp = dyn_cast<ICmpInst>(Condition)) {
246     // Unsigned comparisons are not allowed. They trigger overflow problems
247     // in the code generation.
248     //
249     // TODO: This is not sufficient and just hides bugs. However it does pretty
250     // well.
251     if (ICmp->isUnsigned())
252       return false;
253 
254     // Are both operands of the ICmp affine?
255     if (isa<UndefValue>(ICmp->getOperand(0)) ||
256         isa<UndefValue>(ICmp->getOperand(1)))
257       return invalid<ReportUndefOperand>(Context, /*Assert=*/true, &BB);
258 
259     Loop *L = LI->getLoopFor(ICmp->getParent());
260     const SCEV *LHS = SE->getSCEVAtScope(ICmp->getOperand(0), L);
261     const SCEV *RHS = SE->getSCEVAtScope(ICmp->getOperand(1), L);
262 
263     if (!isAffineExpr(&Context.CurRegion, LHS, *SE) ||
264         !isAffineExpr(&Context.CurRegion, RHS, *SE))
265       return invalid<ReportNonAffBranch>(Context, /*Assert=*/true, &BB, LHS,
266                                          RHS);
267   }
268 
269   // Allow loop exit conditions.
270   Loop *L = LI->getLoopFor(&BB);
271   if (L && L->getExitingBlock() == &BB)
272     return true;
273 
274   // Allow perfectly nested conditions.
275   Region *R = RI->getRegionFor(&BB);
276   if (R->getEntry() != &BB)
277     return invalid<ReportCondition>(Context, /*Assert=*/true, &BB);
278 
279   return true;
280 }
281 
282 bool ScopDetection::isValidCallInst(CallInst &CI) {
283   if (CI.mayHaveSideEffects() || CI.doesNotReturn())
284     return false;
285 
286   if (CI.doesNotAccessMemory())
287     return true;
288 
289   Function *CalledFunction = CI.getCalledFunction();
290 
291   // Indirect calls are not supported.
292   if (CalledFunction == 0)
293     return false;
294 
295   // TODO: Intrinsics.
296   return false;
297 }
298 
299 bool ScopDetection::isInvariant(const Value &Val, const Region &Reg) const {
300   // A reference to function argument or constant value is invariant.
301   if (isa<Argument>(Val) || isa<Constant>(Val))
302     return true;
303 
304   const Instruction *I = dyn_cast<Instruction>(&Val);
305   if (!I)
306     return false;
307 
308   if (!Reg.contains(I))
309     return true;
310 
311   if (I->mayHaveSideEffects())
312     return false;
313 
314   // When Val is a Phi node, it is likely not invariant. We do not check whether
315   // Phi nodes are actually invariant, we assume that Phi nodes are usually not
316   // invariant. Recursively checking the operators of Phi nodes would lead to
317   // infinite recursion.
318   if (isa<PHINode>(*I))
319     return false;
320 
321   for (const Use &Operand : I->operands())
322     if (!isInvariant(*Operand, Reg))
323       return false;
324 
325   // When the instruction is a load instruction, check that no write to memory
326   // in the region aliases with the load.
327   if (const LoadInst *LI = dyn_cast<LoadInst>(I)) {
328     AliasAnalysis::Location Loc = AA->getLocation(LI);
329     const Region::const_block_iterator BE = Reg.block_end();
330     // Check if any basic block in the region can modify the location pointed to
331     // by 'Loc'.  If so, 'Val' is (likely) not invariant in the region.
332     for (const BasicBlock *BB : Reg.blocks())
333       if (AA->canBasicBlockModify(*BB, Loc))
334         return false;
335   }
336 
337   return true;
338 }
339 
340 bool ScopDetection::isValidMemoryAccess(Instruction &Inst,
341                                         DetectionContext &Context) const {
342   Value *Ptr = getPointerOperand(Inst);
343   Loop *L = LI->getLoopFor(Inst.getParent());
344   const SCEV *AccessFunction = SE->getSCEVAtScope(Ptr, L);
345   const SCEVUnknown *BasePointer;
346   Value *BaseValue;
347 
348   BasePointer = dyn_cast<SCEVUnknown>(SE->getPointerBase(AccessFunction));
349 
350   if (!BasePointer)
351     return invalid<ReportNoBasePtr>(Context, /*Assert=*/true);
352 
353   BaseValue = BasePointer->getValue();
354 
355   if (isa<UndefValue>(BaseValue))
356     return invalid<ReportUndefBasePtr>(Context, /*Assert=*/true);
357 
358   // Check that the base address of the access is invariant in the current
359   // region.
360   if (!isInvariant(*BaseValue, Context.CurRegion))
361     // Verification of this property is difficult as the independent blocks
362     // pass may introduce aliasing that we did not have when running the
363     // scop detection.
364     return invalid<ReportVariantBasePtr>(Context, /*Assert=*/false, BaseValue);
365 
366   AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer);
367 
368   if (AllowNonAffine) {
369     // Do not check whether AccessFunction is affine.
370   } else if (!isAffineExpr(&Context.CurRegion, AccessFunction, *SE,
371                            BaseValue)) {
372     const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction);
373     if (!PollyDelinearize || !AF)
374       return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
375                                             AccessFunction);
376 
377     // Try to delinearize AccessFunction only when the expression is known to
378     // not be affine: as all affine functions can be represented without
379     // problems in Polly, we do not have to delinearize them.
380     SmallVector<const SCEV *, 4> Subscripts, Sizes;
381     AF->delinearize(*SE, Subscripts, Sizes);
382     int size = Subscripts.size();
383 
384     for (int i = 0; i < size; ++i)
385       if (!isAffineExpr(&Context.CurRegion, Subscripts[i], *SE, BaseValue))
386         return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
387                                               AccessFunction);
388   }
389 
390   // FIXME: Alias Analysis thinks IntToPtrInst aliases with alloca instructions
391   // created by IndependentBlocks Pass.
392   if (isa<IntToPtrInst>(BaseValue))
393     return invalid<ReportIntToPtr>(Context, /*Assert=*/true, BaseValue);
394 
395   if (IgnoreAliasing)
396     return true;
397 
398   // Check if the base pointer of the memory access does alias with
399   // any other pointer. This cannot be handled at the moment.
400   AliasSet &AS =
401       Context.AST.getAliasSetForPointer(BaseValue, AliasAnalysis::UnknownSize,
402                                         Inst.getMetadata(LLVMContext::MD_tbaa));
403 
404   // INVALID triggers an assertion in verifying mode, if it detects that a
405   // SCoP was detected by SCoP detection and that this SCoP was invalidated by
406   // a pass that stated it would preserve the SCoPs. We disable this check as
407   // the independent blocks pass may create memory references which seem to
408   // alias, if -basicaa is not available. They actually do not, but as we can
409   // not proof this without -basicaa we would fail. We disable this check to
410   // not cause irrelevant verification failures.
411   if (!AS.isMustAlias())
412     return invalid<ReportAlias>(Context, /*Assert=*/true, &AS);
413 
414   return true;
415 }
416 
417 bool ScopDetection::isValidInstruction(Instruction &Inst,
418                                        DetectionContext &Context) const {
419   if (PHINode *PN = dyn_cast<PHINode>(&Inst))
420     if (!canSynthesize(PN, LI, SE, &Context.CurRegion)) {
421       if (SCEVCodegen)
422         return invalid<ReportPhiNodeRefInRegion>(Context, /*Assert=*/true,
423                                                  &Inst);
424       else
425         return invalid<ReportNonCanonicalPhiNode>(Context, /*Assert=*/true,
426                                                   &Inst);
427     }
428 
429   // We only check the call instruction but not invoke instruction.
430   if (CallInst *CI = dyn_cast<CallInst>(&Inst)) {
431     if (isValidCallInst(*CI))
432       return true;
433 
434     return invalid<ReportFuncCall>(Context, /*Assert=*/true, &Inst);
435   }
436 
437   if (!Inst.mayWriteToMemory() && !Inst.mayReadFromMemory()) {
438     if (!isa<AllocaInst>(Inst))
439       return true;
440 
441     return invalid<ReportAlloca>(Context, /*Assert=*/true, &Inst);
442   }
443 
444   // Check the access function.
445   if (isa<LoadInst>(Inst) || isa<StoreInst>(Inst))
446     return isValidMemoryAccess(Inst, Context);
447 
448   // We do not know this instruction, therefore we assume it is invalid.
449   return invalid<ReportUnknownInst>(Context, /*Assert=*/true, &Inst);
450 }
451 
452 bool ScopDetection::isValidLoop(Loop *L, DetectionContext &Context) const {
453   if (!SCEVCodegen) {
454     // If code generation is not in scev based mode, we need to ensure that
455     // each loop has a canonical induction variable.
456     PHINode *IndVar = L->getCanonicalInductionVariable();
457     if (!IndVar)
458       return invalid<ReportLoopHeader>(Context, /*Assert=*/true, L);
459   }
460 
461   // Is the loop count affine?
462   const SCEV *LoopCount = SE->getBackedgeTakenCount(L);
463   if (!isAffineExpr(&Context.CurRegion, LoopCount, *SE))
464     return invalid<ReportLoopBound>(Context, /*Assert=*/true, L, LoopCount);
465 
466   return true;
467 }
468 
469 Region *ScopDetection::expandRegion(Region &R) {
470   // Initial no valid region was found (greater than R)
471   Region *LastValidRegion = NULL;
472   Region *ExpandedRegion = R.getExpandedRegion();
473 
474   DEBUG(dbgs() << "\tExpanding " << R.getNameStr() << "\n");
475 
476   while (ExpandedRegion) {
477     DetectionContext Context(*ExpandedRegion, *AA, false /* verifying */);
478     DEBUG(dbgs() << "\t\tTrying " << ExpandedRegion->getNameStr() << "\n");
479 
480     // Check the exit first (cheap)
481     if (isValidExit(Context)) {
482       // If the exit is valid check all blocks
483       //  - if true, a valid region was found => store it + keep expanding
484       //  - if false, .tbd. => stop  (should this really end the loop?)
485       if (!allBlocksValid(Context))
486         break;
487 
488       // Delete unnecessary regions (allocated by getExpandedRegion)
489       if (LastValidRegion)
490         delete LastValidRegion;
491 
492       // Store this region, because it is the greatest valid (encountered so
493       // far).
494       LastValidRegion = ExpandedRegion;
495 
496       // Create and test the next greater region (if any)
497       ExpandedRegion = ExpandedRegion->getExpandedRegion();
498 
499     } else {
500       // Create and test the next greater region (if any)
501       Region *TmpRegion = ExpandedRegion->getExpandedRegion();
502 
503       // Delete unnecessary regions (allocated by getExpandedRegion)
504       delete ExpandedRegion;
505 
506       ExpandedRegion = TmpRegion;
507     }
508   }
509 
510   DEBUG({
511     if (LastValidRegion)
512       dbgs() << "\tto " << LastValidRegion->getNameStr() << "\n";
513     else
514       dbgs() << "\tExpanding " << R.getNameStr() << " failed\n";
515   });
516 
517   return LastValidRegion;
518 }
519 static bool regionWithoutLoops(Region &R, LoopInfo *LI) {
520   for (const BasicBlock *BB : R.blocks())
521     if (R.contains(LI->getLoopFor(BB)))
522       return false;
523 
524   return true;
525 }
526 
527 // Remove all direct and indirect children of region R from the region set Regs,
528 // but do not recurse further if the first child has been found.
529 //
530 // Return the number of regions erased from Regs.
531 static unsigned eraseAllChildren(std::set<const Region *> &Regs,
532                                  const Region &R) {
533   unsigned Count = 0;
534   for (auto &SubRegion : R) {
535     if (Regs.find(SubRegion.get()) != Regs.end()) {
536       ++Count;
537       Regs.erase(SubRegion.get());
538     } else {
539       Count += eraseAllChildren(Regs, *SubRegion);
540     }
541   }
542   return Count;
543 }
544 
545 void ScopDetection::findScops(Region &R) {
546   if (!DetectRegionsWithoutLoops && regionWithoutLoops(R, LI))
547     return;
548 
549   LastFailure = "";
550 
551   if (isValidRegion(R)) {
552     ++ValidRegion;
553     ValidRegions.insert(&R);
554     return;
555   }
556 
557   InvalidRegions[&R] = LastFailure;
558 
559   for (auto &SubRegion : R)
560     findScops(*SubRegion);
561 
562   // Try to expand regions.
563   //
564   // As the region tree normally only contains canonical regions, non canonical
565   // regions that form a Scop are not found. Therefore, those non canonical
566   // regions are checked by expanding the canonical ones.
567 
568   std::vector<Region *> ToExpand;
569 
570   for (auto &SubRegion : R)
571     ToExpand.push_back(SubRegion.get());
572 
573   for (Region *CurrentRegion : ToExpand) {
574     // Skip invalid regions. Regions may become invalid, if they are element of
575     // an already expanded region.
576     if (ValidRegions.find(CurrentRegion) == ValidRegions.end())
577       continue;
578 
579     Region *ExpandedR = expandRegion(*CurrentRegion);
580 
581     if (!ExpandedR)
582       continue;
583 
584     R.addSubRegion(ExpandedR, true);
585     ValidRegions.insert(ExpandedR);
586     ValidRegions.erase(CurrentRegion);
587 
588     // Erase all (direct and indirect) children of ExpandedR from the valid
589     // regions and update the number of valid regions.
590     ValidRegion -= eraseAllChildren(ValidRegions, *ExpandedR);
591   }
592 }
593 
594 bool ScopDetection::allBlocksValid(DetectionContext &Context) const {
595   Region &R = Context.CurRegion;
596 
597   for (const BasicBlock *BB : R.blocks()) {
598     Loop *L = LI->getLoopFor(BB);
599     if (L && L->getHeader() == BB && !isValidLoop(L, Context))
600       return false;
601   }
602 
603   for (BasicBlock *BB : R.blocks())
604     if (!isValidCFG(*BB, Context))
605       return false;
606 
607   for (BasicBlock *BB : R.blocks())
608     for (BasicBlock::iterator I = BB->begin(), E = --BB->end(); I != E; ++I)
609       if (!isValidInstruction(*I, Context))
610         return false;
611 
612   return true;
613 }
614 
615 bool ScopDetection::isValidExit(DetectionContext &Context) const {
616   Region &R = Context.CurRegion;
617 
618   // PHI nodes are not allowed in the exit basic block.
619   if (BasicBlock *Exit = R.getExit()) {
620     BasicBlock::iterator I = Exit->begin();
621     if (I != Exit->end() && isa<PHINode>(*I))
622       return invalid<ReportPHIinExit>(Context, /*Assert=*/true);
623   }
624 
625   return true;
626 }
627 
628 bool ScopDetection::isValidRegion(Region &R) const {
629   DetectionContext Context(R, *AA, false /*verifying*/);
630   return isValidRegion(Context);
631 }
632 
633 bool ScopDetection::isValidRegion(DetectionContext &Context) const {
634   Region &R = Context.CurRegion;
635 
636   DEBUG(dbgs() << "Checking region: " << R.getNameStr() << "\n\t");
637 
638   if (R.isTopLevelRegion()) {
639     DEBUG(dbgs() << "Top level region is invalid"; dbgs() << "\n");
640     return false;
641   }
642 
643   if (!R.getEntry()->getName().count(OnlyRegion)) {
644     DEBUG({
645       dbgs() << "Region entry does not match -polly-region-only";
646       dbgs() << "\n";
647     });
648     return false;
649   }
650 
651   if (!R.getEnteringBlock()) {
652     BasicBlock *entry = R.getEntry();
653     Loop *L = LI->getLoopFor(entry);
654 
655     if (L) {
656       if (!L->isLoopSimplifyForm())
657         return invalid<ReportSimpleLoop>(Context, /*Assert=*/true);
658 
659       for (pred_iterator PI = pred_begin(entry), PE = pred_end(entry); PI != PE;
660            ++PI) {
661         // Region entering edges come from the same loop but outside the region
662         // are not allowed.
663         if (L->contains(*PI) && !R.contains(*PI))
664           return invalid<ReportIndEdge>(Context, /*Assert=*/true);
665       }
666     }
667   }
668 
669   // SCoP cannot contain the entry block of the function, because we need
670   // to insert alloca instruction there when translate scalar to array.
671   if (R.getEntry() == &(R.getEntry()->getParent()->getEntryBlock()))
672     return invalid<ReportEntry>(Context, /*Assert=*/true);
673 
674   if (!isValidExit(Context))
675     return false;
676 
677   if (!allBlocksValid(Context))
678     return false;
679 
680   DEBUG(dbgs() << "OK\n");
681   return true;
682 }
683 
684 bool ScopDetection::isValidFunction(llvm::Function &F) {
685   return !InvalidFunctions.count(&F);
686 }
687 
688 void ScopDetection::getDebugLocation(const Region *R, unsigned &LineBegin,
689                                      unsigned &LineEnd, std::string &FileName) {
690   LineBegin = -1;
691   LineEnd = 0;
692 
693   for (const BasicBlock *BB : R->blocks())
694     for (const Instruction &Inst : *BB) {
695       DebugLoc DL = Inst.getDebugLoc();
696       if (DL.isUnknown())
697         continue;
698 
699       DIScope Scope(DL.getScope(Inst.getContext()));
700 
701       if (FileName.empty())
702         FileName = Scope.getFilename();
703 
704       unsigned NewLine = DL.getLine();
705 
706       LineBegin = std::min(LineBegin, NewLine);
707       LineEnd = std::max(LineEnd, NewLine);
708     }
709 }
710 
711 void ScopDetection::printLocations(llvm::Function &F) {
712   for (const Region *R : *this) {
713     unsigned LineEntry, LineExit;
714     std::string FileName;
715 
716     getDebugLocation(R, LineEntry, LineExit, FileName);
717     DiagnosticScopFound Diagnostic(F, FileName, LineEntry, LineExit);
718     F.getContext().diagnose(Diagnostic);
719   }
720 }
721 
722 bool ScopDetection::runOnFunction(llvm::Function &F) {
723   LI = &getAnalysis<LoopInfo>();
724   RI = &getAnalysis<RegionInfo>();
725   if (!DetectScopsWithoutLoops && LI->empty())
726     return false;
727 
728   AA = &getAnalysis<AliasAnalysis>();
729   SE = &getAnalysis<ScalarEvolution>();
730   Region *TopRegion = RI->getTopLevelRegion();
731 
732   releaseMemory();
733 
734   if (OnlyFunction != "" && F.getName() != OnlyFunction)
735     return false;
736 
737   if (!isValidFunction(F))
738     return false;
739 
740   findScops(*TopRegion);
741 
742   if (ReportLevel >= 1)
743     printLocations(F);
744 
745   return false;
746 }
747 
748 void polly::ScopDetection::verifyRegion(const Region &R) const {
749   assert(isMaxRegionInScop(R) && "Expect R is a valid region.");
750   DetectionContext Context(const_cast<Region &>(R), *AA, true /*verifying*/);
751   isValidRegion(Context);
752 }
753 
754 void polly::ScopDetection::verifyAnalysis() const {
755   if (!VerifyScops)
756     return;
757 
758   for (const Region *R : ValidRegions)
759     verifyRegion(*R);
760 }
761 
762 void ScopDetection::getAnalysisUsage(AnalysisUsage &AU) const {
763   AU.addRequired<DominatorTreeWrapperPass>();
764   AU.addRequired<PostDominatorTree>();
765   AU.addRequired<LoopInfo>();
766   AU.addRequired<ScalarEvolution>();
767   // We also need AA and RegionInfo when we are verifying analysis.
768   AU.addRequiredTransitive<AliasAnalysis>();
769   AU.addRequiredTransitive<RegionInfo>();
770   AU.setPreservesAll();
771 }
772 
773 void ScopDetection::print(raw_ostream &OS, const Module *) const {
774   for (const Region *R : ValidRegions)
775     OS << "Valid Region for Scop: " << R->getNameStr() << '\n';
776 
777   OS << "\n";
778 }
779 
780 void ScopDetection::releaseMemory() {
781   ValidRegions.clear();
782   InvalidRegions.clear();
783   // Do not clear the invalid function set.
784 }
785 
786 char ScopDetection::ID = 0;
787 
788 Pass *polly::createScopDetectionPass() { return new ScopDetection(); }
789 
790 INITIALIZE_PASS_BEGIN(ScopDetection, "polly-detect",
791                       "Polly - Detect static control parts (SCoPs)", false,
792                       false);
793 INITIALIZE_AG_DEPENDENCY(AliasAnalysis);
794 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass);
795 INITIALIZE_PASS_DEPENDENCY(LoopInfo);
796 INITIALIZE_PASS_DEPENDENCY(PostDominatorTree);
797 INITIALIZE_PASS_DEPENDENCY(RegionInfo);
798 INITIALIZE_PASS_DEPENDENCY(ScalarEvolution);
799 INITIALIZE_PASS_END(ScopDetection, "polly-detect",
800                     "Polly - Detect static control parts (SCoPs)", false, false)
801