1 //===-- LoopUnrollAndJam.cpp - Loop unrolling utilities -------------------===// 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 // This file implements loop unroll and jam as a routine, much like 11 // LoopUnroll.cpp implements loop unroll. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/ADT/SmallPtrSet.h" 16 #include "llvm/ADT/Statistic.h" 17 #include "llvm/Analysis/AssumptionCache.h" 18 #include "llvm/Analysis/DependenceAnalysis.h" 19 #include "llvm/Analysis/InstructionSimplify.h" 20 #include "llvm/Analysis/LoopAnalysisManager.h" 21 #include "llvm/Analysis/LoopIterator.h" 22 #include "llvm/Analysis/LoopPass.h" 23 #include "llvm/Analysis/OptimizationRemarkEmitter.h" 24 #include "llvm/Analysis/ScalarEvolution.h" 25 #include "llvm/Analysis/ScalarEvolutionExpander.h" 26 #include "llvm/Analysis/Utils/Local.h" 27 #include "llvm/IR/BasicBlock.h" 28 #include "llvm/IR/DataLayout.h" 29 #include "llvm/IR/DebugInfoMetadata.h" 30 #include "llvm/IR/Dominators.h" 31 #include "llvm/IR/IntrinsicInst.h" 32 #include "llvm/IR/LLVMContext.h" 33 #include "llvm/Support/Debug.h" 34 #include "llvm/Support/raw_ostream.h" 35 #include "llvm/Transforms/Utils/BasicBlockUtils.h" 36 #include "llvm/Transforms/Utils/Cloning.h" 37 #include "llvm/Transforms/Utils/LoopSimplify.h" 38 #include "llvm/Transforms/Utils/LoopUtils.h" 39 #include "llvm/Transforms/Utils/SimplifyIndVar.h" 40 #include "llvm/Transforms/Utils/UnrollLoop.h" 41 using namespace llvm; 42 43 #define DEBUG_TYPE "loop-unroll-and-jam" 44 45 STATISTIC(NumUnrolledAndJammed, "Number of loops unroll and jammed"); 46 STATISTIC(NumCompletelyUnrolledAndJammed, "Number of loops unroll and jammed"); 47 48 typedef SmallPtrSet<BasicBlock *, 4> BasicBlockSet; 49 50 // Partition blocks in an outer/inner loop pair into blocks before and after 51 // the loop 52 static bool partitionOuterLoopBlocks(Loop *L, Loop *SubLoop, 53 BasicBlockSet &ForeBlocks, 54 BasicBlockSet &SubLoopBlocks, 55 BasicBlockSet &AftBlocks, 56 DominatorTree *DT) { 57 BasicBlock *SubLoopLatch = SubLoop->getLoopLatch(); 58 SubLoopBlocks.insert(SubLoop->block_begin(), SubLoop->block_end()); 59 60 for (BasicBlock *BB : L->blocks()) { 61 if (!SubLoop->contains(BB)) { 62 if (DT->dominates(SubLoopLatch, BB)) 63 AftBlocks.insert(BB); 64 else 65 ForeBlocks.insert(BB); 66 } 67 } 68 69 // Check that all blocks in ForeBlocks together dominate the subloop 70 // TODO: This might ideally be done better with a dominator/postdominators. 71 BasicBlock *SubLoopPreHeader = SubLoop->getLoopPreheader(); 72 for (BasicBlock *BB : ForeBlocks) { 73 if (BB == SubLoopPreHeader) 74 continue; 75 TerminatorInst *TI = BB->getTerminator(); 76 for (unsigned i = 0, e = TI->getNumSuccessors(); i != e; ++i) 77 if (!ForeBlocks.count(TI->getSuccessor(i))) 78 return false; 79 } 80 81 return true; 82 } 83 84 // Move the phi operands of Header from Latch out of AftBlocks to InsertLoc. 85 static void moveHeaderPhiOperandsToForeBlocks(BasicBlock *Header, 86 BasicBlock *Latch, 87 Instruction *InsertLoc, 88 BasicBlockSet &AftBlocks) { 89 // We need to ensure we move the instructions in the correct order, 90 // starting with the earliest required instruction and moving forward. 91 std::vector<Instruction *> Worklist; 92 std::vector<Instruction *> Visited; 93 for (auto &Phi : Header->phis()) { 94 Value *V = Phi.getIncomingValueForBlock(Latch); 95 if (Instruction *I = dyn_cast<Instruction>(V)) 96 Worklist.push_back(I); 97 } 98 99 while (!Worklist.empty()) { 100 Instruction *I = Worklist.back(); 101 Worklist.pop_back(); 102 if (!AftBlocks.count(I->getParent())) 103 continue; 104 105 Visited.push_back(I); 106 for (auto &U : I->operands()) 107 if (Instruction *II = dyn_cast<Instruction>(U)) 108 Worklist.push_back(II); 109 } 110 111 // Move all instructions in program order to before the InsertLoc 112 BasicBlock *InsertLocBB = InsertLoc->getParent(); 113 for (Instruction *I : reverse(Visited)) { 114 if (I->getParent() != InsertLocBB) 115 I->moveBefore(InsertLoc); 116 } 117 } 118 119 /* 120 This method performs Unroll and Jam. For a simple loop like: 121 for (i = ..) 122 Fore(i) 123 for (j = ..) 124 SubLoop(i, j) 125 Aft(i) 126 127 Instead of doing normal inner or outer unrolling, we do: 128 for (i = .., i+=2) 129 Fore(i) 130 Fore(i+1) 131 for (j = ..) 132 SubLoop(i, j) 133 SubLoop(i+1, j) 134 Aft(i) 135 Aft(i+1) 136 137 So the outer loop is essetially unrolled and then the inner loops are fused 138 ("jammed") together into a single loop. This can increase speed when there 139 are loads in SubLoop that are invariant to i, as they become shared between 140 the now jammed inner loops. 141 142 We do this by spliting the blocks in the loop into Fore, Subloop and Aft. 143 Fore blocks are those before the inner loop, Aft are those after. Normal 144 Unroll code is used to copy each of these sets of blocks and the results are 145 combined together into the final form above. 146 147 isSafeToUnrollAndJam should be used prior to calling this to make sure the 148 unrolling will be valid. Checking profitablility is also advisable. 149 */ 150 LoopUnrollResult 151 llvm::UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount, 152 unsigned TripMultiple, bool UnrollRemainder, 153 LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, 154 AssumptionCache *AC, OptimizationRemarkEmitter *ORE) { 155 156 // When we enter here we should have already checked that it is safe 157 BasicBlock *Header = L->getHeader(); 158 assert(L->getSubLoops().size() == 1); 159 Loop *SubLoop = *L->begin(); 160 161 // Don't enter the unroll code if there is nothing to do. 162 if (TripCount == 0 && Count < 2) { 163 LLVM_DEBUG(dbgs() << "Won't unroll; almost nothing to do\n"); 164 return LoopUnrollResult::Unmodified; 165 } 166 167 assert(Count > 0); 168 assert(TripMultiple > 0); 169 assert(TripCount == 0 || TripCount % TripMultiple == 0); 170 171 // Are we eliminating the loop control altogether? 172 bool CompletelyUnroll = (Count == TripCount); 173 174 // We use the runtime remainder in cases where we don't know trip multiple 175 if (TripMultiple == 1 || TripMultiple % Count != 0) { 176 if (!UnrollRuntimeLoopRemainder(L, Count, /*AllowExpensiveTripCount*/ false, 177 /*UseEpilogRemainder*/ true, 178 UnrollRemainder, LI, SE, DT, AC, true)) { 179 LLVM_DEBUG(dbgs() << "Won't unroll-and-jam; remainder loop could not be " 180 "generated when assuming runtime trip count\n"); 181 return LoopUnrollResult::Unmodified; 182 } 183 } 184 185 // Notify ScalarEvolution that the loop will be substantially changed, 186 // if not outright eliminated. 187 if (SE) { 188 SE->forgetLoop(L); 189 SE->forgetLoop(SubLoop); 190 } 191 192 using namespace ore; 193 // Report the unrolling decision. 194 if (CompletelyUnroll) { 195 LLVM_DEBUG(dbgs() << "COMPLETELY UNROLL AND JAMMING loop %" 196 << Header->getName() << " with trip count " << TripCount 197 << "!\n"); 198 ORE->emit(OptimizationRemark(DEBUG_TYPE, "FullyUnrolled", L->getStartLoc(), 199 L->getHeader()) 200 << "completely unroll and jammed loop with " 201 << NV("UnrollCount", TripCount) << " iterations"); 202 } else { 203 auto DiagBuilder = [&]() { 204 OptimizationRemark Diag(DEBUG_TYPE, "PartialUnrolled", L->getStartLoc(), 205 L->getHeader()); 206 return Diag << "unroll and jammed loop by a factor of " 207 << NV("UnrollCount", Count); 208 }; 209 210 LLVM_DEBUG(dbgs() << "UNROLL AND JAMMING loop %" << Header->getName() 211 << " by " << Count); 212 if (TripMultiple != 1) { 213 LLVM_DEBUG(dbgs() << " with " << TripMultiple << " trips per branch"); 214 ORE->emit([&]() { 215 return DiagBuilder() << " with " << NV("TripMultiple", TripMultiple) 216 << " trips per branch"; 217 }); 218 } else { 219 LLVM_DEBUG(dbgs() << " with run-time trip count"); 220 ORE->emit([&]() { return DiagBuilder() << " with run-time trip count"; }); 221 } 222 LLVM_DEBUG(dbgs() << "!\n"); 223 } 224 225 BasicBlock *Preheader = L->getLoopPreheader(); 226 BasicBlock *LatchBlock = L->getLoopLatch(); 227 BranchInst *BI = dyn_cast<BranchInst>(LatchBlock->getTerminator()); 228 assert(Preheader && LatchBlock && Header); 229 assert(BI && !BI->isUnconditional()); 230 bool ContinueOnTrue = L->contains(BI->getSuccessor(0)); 231 BasicBlock *LoopExit = BI->getSuccessor(ContinueOnTrue); 232 bool SubLoopContinueOnTrue = SubLoop->contains( 233 SubLoop->getLoopLatch()->getTerminator()->getSuccessor(0)); 234 235 // Partition blocks in an outer/inner loop pair into blocks before and after 236 // the loop 237 BasicBlockSet SubLoopBlocks; 238 BasicBlockSet ForeBlocks; 239 BasicBlockSet AftBlocks; 240 partitionOuterLoopBlocks(L, SubLoop, ForeBlocks, SubLoopBlocks, AftBlocks, 241 DT); 242 243 // We keep track of the entering/first and exiting/last block of each of 244 // Fore/SubLoop/Aft in each iteration. This helps make the stapling up of 245 // blocks easier. 246 std::vector<BasicBlock *> ForeBlocksFirst; 247 std::vector<BasicBlock *> ForeBlocksLast; 248 std::vector<BasicBlock *> SubLoopBlocksFirst; 249 std::vector<BasicBlock *> SubLoopBlocksLast; 250 std::vector<BasicBlock *> AftBlocksFirst; 251 std::vector<BasicBlock *> AftBlocksLast; 252 ForeBlocksFirst.push_back(Header); 253 ForeBlocksLast.push_back(SubLoop->getLoopPreheader()); 254 SubLoopBlocksFirst.push_back(SubLoop->getHeader()); 255 SubLoopBlocksLast.push_back(SubLoop->getExitingBlock()); 256 AftBlocksFirst.push_back(SubLoop->getExitBlock()); 257 AftBlocksLast.push_back(L->getExitingBlock()); 258 // Maps Blocks[0] -> Blocks[It] 259 ValueToValueMapTy LastValueMap; 260 261 // Move any instructions from fore phi operands from AftBlocks into Fore. 262 moveHeaderPhiOperandsToForeBlocks( 263 Header, LatchBlock, SubLoop->getLoopPreheader()->getTerminator(), 264 AftBlocks); 265 266 // The current on-the-fly SSA update requires blocks to be processed in 267 // reverse postorder so that LastValueMap contains the correct value at each 268 // exit. 269 LoopBlocksDFS DFS(L); 270 DFS.perform(LI); 271 // Stash the DFS iterators before adding blocks to the loop. 272 LoopBlocksDFS::RPOIterator BlockBegin = DFS.beginRPO(); 273 LoopBlocksDFS::RPOIterator BlockEnd = DFS.endRPO(); 274 275 if (Header->getParent()->isDebugInfoForProfiling()) 276 for (BasicBlock *BB : L->getBlocks()) 277 for (Instruction &I : *BB) 278 if (!isa<DbgInfoIntrinsic>(&I)) 279 if (const DILocation *DIL = I.getDebugLoc()) 280 I.setDebugLoc(DIL->cloneWithDuplicationFactor(Count)); 281 282 // Copy all blocks 283 for (unsigned It = 1; It != Count; ++It) { 284 std::vector<BasicBlock *> NewBlocks; 285 // Maps Blocks[It] -> Blocks[It-1] 286 DenseMap<Value *, Value *> PrevItValueMap; 287 288 for (LoopBlocksDFS::RPOIterator BB = BlockBegin; BB != BlockEnd; ++BB) { 289 ValueToValueMapTy VMap; 290 BasicBlock *New = CloneBasicBlock(*BB, VMap, "." + Twine(It)); 291 Header->getParent()->getBasicBlockList().push_back(New); 292 293 if (ForeBlocks.count(*BB)) { 294 L->addBasicBlockToLoop(New, *LI); 295 296 if (*BB == ForeBlocksFirst[0]) 297 ForeBlocksFirst.push_back(New); 298 if (*BB == ForeBlocksLast[0]) 299 ForeBlocksLast.push_back(New); 300 } else if (SubLoopBlocks.count(*BB)) { 301 SubLoop->addBasicBlockToLoop(New, *LI); 302 303 if (*BB == SubLoopBlocksFirst[0]) 304 SubLoopBlocksFirst.push_back(New); 305 if (*BB == SubLoopBlocksLast[0]) 306 SubLoopBlocksLast.push_back(New); 307 } else if (AftBlocks.count(*BB)) { 308 L->addBasicBlockToLoop(New, *LI); 309 310 if (*BB == AftBlocksFirst[0]) 311 AftBlocksFirst.push_back(New); 312 if (*BB == AftBlocksLast[0]) 313 AftBlocksLast.push_back(New); 314 } else { 315 llvm_unreachable("BB being cloned should be in Fore/Sub/Aft"); 316 } 317 318 // Update our running maps of newest clones 319 PrevItValueMap[New] = (It == 1 ? *BB : LastValueMap[*BB]); 320 LastValueMap[*BB] = New; 321 for (ValueToValueMapTy::iterator VI = VMap.begin(), VE = VMap.end(); 322 VI != VE; ++VI) { 323 PrevItValueMap[VI->second] = 324 const_cast<Value *>(It == 1 ? VI->first : LastValueMap[VI->first]); 325 LastValueMap[VI->first] = VI->second; 326 } 327 328 NewBlocks.push_back(New); 329 330 // Update DomTree: 331 if (*BB == ForeBlocksFirst[0]) 332 DT->addNewBlock(New, ForeBlocksLast[It - 1]); 333 else if (*BB == SubLoopBlocksFirst[0]) 334 DT->addNewBlock(New, SubLoopBlocksLast[It - 1]); 335 else if (*BB == AftBlocksFirst[0]) 336 DT->addNewBlock(New, AftBlocksLast[It - 1]); 337 else { 338 // Each set of blocks (Fore/Sub/Aft) will have the same internal domtree 339 // structure. 340 auto BBDomNode = DT->getNode(*BB); 341 auto BBIDom = BBDomNode->getIDom(); 342 BasicBlock *OriginalBBIDom = BBIDom->getBlock(); 343 assert(OriginalBBIDom); 344 assert(LastValueMap[cast<Value>(OriginalBBIDom)]); 345 DT->addNewBlock( 346 New, cast<BasicBlock>(LastValueMap[cast<Value>(OriginalBBIDom)])); 347 } 348 } 349 350 // Remap all instructions in the most recent iteration 351 for (BasicBlock *NewBlock : NewBlocks) { 352 for (Instruction &I : *NewBlock) { 353 ::remapInstruction(&I, LastValueMap); 354 if (auto *II = dyn_cast<IntrinsicInst>(&I)) 355 if (II->getIntrinsicID() == Intrinsic::assume) 356 AC->registerAssumption(II); 357 } 358 } 359 360 // Alter the ForeBlocks phi's, pointing them at the latest version of the 361 // value from the previous iteration's phis 362 for (PHINode &Phi : ForeBlocksFirst[It]->phis()) { 363 Value *OldValue = Phi.getIncomingValueForBlock(AftBlocksLast[It]); 364 assert(OldValue && "should have incoming edge from Aft[It]"); 365 Value *NewValue = OldValue; 366 if (Value *PrevValue = PrevItValueMap[OldValue]) 367 NewValue = PrevValue; 368 369 assert(Phi.getNumOperands() == 2); 370 Phi.setIncomingBlock(0, ForeBlocksLast[It - 1]); 371 Phi.setIncomingValue(0, NewValue); 372 Phi.removeIncomingValue(1); 373 } 374 } 375 376 // Now that all the basic blocks for the unrolled iterations are in place, 377 // finish up connecting the blocks and phi nodes. At this point LastValueMap 378 // is the last unrolled iterations values. 379 380 // Update Phis in BB from OldBB to point to NewBB 381 auto updatePHIBlocks = [](BasicBlock *BB, BasicBlock *OldBB, 382 BasicBlock *NewBB) { 383 for (PHINode &Phi : BB->phis()) { 384 int I = Phi.getBasicBlockIndex(OldBB); 385 Phi.setIncomingBlock(I, NewBB); 386 } 387 }; 388 // Update Phis in BB from OldBB to point to NewBB and use the latest value 389 // from LastValueMap 390 auto updatePHIBlocksAndValues = [](BasicBlock *BB, BasicBlock *OldBB, 391 BasicBlock *NewBB, 392 ValueToValueMapTy &LastValueMap) { 393 for (PHINode &Phi : BB->phis()) { 394 for (unsigned b = 0; b < Phi.getNumIncomingValues(); ++b) { 395 if (Phi.getIncomingBlock(b) == OldBB) { 396 Value *OldValue = Phi.getIncomingValue(b); 397 if (Value *LastValue = LastValueMap[OldValue]) 398 Phi.setIncomingValue(b, LastValue); 399 Phi.setIncomingBlock(b, NewBB); 400 break; 401 } 402 } 403 } 404 }; 405 // Move all the phis from Src into Dest 406 auto movePHIs = [](BasicBlock *Src, BasicBlock *Dest) { 407 Instruction *insertPoint = Dest->getFirstNonPHI(); 408 while (PHINode *Phi = dyn_cast<PHINode>(Src->begin())) 409 Phi->moveBefore(insertPoint); 410 }; 411 412 // Update the PHI values outside the loop to point to the last block 413 updatePHIBlocksAndValues(LoopExit, AftBlocksLast[0], AftBlocksLast.back(), 414 LastValueMap); 415 416 // Update ForeBlocks successors and phi nodes 417 BranchInst *ForeTerm = 418 cast<BranchInst>(ForeBlocksLast.back()->getTerminator()); 419 BasicBlock *Dest = SubLoopBlocksFirst[0]; 420 ForeTerm->setSuccessor(0, Dest); 421 422 if (CompletelyUnroll) { 423 while (PHINode *Phi = dyn_cast<PHINode>(ForeBlocksFirst[0]->begin())) { 424 Phi->replaceAllUsesWith(Phi->getIncomingValueForBlock(Preheader)); 425 Phi->getParent()->getInstList().erase(Phi); 426 } 427 } else { 428 // Update the PHI values to point to the last aft block 429 updatePHIBlocksAndValues(ForeBlocksFirst[0], AftBlocksLast[0], 430 AftBlocksLast.back(), LastValueMap); 431 } 432 433 for (unsigned It = 1; It != Count; It++) { 434 // Remap ForeBlock successors from previous iteration to this 435 BranchInst *ForeTerm = 436 cast<BranchInst>(ForeBlocksLast[It - 1]->getTerminator()); 437 BasicBlock *Dest = ForeBlocksFirst[It]; 438 ForeTerm->setSuccessor(0, Dest); 439 } 440 441 // Subloop successors and phis 442 BranchInst *SubTerm = 443 cast<BranchInst>(SubLoopBlocksLast.back()->getTerminator()); 444 SubTerm->setSuccessor(!SubLoopContinueOnTrue, SubLoopBlocksFirst[0]); 445 SubTerm->setSuccessor(SubLoopContinueOnTrue, AftBlocksFirst[0]); 446 updatePHIBlocks(SubLoopBlocksFirst[0], ForeBlocksLast[0], 447 ForeBlocksLast.back()); 448 updatePHIBlocks(SubLoopBlocksFirst[0], SubLoopBlocksLast[0], 449 SubLoopBlocksLast.back()); 450 451 for (unsigned It = 1; It != Count; It++) { 452 // Replace the conditional branch of the previous iteration subloop with an 453 // unconditional one to this one 454 BranchInst *SubTerm = 455 cast<BranchInst>(SubLoopBlocksLast[It - 1]->getTerminator()); 456 BranchInst::Create(SubLoopBlocksFirst[It], SubTerm); 457 SubTerm->eraseFromParent(); 458 459 updatePHIBlocks(SubLoopBlocksFirst[It], ForeBlocksLast[It], 460 ForeBlocksLast.back()); 461 updatePHIBlocks(SubLoopBlocksFirst[It], SubLoopBlocksLast[It], 462 SubLoopBlocksLast.back()); 463 movePHIs(SubLoopBlocksFirst[It], SubLoopBlocksFirst[0]); 464 } 465 466 // Aft blocks successors and phis 467 BranchInst *Term = cast<BranchInst>(AftBlocksLast.back()->getTerminator()); 468 if (CompletelyUnroll) { 469 BranchInst::Create(LoopExit, Term); 470 Term->eraseFromParent(); 471 } else { 472 Term->setSuccessor(!ContinueOnTrue, ForeBlocksFirst[0]); 473 } 474 updatePHIBlocks(AftBlocksFirst[0], SubLoopBlocksLast[0], 475 SubLoopBlocksLast.back()); 476 477 for (unsigned It = 1; It != Count; It++) { 478 // Replace the conditional branch of the previous iteration subloop with an 479 // unconditional one to this one 480 BranchInst *AftTerm = 481 cast<BranchInst>(AftBlocksLast[It - 1]->getTerminator()); 482 BranchInst::Create(AftBlocksFirst[It], AftTerm); 483 AftTerm->eraseFromParent(); 484 485 updatePHIBlocks(AftBlocksFirst[It], SubLoopBlocksLast[It], 486 SubLoopBlocksLast.back()); 487 movePHIs(AftBlocksFirst[It], AftBlocksFirst[0]); 488 } 489 490 // Dominator Tree. Remove the old links between Fore, Sub and Aft, adding the 491 // new ones required. 492 if (Count != 1) { 493 SmallVector<DominatorTree::UpdateType, 4> DTUpdates; 494 DTUpdates.emplace_back(DominatorTree::UpdateKind::Delete, ForeBlocksLast[0], 495 SubLoopBlocksFirst[0]); 496 DTUpdates.emplace_back(DominatorTree::UpdateKind::Delete, 497 SubLoopBlocksLast[0], AftBlocksFirst[0]); 498 499 DTUpdates.emplace_back(DominatorTree::UpdateKind::Insert, 500 ForeBlocksLast.back(), SubLoopBlocksFirst[0]); 501 DTUpdates.emplace_back(DominatorTree::UpdateKind::Insert, 502 SubLoopBlocksLast.back(), AftBlocksFirst[0]); 503 DT->applyUpdates(DTUpdates); 504 } 505 506 // Merge adjacent basic blocks, if possible. 507 SmallPtrSet<BasicBlock *, 16> MergeBlocks; 508 MergeBlocks.insert(ForeBlocksLast.begin(), ForeBlocksLast.end()); 509 MergeBlocks.insert(SubLoopBlocksLast.begin(), SubLoopBlocksLast.end()); 510 MergeBlocks.insert(AftBlocksLast.begin(), AftBlocksLast.end()); 511 while (!MergeBlocks.empty()) { 512 BasicBlock *BB = *MergeBlocks.begin(); 513 BranchInst *Term = dyn_cast<BranchInst>(BB->getTerminator()); 514 if (Term && Term->isUnconditional() && L->contains(Term->getSuccessor(0))) { 515 BasicBlock *Dest = Term->getSuccessor(0); 516 if (BasicBlock *Fold = foldBlockIntoPredecessor(Dest, LI, SE, DT)) { 517 // Don't remove BB and add Fold as they are the same BB 518 assert(Fold == BB); 519 (void)Fold; 520 MergeBlocks.erase(Dest); 521 } else 522 MergeBlocks.erase(BB); 523 } else 524 MergeBlocks.erase(BB); 525 } 526 527 // At this point, the code is well formed. We now do a quick sweep over the 528 // inserted code, doing constant propagation and dead code elimination as we 529 // go. 530 simplifyLoopAfterUnroll(SubLoop, true, LI, SE, DT, AC); 531 simplifyLoopAfterUnroll(L, !CompletelyUnroll && Count > 1, LI, SE, DT, AC); 532 533 NumCompletelyUnrolledAndJammed += CompletelyUnroll; 534 ++NumUnrolledAndJammed; 535 536 #ifndef NDEBUG 537 // We shouldn't have done anything to break loop simplify form or LCSSA. 538 Loop *OuterL = L->getParentLoop(); 539 Loop *OutestLoop = OuterL ? OuterL : (!CompletelyUnroll ? L : SubLoop); 540 assert(OutestLoop->isRecursivelyLCSSAForm(*DT, *LI)); 541 if (!CompletelyUnroll) 542 assert(L->isLoopSimplifyForm()); 543 assert(SubLoop->isLoopSimplifyForm()); 544 assert(DT->verify()); 545 #endif 546 547 // Update LoopInfo if the loop is completely removed. 548 if (CompletelyUnroll) 549 LI->erase(L); 550 551 return CompletelyUnroll ? LoopUnrollResult::FullyUnrolled 552 : LoopUnrollResult::PartiallyUnrolled; 553 } 554 555 static bool getLoadsAndStores(BasicBlockSet &Blocks, 556 SmallVector<Value *, 4> &MemInstr) { 557 // Scan the BBs and collect legal loads and stores. 558 // Returns false if non-simple loads/stores are found. 559 for (BasicBlock *BB : Blocks) { 560 for (Instruction &I : *BB) { 561 if (auto *Ld = dyn_cast<LoadInst>(&I)) { 562 if (!Ld->isSimple()) 563 return false; 564 MemInstr.push_back(&I); 565 } else if (auto *St = dyn_cast<StoreInst>(&I)) { 566 if (!St->isSimple()) 567 return false; 568 MemInstr.push_back(&I); 569 } else if (I.mayReadOrWriteMemory()) { 570 return false; 571 } 572 } 573 } 574 return true; 575 } 576 577 static bool checkDependencies(SmallVector<Value *, 4> &Earlier, 578 SmallVector<Value *, 4> &Later, 579 unsigned LoopDepth, bool InnerLoop, 580 DependenceInfo &DI) { 581 // Use DA to check for dependencies between loads and stores that make unroll 582 // and jam invalid 583 for (Value *I : Earlier) { 584 for (Value *J : Later) { 585 Instruction *Src = cast<Instruction>(I); 586 Instruction *Dst = cast<Instruction>(J); 587 if (Src == Dst) 588 continue; 589 // Ignore Input dependencies. 590 if (isa<LoadInst>(Src) && isa<LoadInst>(Dst)) 591 continue; 592 593 // Track dependencies, and if we find them take a conservative approach 594 // by allowing only = or < (not >), altough some > would be safe 595 // (depending upon unroll width). 596 // For the inner loop, we need to disallow any (> <) dependencies 597 // FIXME: Allow > so long as distance is less than unroll width 598 if (auto D = DI.depends(Src, Dst, true)) { 599 assert(D->isOrdered() && "Expected an output, flow or anti dep."); 600 601 if (D->isConfused()) 602 return false; 603 if (!InnerLoop) { 604 if (D->getDirection(LoopDepth) & Dependence::DVEntry::GT) 605 return false; 606 } else { 607 assert(LoopDepth + 1 <= D->getLevels()); 608 if (D->getDirection(LoopDepth) & Dependence::DVEntry::GT && 609 D->getDirection(LoopDepth + 1) & Dependence::DVEntry::LT) 610 return false; 611 } 612 } 613 } 614 } 615 return true; 616 } 617 618 static bool checkDependencies(Loop *L, BasicBlockSet &ForeBlocks, 619 BasicBlockSet &SubLoopBlocks, 620 BasicBlockSet &AftBlocks, DependenceInfo &DI) { 621 // Get all loads/store pairs for each blocks 622 SmallVector<Value *, 4> ForeMemInstr; 623 SmallVector<Value *, 4> SubLoopMemInstr; 624 SmallVector<Value *, 4> AftMemInstr; 625 if (!getLoadsAndStores(ForeBlocks, ForeMemInstr) || 626 !getLoadsAndStores(SubLoopBlocks, SubLoopMemInstr) || 627 !getLoadsAndStores(AftBlocks, AftMemInstr)) 628 return false; 629 630 // Check for dependencies between any blocks that may change order 631 unsigned LoopDepth = L->getLoopDepth(); 632 return checkDependencies(ForeMemInstr, SubLoopMemInstr, LoopDepth, false, 633 DI) && 634 checkDependencies(ForeMemInstr, AftMemInstr, LoopDepth, false, DI) && 635 checkDependencies(SubLoopMemInstr, AftMemInstr, LoopDepth, false, 636 DI) && 637 checkDependencies(SubLoopMemInstr, SubLoopMemInstr, LoopDepth, true, 638 DI); 639 } 640 641 bool llvm::isSafeToUnrollAndJam(Loop *L, ScalarEvolution &SE, DominatorTree &DT, 642 DependenceInfo &DI) { 643 /* We currently handle outer loops like this: 644 | 645 ForeFirst <----\ } 646 Blocks | } ForeBlocks 647 ForeLast | } 648 | | 649 SubLoopFirst <\ | } 650 Blocks | | } SubLoopBlocks 651 SubLoopLast -/ | } 652 | | 653 AftFirst | } 654 Blocks | } AftBlocks 655 AftLast ------/ } 656 | 657 658 There are (theoretically) any number of blocks in ForeBlocks, SubLoopBlocks 659 and AftBlocks, providing that there is one edge from Fores to SubLoops, 660 one edge from SubLoops to Afts and a single outer loop exit (from Afts). 661 In practice we currently limit Aft blocks to a single block, and limit 662 things further in the profitablility checks of the unroll and jam pass. 663 664 Because of the way we rearrange basic blocks, we also require that 665 the Fore blocks on all unrolled iterations are safe to move before the 666 SubLoop blocks of all iterations. So we require that the phi node looping 667 operands of ForeHeader can be moved to at least the end of ForeEnd, so that 668 we can arrange cloned Fore Blocks before the subloop and match up Phi's 669 correctly. 670 671 i.e. The old order of blocks used to be F1 S1_1 S1_2 A1 F2 S2_1 S2_2 A2. 672 It needs to be safe to tranform this to F1 F2 S1_1 S2_1 S1_2 S2_2 A1 A2. 673 674 There are then a number of checks along the lines of no calls, no 675 exceptions, inner loop IV is consistent, etc. Note that for loops requiring 676 runtime unrolling, UnrollRuntimeLoopRemainder can also fail in 677 UnrollAndJamLoop if the trip count cannot be easily calculated. 678 */ 679 680 if (!L->isLoopSimplifyForm() || L->getSubLoops().size() != 1) 681 return false; 682 Loop *SubLoop = L->getSubLoops()[0]; 683 if (!SubLoop->isLoopSimplifyForm()) 684 return false; 685 686 BasicBlock *Header = L->getHeader(); 687 BasicBlock *Latch = L->getLoopLatch(); 688 BasicBlock *Exit = L->getExitingBlock(); 689 BasicBlock *SubLoopHeader = SubLoop->getHeader(); 690 BasicBlock *SubLoopLatch = SubLoop->getLoopLatch(); 691 BasicBlock *SubLoopExit = SubLoop->getExitingBlock(); 692 693 if (Latch != Exit) 694 return false; 695 if (SubLoopLatch != SubLoopExit) 696 return false; 697 698 if (Header->hasAddressTaken() || SubLoopHeader->hasAddressTaken()) 699 return false; 700 701 // Split blocks into Fore/SubLoop/Aft based on dominators 702 BasicBlockSet SubLoopBlocks; 703 BasicBlockSet ForeBlocks; 704 BasicBlockSet AftBlocks; 705 if (!partitionOuterLoopBlocks(L, SubLoop, ForeBlocks, SubLoopBlocks, 706 AftBlocks, &DT)) 707 return false; 708 709 // Aft blocks may need to move instructions to fore blocks, which becomes more 710 // difficult if there are multiple (potentially conditionally executed) 711 // blocks. For now we just exclude loops with multiple aft blocks. 712 if (AftBlocks.size() != 1) 713 return false; 714 715 // Check inner loop IV is consistent between all iterations 716 const SCEV *SubLoopBECountSC = SE.getExitCount(SubLoop, SubLoopLatch); 717 if (isa<SCEVCouldNotCompute>(SubLoopBECountSC) || 718 !SubLoopBECountSC->getType()->isIntegerTy()) 719 return false; 720 ScalarEvolution::LoopDisposition LD = 721 SE.getLoopDisposition(SubLoopBECountSC, L); 722 if (LD != ScalarEvolution::LoopInvariant) 723 return false; 724 725 // Check the loop safety info for exceptions. 726 LoopSafetyInfo LSI; 727 computeLoopSafetyInfo(&LSI, L); 728 if (LSI.MayThrow) 729 return false; 730 731 // We've ruled out the easy stuff and now need to check that there are no 732 // interdependencies which may prevent us from moving the: 733 // ForeBlocks before Subloop and AftBlocks. 734 // Subloop before AftBlocks. 735 // ForeBlock phi operands before the subloop 736 737 // Make sure we can move all instructions we need to before the subloop 738 SmallVector<Instruction *, 8> Worklist; 739 SmallPtrSet<Instruction *, 8> Visited; 740 for (auto &Phi : Header->phis()) { 741 Value *V = Phi.getIncomingValueForBlock(Latch); 742 if (Instruction *I = dyn_cast<Instruction>(V)) 743 Worklist.push_back(I); 744 } 745 while (!Worklist.empty()) { 746 Instruction *I = Worklist.back(); 747 Worklist.pop_back(); 748 if (Visited.insert(I).second) { 749 if (SubLoop->contains(I->getParent())) 750 return false; 751 if (AftBlocks.count(I->getParent())) { 752 // If we hit a phi node in afts we know we are done (probably LCSSA) 753 if (isa<PHINode>(I)) 754 return false; 755 if (I->mayHaveSideEffects() || I->mayReadOrWriteMemory()) 756 return false; 757 for (auto &U : I->operands()) 758 if (Instruction *II = dyn_cast<Instruction>(U)) 759 Worklist.push_back(II); 760 } 761 } 762 } 763 764 // Check for memory dependencies which prohibit the unrolling we are doing. 765 // Because of the way we are unrolling Fore/Sub/Aft blocks, we need to check 766 // there are no dependencies between Fore-Sub, Fore-Aft, Sub-Aft and Sub-Sub. 767 if (!checkDependencies(L, ForeBlocks, SubLoopBlocks, AftBlocks, DI)) 768 return false; 769 770 return true; 771 } 772