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