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