1 //===- LoopVersioning.cpp - Utility to version a loop ---------------------===//
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 defines a utility class to perform loop versioning.  The versioned
11 // loop speculates that otherwise may-aliasing memory accesses don't overlap and
12 // emits checks to prove this.
13 //
14 //===----------------------------------------------------------------------===//
15 
16 #include "llvm/Transforms/Utils/LoopVersioning.h"
17 #include "llvm/Analysis/LoopAccessAnalysis.h"
18 #include "llvm/Analysis/LoopInfo.h"
19 #include "llvm/Analysis/ScalarEvolutionExpander.h"
20 #include "llvm/IR/Dominators.h"
21 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
22 #include "llvm/Transforms/Utils/Cloning.h"
23 
24 using namespace llvm;
25 
26 LoopVersioning::LoopVersioning(const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI,
27                                DominatorTree *DT, ScalarEvolution *SE,
28                                bool UseLAIChecks)
29     : VersionedLoop(L), NonVersionedLoop(nullptr), LAI(LAI), LI(LI), DT(DT),
30       SE(SE) {
31   assert(L->getExitBlock() && "No single exit block");
32   assert(L->getLoopPreheader() && "No preheader");
33   if (UseLAIChecks) {
34     setAliasChecks(LAI.getRuntimePointerChecking()->getChecks());
35     setSCEVChecks(LAI.PSE.getUnionPredicate());
36   }
37 }
38 
39 void LoopVersioning::setAliasChecks(
40     const SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks) {
41   AliasChecks = std::move(Checks);
42 }
43 
44 void LoopVersioning::setSCEVChecks(SCEVUnionPredicate Check) {
45   Preds = std::move(Check);
46 }
47 
48 void LoopVersioning::versionLoop(
49     const SmallVectorImpl<Instruction *> &DefsUsedOutside) {
50   Instruction *FirstCheckInst;
51   Instruction *MemRuntimeCheck;
52   Value *SCEVRuntimeCheck;
53   Value *RuntimeCheck = nullptr;
54 
55   // Add the memcheck in the original preheader (this is empty initially).
56   BasicBlock *RuntimeCheckBB = VersionedLoop->getLoopPreheader();
57   std::tie(FirstCheckInst, MemRuntimeCheck) =
58       LAI.addRuntimeChecks(RuntimeCheckBB->getTerminator(), AliasChecks);
59 
60   const SCEVUnionPredicate &Pred = LAI.PSE.getUnionPredicate();
61   SCEVExpander Exp(*SE, RuntimeCheckBB->getModule()->getDataLayout(),
62                    "scev.check");
63   SCEVRuntimeCheck =
64       Exp.expandCodeForPredicate(&Pred, RuntimeCheckBB->getTerminator());
65   auto *CI = dyn_cast<ConstantInt>(SCEVRuntimeCheck);
66 
67   // Discard the SCEV runtime check if it is always true.
68   if (CI && CI->isZero())
69     SCEVRuntimeCheck = nullptr;
70 
71   if (MemRuntimeCheck && SCEVRuntimeCheck) {
72     RuntimeCheck = BinaryOperator::Create(Instruction::Or, MemRuntimeCheck,
73                                           SCEVRuntimeCheck, "ldist.safe");
74     if (auto *I = dyn_cast<Instruction>(RuntimeCheck))
75       I->insertBefore(RuntimeCheckBB->getTerminator());
76   } else
77     RuntimeCheck = MemRuntimeCheck ? MemRuntimeCheck : SCEVRuntimeCheck;
78 
79   assert(RuntimeCheck && "called even though we don't need "
80                          "any runtime checks");
81 
82   // Rename the block to make the IR more readable.
83   RuntimeCheckBB->setName(VersionedLoop->getHeader()->getName() +
84                           ".lver.check");
85 
86   // Create empty preheader for the loop (and after cloning for the
87   // non-versioned loop).
88   BasicBlock *PH =
89       SplitBlock(RuntimeCheckBB, RuntimeCheckBB->getTerminator(), DT, LI);
90   PH->setName(VersionedLoop->getHeader()->getName() + ".ph");
91 
92   // Clone the loop including the preheader.
93   //
94   // FIXME: This does not currently preserve SimplifyLoop because the exit
95   // block is a join between the two loops.
96   SmallVector<BasicBlock *, 8> NonVersionedLoopBlocks;
97   NonVersionedLoop =
98       cloneLoopWithPreheader(PH, RuntimeCheckBB, VersionedLoop, VMap,
99                              ".lver.orig", LI, DT, NonVersionedLoopBlocks);
100   remapInstructionsInBlocks(NonVersionedLoopBlocks, VMap);
101 
102   // Insert the conditional branch based on the result of the memchecks.
103   Instruction *OrigTerm = RuntimeCheckBB->getTerminator();
104   BranchInst::Create(NonVersionedLoop->getLoopPreheader(),
105                      VersionedLoop->getLoopPreheader(), RuntimeCheck, OrigTerm);
106   OrigTerm->eraseFromParent();
107 
108   // The loops merge in the original exit block.  This is now dominated by the
109   // memchecking block.
110   DT->changeImmediateDominator(VersionedLoop->getExitBlock(), RuntimeCheckBB);
111 
112   // Adds the necessary PHI nodes for the versioned loops based on the
113   // loop-defined values used outside of the loop.
114   addPHINodes(DefsUsedOutside);
115 }
116 
117 void LoopVersioning::addPHINodes(
118     const SmallVectorImpl<Instruction *> &DefsUsedOutside) {
119   BasicBlock *PHIBlock = VersionedLoop->getExitBlock();
120   assert(PHIBlock && "No single successor to loop exit block");
121 
122   for (auto *Inst : DefsUsedOutside) {
123     auto *NonVersionedLoopInst = cast<Instruction>(VMap[Inst]);
124     PHINode *PN;
125 
126     // First see if we have a single-operand PHI with the value defined by the
127     // original loop.
128     for (auto I = PHIBlock->begin(); (PN = dyn_cast<PHINode>(I)); ++I) {
129       assert(PN->getNumOperands() == 1 &&
130              "Exit block should only have on predecessor");
131       if (PN->getIncomingValue(0) == Inst)
132         break;
133     }
134     // If not create it.
135     if (!PN) {
136       PN = PHINode::Create(Inst->getType(), 2, Inst->getName() + ".lver",
137                            &PHIBlock->front());
138       for (auto *User : Inst->users())
139         if (!VersionedLoop->contains(cast<Instruction>(User)->getParent()))
140           User->replaceUsesOfWith(Inst, PN);
141       PN->addIncoming(Inst, VersionedLoop->getExitingBlock());
142     }
143     // Add the new incoming value from the non-versioned loop.
144     PN->addIncoming(NonVersionedLoopInst, NonVersionedLoop->getExitingBlock());
145   }
146 }
147 
148 namespace {
149 /// \brief Also expose this is a pass.  Currently this is only used for
150 /// unit-testing.  It adds all memchecks necessary to remove all may-aliasing
151 /// array accesses from the loop.
152 class LoopVersioningPass : public FunctionPass {
153 public:
154   LoopVersioningPass() : FunctionPass(ID) {
155     initializeLoopVersioningPassPass(*PassRegistry::getPassRegistry());
156   }
157 
158   bool runOnFunction(Function &F) override {
159     auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
160     auto *LAA = &getAnalysis<LoopAccessAnalysis>();
161     auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
162     auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
163 
164     // Build up a worklist of inner-loops to version. This is necessary as the
165     // act of versioning a loop creates new loops and can invalidate iterators
166     // across the loops.
167     SmallVector<Loop *, 8> Worklist;
168 
169     for (Loop *TopLevelLoop : *LI)
170       for (Loop *L : depth_first(TopLevelLoop))
171         // We only handle inner-most loops.
172         if (L->empty())
173           Worklist.push_back(L);
174 
175     // Now walk the identified inner loops.
176     bool Changed = false;
177     for (Loop *L : Worklist) {
178       const LoopAccessInfo &LAI = LAA->getInfo(L, ValueToValueMap());
179       if (LAI.getNumRuntimePointerChecks() ||
180           !LAI.PSE.getUnionPredicate().isAlwaysTrue()) {
181         LoopVersioning LVer(LAI, L, LI, DT, SE);
182         LVer.versionLoop();
183         Changed = true;
184       }
185     }
186 
187     return Changed;
188   }
189 
190   void getAnalysisUsage(AnalysisUsage &AU) const override {
191     AU.addRequired<LoopInfoWrapperPass>();
192     AU.addPreserved<LoopInfoWrapperPass>();
193     AU.addRequired<LoopAccessAnalysis>();
194     AU.addRequired<DominatorTreeWrapperPass>();
195     AU.addPreserved<DominatorTreeWrapperPass>();
196     AU.addRequired<ScalarEvolutionWrapperPass>();
197   }
198 
199   static char ID;
200 };
201 }
202 
203 #define LVER_OPTION "loop-versioning"
204 #define DEBUG_TYPE LVER_OPTION
205 
206 char LoopVersioningPass::ID;
207 static const char LVer_name[] = "Loop Versioning";
208 
209 INITIALIZE_PASS_BEGIN(LoopVersioningPass, LVER_OPTION, LVer_name, false, false)
210 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
211 INITIALIZE_PASS_DEPENDENCY(LoopAccessAnalysis)
212 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
213 INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
214 INITIALIZE_PASS_END(LoopVersioningPass, LVER_OPTION, LVer_name, false, false)
215 
216 namespace llvm {
217 FunctionPass *createLoopVersioningPass() {
218   return new LoopVersioningPass();
219 }
220 }
221