blob: 85e2bb6d89bf2584e70682e971bf67ed19d2d126 [file] [log] [blame]
Tobias Grosser75805372011-04-29 06:27:02 +00001//===----- 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
Tobias Grosserecfe21b2013-03-20 18:03:18 +000047#include "polly/CodeGen/BlockGenerators.h"
Tobias Grosser75805372011-04-29 06:27:02 +000048#include "polly/LinkAllPasses.h"
Tobias Grosser637bd632013-05-07 07:31:10 +000049#include "polly/Options.h"
Tobias Grosserecfe21b2013-03-20 18:03:18 +000050#include "polly/ScopDetection.h"
Tobias Grosser120db6b2011-11-07 12:58:54 +000051#include "polly/Support/SCEVValidator.h"
Tobias Grosser83628182013-05-07 08:11:54 +000052#include "polly/Support/ScopHelper.h"
Tobias Grosser75805372011-04-29 06:27:02 +000053#include "llvm/ADT/Statistic.h"
54#include "llvm/Analysis/AliasAnalysis.h"
Tobias Grosser6e9f25a2011-11-09 22:35:00 +000055#include "llvm/Analysis/LoopInfo.h"
Tobias Grosser75805372011-04-29 06:27:02 +000056#include "llvm/Analysis/RegionIterator.h"
Tobias Grosser6e9f25a2011-11-09 22:35:00 +000057#include "llvm/Analysis/ScalarEvolution.h"
Tobias Grosserb8710b52011-11-10 12:44:50 +000058#include "llvm/Analysis/ScalarEvolutionExpressions.h"
Tobias Grosser75805372011-04-29 06:27:02 +000059#include "llvm/Assembly/Writer.h"
Tobias Grosser83628182013-05-07 08:11:54 +000060#include "llvm/DebugInfo.h"
61#include "llvm/IR/LLVMContext.h"
Tobias Grosser75805372011-04-29 06:27:02 +000062
63#define DEBUG_TYPE "polly-detect"
64#include "llvm/Support/Debug.h"
65
Tobias Grosser60b54f12011-11-08 15:41:28 +000066#include <set>
67
Tobias Grosser75805372011-04-29 06:27:02 +000068using namespace llvm;
69using namespace polly;
70
Sebastian Pop8fe6d112013-05-30 17:47:32 +000071static cl::opt<bool>
72DetectScopsWithoutLoops("polly-detect-scops-in-functions-without-loops",
73 cl::desc("Detect scops in functions without loops"),
74 cl::Hidden, cl::init(false), cl::cat(PollyCategory));
75
Sebastian Pop2c9ec2e2013-06-03 16:35:37 +000076static cl::opt<bool>
77DetectRegionsWithoutLoops("polly-detect-scops-in-regions-without-loops",
78 cl::desc("Detect scops in regions without loops"),
79 cl::Hidden, cl::init(false), cl::cat(PollyCategory));
80
Tobias Grosser2ff87232011-10-23 11:17:06 +000081static cl::opt<std::string>
Tobias Grosser637bd632013-05-07 07:31:10 +000082OnlyFunction("polly-only-func", cl::desc("Only run on a single function"),
83 cl::value_desc("function-name"), cl::ValueRequired, cl::init(""),
84 cl::cat(PollyCategory));
Tobias Grosser2ff87232011-10-23 11:17:06 +000085
Tobias Grosser60cd9322011-11-10 12:47:26 +000086static cl::opt<bool>
87IgnoreAliasing("polly-ignore-aliasing",
88 cl::desc("Ignore possible aliasing of the array bases"),
Tobias Grosser637bd632013-05-07 07:31:10 +000089 cl::Hidden, cl::init(false), cl::cat(PollyCategory));
Tobias Grosser2ff87232011-10-23 11:17:06 +000090
Tobias Grosser637bd632013-05-07 07:31:10 +000091static cl::opt<bool>
92ReportLevel("polly-report",
93 cl::desc("Print information about the activities of Polly"),
94 cl::init(false), cl::cat(PollyCategory));
Tobias Grosser531891e2012-11-01 16:45:20 +000095
96static cl::opt<bool>
Tobias Grossera1879642011-12-20 10:43:14 +000097AllowNonAffine("polly-allow-nonaffine",
98 cl::desc("Allow non affine access functions in arrays"),
Tobias Grosser637bd632013-05-07 07:31:10 +000099 cl::Hidden, cl::init(false), cl::cat(PollyCategory));
Tobias Grossera1879642011-12-20 10:43:14 +0000100
Tobias Grosser75805372011-04-29 06:27:02 +0000101//===----------------------------------------------------------------------===//
102// Statistics.
103
104STATISTIC(ValidRegion, "Number of regions that a valid part of Scop");
105
Tobias Grosser74394f02013-01-14 22:40:23 +0000106#define BADSCOP_STAT(NAME, DESC) \
107 STATISTIC(Bad##NAME##ForScop, "Number of bad regions for Scop: " DESC)
Tobias Grosser75805372011-04-29 06:27:02 +0000108
Tobias Grosser74394f02013-01-14 22:40:23 +0000109#define INVALID(NAME, MESSAGE) \
110 do { \
111 std::string Buf; \
112 raw_string_ostream fmt(Buf); \
113 fmt << MESSAGE; \
114 fmt.flush(); \
115 LastFailure = Buf; \
116 DEBUG(dbgs() << MESSAGE); \
117 DEBUG(dbgs() << "\n"); \
118 assert(!Context.Verifying && #NAME); \
119 if (!Context.Verifying) \
120 ++Bad##NAME##ForScop; \
121 return false; \
Tobias Grosser84b81de2013-03-19 21:44:07 +0000122 } while (0)
Tobias Grosserfff5adc2011-11-10 13:21:43 +0000123
Tobias Grosser74394f02013-01-14 22:40:23 +0000124#define INVALID_NOVERIFY(NAME, MESSAGE) \
125 do { \
126 std::string Buf; \
127 raw_string_ostream fmt(Buf); \
128 fmt << MESSAGE; \
129 fmt.flush(); \
130 LastFailure = Buf; \
131 DEBUG(dbgs() << MESSAGE); \
132 DEBUG(dbgs() << "\n"); \
133 /* DISABLED: assert(!Context.Verifying && #NAME); */ \
134 if (!Context.Verifying) \
135 ++Bad##NAME##ForScop; \
136 return false; \
Tobias Grosser84b81de2013-03-19 21:44:07 +0000137 } while (0)
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000138
Tobias Grosser74394f02013-01-14 22:40:23 +0000139BADSCOP_STAT(CFG, "CFG too complex");
140BADSCOP_STAT(IndVar, "Non canonical induction variable in loop");
141BADSCOP_STAT(LoopBound, "Loop bounds can not be computed");
142BADSCOP_STAT(FuncCall, "Function call with side effects appeared");
143BADSCOP_STAT(AffFunc, "Expression not affine");
Tobias Grosser74394f02013-01-14 22:40:23 +0000144BADSCOP_STAT(Alias, "Found base address alias");
Tobias Grosser8edce4e2013-04-16 08:04:42 +0000145BADSCOP_STAT(SimpleLoop, "Loop not in -loop-simplify form");
Tobias Grosser74394f02013-01-14 22:40:23 +0000146BADSCOP_STAT(Other, "Others");
Tobias Grosser75805372011-04-29 06:27:02 +0000147
148//===----------------------------------------------------------------------===//
149// ScopDetection.
Tobias Grosser75805372011-04-29 06:27:02 +0000150bool ScopDetection::isMaxRegionInScop(const Region &R) const {
151 // The Region is valid only if it could be found in the set.
152 return ValidRegions.count(&R);
153}
154
Tobias Grosser4f129a62011-10-08 00:30:55 +0000155std::string ScopDetection::regionIsInvalidBecause(const Region *R) const {
156 if (!InvalidRegions.count(R))
157 return "";
158
159 return InvalidRegions.find(R)->second;
160}
161
Tobias Grossere602a072013-05-07 07:30:56 +0000162bool ScopDetection::isValidCFG(BasicBlock &BB,
163 DetectionContext &Context) const {
Tobias Grosser75805372011-04-29 06:27:02 +0000164 Region &RefRegion = Context.CurRegion;
165 TerminatorInst *TI = BB.getTerminator();
166
167 // Return instructions are only valid if the region is the top level region.
168 if (isa<ReturnInst>(TI) && !RefRegion.getExit() && TI->getNumOperands() == 0)
169 return true;
170
171 BranchInst *Br = dyn_cast<BranchInst>(TI);
172
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000173 if (!Br)
Tobias Grosser29ee0b12011-11-17 14:52:36 +0000174 INVALID(CFG, "Non branch instruction terminates BB: " + BB.getName());
Tobias Grosser75805372011-04-29 06:27:02 +0000175
Tobias Grosser74394f02013-01-14 22:40:23 +0000176 if (Br->isUnconditional())
177 return true;
Tobias Grosser75805372011-04-29 06:27:02 +0000178
179 Value *Condition = Br->getCondition();
180
181 // UndefValue is not allowed as condition.
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000182 if (isa<UndefValue>(Condition))
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000183 INVALID(AffFunc, "Condition based on 'undef' value in BB: " + BB.getName());
Tobias Grosser75805372011-04-29 06:27:02 +0000184
185 // Only Constant and ICmpInst are allowed as condition.
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000186 if (!(isa<Constant>(Condition) || isa<ICmpInst>(Condition)))
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000187 INVALID(AffFunc, "Condition in BB '" + BB.getName() +
Tobias Grosserd7e58642013-04-10 06:55:45 +0000188 "' neither constant nor an icmp instruction");
Tobias Grosser75805372011-04-29 06:27:02 +0000189
190 // Allow perfectly nested conditions.
191 assert(Br->getNumSuccessors() == 2 && "Unexpected number of successors");
192
193 if (ICmpInst *ICmp = dyn_cast<ICmpInst>(Condition)) {
194 // Unsigned comparisons are not allowed. They trigger overflow problems
195 // in the code generation.
196 //
197 // TODO: This is not sufficient and just hides bugs. However it does pretty
198 // well.
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000199 if (ICmp->isUnsigned())
Tobias Grosser75805372011-04-29 06:27:02 +0000200 return false;
201
202 // Are both operands of the ICmp affine?
Tobias Grosser74394f02013-01-14 22:40:23 +0000203 if (isa<UndefValue>(ICmp->getOperand(0)) ||
204 isa<UndefValue>(ICmp->getOperand(1)))
Tobias Grosser29ee0b12011-11-17 14:52:36 +0000205 INVALID(AffFunc, "undef operand in branch at BB: " + BB.getName());
Tobias Grosser75805372011-04-29 06:27:02 +0000206
Sebastian Pop9f57c5b2013-04-10 04:05:18 +0000207 Loop *L = LI->getLoopFor(ICmp->getParent());
208 const SCEV *LHS = SE->getSCEVAtScope(ICmp->getOperand(0), L);
209 const SCEV *RHS = SE->getSCEVAtScope(ICmp->getOperand(1), L);
Tobias Grosser75805372011-04-29 06:27:02 +0000210
Tobias Grossera66fa6c2011-11-10 12:45:11 +0000211 if (!isAffineExpr(&Context.CurRegion, LHS, *SE) ||
212 !isAffineExpr(&Context.CurRegion, RHS, *SE))
Tobias Grosser29ee0b12011-11-17 14:52:36 +0000213 INVALID(AffFunc, "Non affine branch in BB '" << BB.getName()
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000214 << "' with LHS: " << *LHS
215 << " and RHS: " << *RHS);
Tobias Grosser75805372011-04-29 06:27:02 +0000216 }
217
218 // Allow loop exit conditions.
219 Loop *L = LI->getLoopFor(&BB);
220 if (L && L->getExitingBlock() == &BB)
221 return true;
222
223 // Allow perfectly nested conditions.
224 Region *R = RI->getRegionFor(&BB);
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000225 if (R->getEntry() != &BB)
Tobias Grosser29ee0b12011-11-17 14:52:36 +0000226 INVALID(CFG, "Not well structured condition at BB: " + BB.getName());
Tobias Grosser75805372011-04-29 06:27:02 +0000227
228 return true;
229}
230
231bool ScopDetection::isValidCallInst(CallInst &CI) {
232 if (CI.mayHaveSideEffects() || CI.doesNotReturn())
233 return false;
234
235 if (CI.doesNotAccessMemory())
236 return true;
237
238 Function *CalledFunction = CI.getCalledFunction();
239
240 // Indirect calls are not supported.
241 if (CalledFunction == 0)
242 return false;
243
244 // TODO: Intrinsics.
245 return false;
246}
247
248bool ScopDetection::isValidMemoryAccess(Instruction &Inst,
249 DetectionContext &Context) const {
Tobias Grossere5e171e2011-11-10 12:45:03 +0000250 Value *Ptr = getPointerOperand(Inst);
Sebastian Pop9f57c5b2013-04-10 04:05:18 +0000251 Loop *L = LI->getLoopFor(Inst.getParent());
252 const SCEV *AccessFunction = SE->getSCEVAtScope(Ptr, L);
Tobias Grosserb8710b52011-11-10 12:44:50 +0000253 const SCEVUnknown *BasePointer;
Tobias Grossere5e171e2011-11-10 12:45:03 +0000254 Value *BaseValue;
Tobias Grosser75805372011-04-29 06:27:02 +0000255
Tobias Grosserb8710b52011-11-10 12:44:50 +0000256 BasePointer = dyn_cast<SCEVUnknown>(SE->getPointerBase(AccessFunction));
257
258 if (!BasePointer)
259 INVALID(AffFunc, "No base pointer");
260
261 BaseValue = BasePointer->getValue();
262
263 if (isa<UndefValue>(BaseValue))
264 INVALID(AffFunc, "Undefined base pointer");
265
266 AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer);
267
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000268 if (!isAffineExpr(&Context.CurRegion, AccessFunction, *SE, BaseValue) &&
269 !AllowNonAffine)
Tobias Grossereeb776a2012-09-08 14:00:37 +0000270 INVALID(AffFunc, "Non affine access function: " << *AccessFunction);
Tobias Grosser75805372011-04-29 06:27:02 +0000271
272 // FIXME: Alias Analysis thinks IntToPtrInst aliases with alloca instructions
273 // created by IndependentBlocks Pass.
Tobias Grossere5e171e2011-11-10 12:45:03 +0000274 if (isa<IntToPtrInst>(BaseValue))
275 INVALID(Other, "Find bad intToptr prt: " << *BaseValue);
Tobias Grosser75805372011-04-29 06:27:02 +0000276
Sebastian Popb35892b2013-06-03 16:35:41 +0000277 if (!IgnoreAliasing) {
278 // Check if the base pointer of the memory access does alias with
279 // any other pointer. This cannot be handled at the moment.
280 AliasSet &AS =
281 Context.AST.getAliasSetForPointer(BaseValue, AliasAnalysis::UnknownSize,
282 Inst.getMetadata(LLVMContext::MD_tbaa));
Tobias Grosserfff5adc2011-11-10 13:21:43 +0000283
Sebastian Popb35892b2013-06-03 16:35:41 +0000284 // INVALID triggers an assertion in verifying mode, if it detects that a SCoP
285 // was detected by SCoP detection and that this SCoP was invalidated by a pass
286 // that stated it would preserve the SCoPs.
287 // We disable this check as the independent blocks pass may create memory
288 // references which seem to alias, if -basicaa is not available. They actually
289 // do not, but as we can not proof this without -basicaa we would fail. We
290 // disable this check to not cause irrelevant verification failures.
291 if (!AS.isMustAlias()) {
292 std::string Message;
293 raw_string_ostream OS(Message);
Tobias Grosser428b3e42013-02-04 15:46:25 +0000294
Sebastian Popb35892b2013-06-03 16:35:41 +0000295 OS << "Possible aliasing: ";
Tobias Grosser428b3e42013-02-04 15:46:25 +0000296
Sebastian Popb35892b2013-06-03 16:35:41 +0000297 std::vector<Value *> Pointers;
Tobias Grosser428b3e42013-02-04 15:46:25 +0000298
Sebastian Popb35892b2013-06-03 16:35:41 +0000299 for (AliasSet::iterator AI = AS.begin(), AE = AS.end(); AI != AE; ++AI)
300 Pointers.push_back(AI.getPointer());
Tobias Grosser428b3e42013-02-04 15:46:25 +0000301
Sebastian Popb35892b2013-06-03 16:35:41 +0000302 std::sort(Pointers.begin(), Pointers.end());
Tobias Grosser428b3e42013-02-04 15:46:25 +0000303
Sebastian Popb35892b2013-06-03 16:35:41 +0000304 for (std::vector<Value *>::iterator PI = Pointers.begin(),
305 PE = Pointers.end(); ;) {
306 Value *V = *PI;
Tobias Grosser428b3e42013-02-04 15:46:25 +0000307
Sebastian Popb35892b2013-06-03 16:35:41 +0000308 if (V->getName().size() == 0)
309 OS << "\"" << *V << "\"";
310 else
311 OS << "\"" << V->getName() << "\"";
Tobias Grosser428b3e42013-02-04 15:46:25 +0000312
Sebastian Popb35892b2013-06-03 16:35:41 +0000313 ++PI;
Tobias Grosser428b3e42013-02-04 15:46:25 +0000314
Sebastian Popb35892b2013-06-03 16:35:41 +0000315 if (PI != PE)
316 OS << ", ";
317 else
318 break;
319 }
320
321 INVALID_NOVERIFY(Alias, OS.str());
Tobias Grosser428b3e42013-02-04 15:46:25 +0000322 }
Tobias Grosser428b3e42013-02-04 15:46:25 +0000323 }
Tobias Grosser75805372011-04-29 06:27:02 +0000324
325 return true;
326}
327
Tobias Grosser75805372011-04-29 06:27:02 +0000328bool ScopDetection::isValidInstruction(Instruction &Inst,
329 DetectionContext &Context) const {
Tobias Grosser75805372011-04-29 06:27:02 +0000330 if (PHINode *PN = dyn_cast<PHINode>(&Inst))
Tobias Grosserecfe21b2013-03-20 18:03:18 +0000331 if (!canSynthesize(PN, LI, SE, &Context.CurRegion)) {
332 if (SCEVCodegen)
333 INVALID(IndVar,
334 "SCEV of PHI node refers to SSA names in region: " << Inst);
335 else
336 INVALID(IndVar, "Non canonical PHI node: " << Inst);
337 }
Tobias Grosser75805372011-04-29 06:27:02 +0000338
Tobias Grosser75805372011-04-29 06:27:02 +0000339 // We only check the call instruction but not invoke instruction.
340 if (CallInst *CI = dyn_cast<CallInst>(&Inst)) {
341 if (isValidCallInst(*CI))
342 return true;
343
Tobias Grosserb43ba822011-10-08 00:49:30 +0000344 INVALID(FuncCall, "Call instruction: " << Inst);
Tobias Grosser75805372011-04-29 06:27:02 +0000345 }
346
347 if (!Inst.mayWriteToMemory() && !Inst.mayReadFromMemory()) {
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000348 if (isa<AllocaInst>(Inst))
Tobias Grosserb43ba822011-10-08 00:49:30 +0000349 INVALID(Other, "Alloca instruction: " << Inst);
Tobias Grosser75805372011-04-29 06:27:02 +0000350
351 return true;
352 }
353
354 // Check the access function.
355 if (isa<LoadInst>(Inst) || isa<StoreInst>(Inst))
356 return isValidMemoryAccess(Inst, Context);
357
358 // We do not know this instruction, therefore we assume it is invalid.
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000359 INVALID(Other, "Unknown instruction: " << Inst);
Tobias Grosser75805372011-04-29 06:27:02 +0000360}
361
362bool ScopDetection::isValidBasicBlock(BasicBlock &BB,
363 DetectionContext &Context) const {
Tobias Grosser75805372011-04-29 06:27:02 +0000364 // Check all instructions, except the terminator instruction.
365 for (BasicBlock::iterator I = BB.begin(), E = --BB.end(); I != E; ++I)
366 if (!isValidInstruction(*I, Context))
367 return false;
368
Tobias Grosser75805372011-04-29 06:27:02 +0000369 return true;
370}
371
372bool ScopDetection::isValidLoop(Loop *L, DetectionContext &Context) const {
Tobias Grosser826b2af2013-03-21 16:14:50 +0000373 if (!SCEVCodegen) {
374 // If code generation is not in scev based mode, we need to ensure that
375 // each loop has a canonical induction variable.
376 PHINode *IndVar = L->getCanonicalInductionVariable();
377 if (!IndVar)
378 INVALID(IndVar,
379 "No canonical IV at loop header: " << L->getHeader()->getName());
380 }
Tobias Grosser75805372011-04-29 06:27:02 +0000381
382 // Is the loop count affine?
383 const SCEV *LoopCount = SE->getBackedgeTakenCount(L);
Tobias Grosser120db6b2011-11-07 12:58:54 +0000384 if (!isAffineExpr(&Context.CurRegion, LoopCount, *SE))
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000385 INVALID(LoopBound,
386 "Non affine loop bound '"
Tobias Grosserd7e58642013-04-10 06:55:45 +0000387 << *LoopCount << "' in loop: " << L->getHeader()->getName());
Tobias Grosser75805372011-04-29 06:27:02 +0000388
389 return true;
390}
391
392Region *ScopDetection::expandRegion(Region &R) {
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000393 // Initial no valid region was found (greater than R)
394 Region *LastValidRegion = NULL;
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000395 Region *ExpandedRegion = R.getExpandedRegion();
Tobias Grosser75805372011-04-29 06:27:02 +0000396
397 DEBUG(dbgs() << "\tExpanding " << R.getNameStr() << "\n");
398
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000399 while (ExpandedRegion) {
400 DetectionContext Context(*ExpandedRegion, *AA, false /* verifying */);
401 DEBUG(dbgs() << "\t\tTrying " << ExpandedRegion->getNameStr() << "\n");
Tobias Grosser75805372011-04-29 06:27:02 +0000402
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000403 // Check the exit first (cheap)
Tobias Grosser75805372011-04-29 06:27:02 +0000404 if (isValidExit(Context)) {
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000405 // If the exit is valid check all blocks
406 // - if true, a valid region was found => store it + keep expanding
407 // - if false, .tbd. => stop (should this really end the loop?)
408 if (!allBlocksValid(Context))
409 break;
Tobias Grosser75805372011-04-29 06:27:02 +0000410
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000411 // Delete unnecessary regions (allocated by getExpandedRegion)
412 if (LastValidRegion)
413 delete LastValidRegion;
414
Tobias Grosserd7e58642013-04-10 06:55:45 +0000415 // Store this region, because it is the greatest valid (encountered so
416 // far).
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000417 LastValidRegion = ExpandedRegion;
418
419 // Create and test the next greater region (if any)
420 ExpandedRegion = ExpandedRegion->getExpandedRegion();
421
422 } else {
423 // Create and test the next greater region (if any)
424 Region *TmpRegion = ExpandedRegion->getExpandedRegion();
425
426 // Delete unnecessary regions (allocated by getExpandedRegion)
427 delete ExpandedRegion;
428
429 ExpandedRegion = TmpRegion;
Tobias Grosser75805372011-04-29 06:27:02 +0000430 }
Tobias Grosser75805372011-04-29 06:27:02 +0000431 }
432
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000433 DEBUG(if (LastValidRegion)
Tobias Grosserd7e58642013-04-10 06:55:45 +0000434 dbgs() << "\tto " << LastValidRegion->getNameStr() << "\n";
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000435 else dbgs() << "\tExpanding " << R.getNameStr() << " failed\n";);
Tobias Grosser75805372011-04-29 06:27:02 +0000436
Hongbin Zhenged986ab2012-04-07 15:14:28 +0000437 return LastValidRegion;
Tobias Grosser75805372011-04-29 06:27:02 +0000438}
Sebastian Pop2c9ec2e2013-06-03 16:35:37 +0000439static bool regionWithoutLoops(Region &R, LoopInfo *LI) {
440 for (Region::block_iterator I = R.block_begin(), E = R.block_end(); I != E;
441 ++I)
442 if (R.contains(LI->getLoopFor(*I)))
443 return false;
444
445 return true;
446}
Tobias Grosser75805372011-04-29 06:27:02 +0000447
Tobias Grosser75805372011-04-29 06:27:02 +0000448void ScopDetection::findScops(Region &R) {
Sebastian Pop2c9ec2e2013-06-03 16:35:37 +0000449
450 if (!DetectRegionsWithoutLoops && regionWithoutLoops(R, LI))
451 return;
452
Tobias Grosser75805372011-04-29 06:27:02 +0000453 DetectionContext Context(R, *AA, false /*verifying*/);
454
Tobias Grosser4eb73812011-11-10 12:45:15 +0000455 LastFailure = "";
456
Tobias Grosser75805372011-04-29 06:27:02 +0000457 if (isValidRegion(Context)) {
458 ++ValidRegion;
459 ValidRegions.insert(&R);
460 return;
461 }
462
Tobias Grosser4f129a62011-10-08 00:30:55 +0000463 InvalidRegions[&R] = LastFailure;
464
Tobias Grosser75805372011-04-29 06:27:02 +0000465 for (Region::iterator I = R.begin(), E = R.end(); I != E; ++I)
466 findScops(**I);
467
468 // Try to expand regions.
469 //
470 // As the region tree normally only contains canonical regions, non canonical
471 // regions that form a Scop are not found. Therefore, those non canonical
472 // regions are checked by expanding the canonical ones.
473
Tobias Grosser0d1eee32013-02-05 11:56:05 +0000474 std::vector<Region *> ToExpand;
Tobias Grosser75805372011-04-29 06:27:02 +0000475
476 for (Region::iterator I = R.begin(), E = R.end(); I != E; ++I)
477 ToExpand.push_back(*I);
478
Tobias Grosseraf3c00b82013-02-05 09:40:22 +0000479 for (std::vector<Region *>::iterator RI = ToExpand.begin(),
480 RE = ToExpand.end();
481 RI != RE; ++RI) {
Tobias Grosser75805372011-04-29 06:27:02 +0000482 Region *CurrentRegion = *RI;
483
484 // Skip invalid regions. Regions may become invalid, if they are element of
485 // an already expanded region.
486 if (ValidRegions.find(CurrentRegion) == ValidRegions.end())
487 continue;
488
489 Region *ExpandedR = expandRegion(*CurrentRegion);
490
491 if (!ExpandedR)
492 continue;
493
494 R.addSubRegion(ExpandedR, true);
495 ValidRegions.insert(ExpandedR);
496 ValidRegions.erase(CurrentRegion);
497
498 for (Region::iterator I = ExpandedR->begin(), E = ExpandedR->end(); I != E;
499 ++I)
500 ValidRegions.erase(*I);
501 }
502}
503
504bool ScopDetection::allBlocksValid(DetectionContext &Context) const {
505 Region &R = Context.CurRegion;
506
507 for (Region::block_iterator I = R.block_begin(), E = R.block_end(); I != E;
Sebastian Popb88ea5e2013-06-11 22:20:32 +0000508 ++I) {
509 Loop *L = LI->getLoopFor(*I);
510 if (L && L->getHeader() == *I && !isValidLoop(L, Context))
511 return false;
512 }
513
514 for (Region::block_iterator I = R.block_begin(), E = R.block_end(); I != E;
Tobias Grosser75805372011-04-29 06:27:02 +0000515 ++I)
Sebastian Pop9e3d2dd2013-06-11 22:20:27 +0000516 if (!isValidCFG(**I, Context))
517 return false;
518
519 for (Region::block_iterator I = R.block_begin(), E = R.block_end(); I != E;
520 ++I)
Chandler Carruth30dfdfc2012-05-04 21:24:27 +0000521 if (!isValidBasicBlock(**I, Context))
Tobias Grosser75805372011-04-29 06:27:02 +0000522 return false;
523
524 return true;
525}
526
527bool ScopDetection::isValidExit(DetectionContext &Context) const {
528 Region &R = Context.CurRegion;
529
530 // PHI nodes are not allowed in the exit basic block.
531 if (BasicBlock *Exit = R.getExit()) {
532 BasicBlock::iterator I = Exit->begin();
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000533 if (I != Exit->end() && isa<PHINode>(*I))
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000534 INVALID(Other, "PHI node in exit BB");
Tobias Grosser75805372011-04-29 06:27:02 +0000535 }
536
537 return true;
538}
539
540bool ScopDetection::isValidRegion(DetectionContext &Context) const {
541 Region &R = Context.CurRegion;
542
543 DEBUG(dbgs() << "Checking region: " << R.getNameStr() << "\n\t");
544
545 // The toplevel region is no valid region.
Tobias Grosseraeabcf22013-04-02 06:41:48 +0000546 if (R.isTopLevelRegion()) {
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000547 DEBUG(dbgs() << "Top level region is invalid"; dbgs() << "\n");
Tobias Grosser75805372011-04-29 06:27:02 +0000548 return false;
549 }
550
Tobias Grossere602a072013-05-07 07:30:56 +0000551 if (!R.getEnteringBlock()) {
Tobias Grosser8edce4e2013-04-16 08:04:42 +0000552 Loop *L = LI->getLoopFor(R.getEntry());
553 if (L && !L->isLoopSimplifyForm())
554 INVALID(SimpleLoop, "Loop not in simplify form is invalid!");
555 }
556
Tobias Grosserd654c252012-04-10 18:12:19 +0000557 // SCoP cannot contain the entry block of the function, because we need
Tobias Grosser75805372011-04-29 06:27:02 +0000558 // to insert alloca instruction there when translate scalar to array.
Tobias Grosserc4a0bd12011-10-08 00:30:48 +0000559 if (R.getEntry() == &(R.getEntry()->getParent()->getEntryBlock()))
560 INVALID(Other, "Region containing entry block of function is invalid!");
Tobias Grosser75805372011-04-29 06:27:02 +0000561
Hongbin Zheng94868e62012-04-07 12:29:17 +0000562 if (!isValidExit(Context))
Tobias Grosser75805372011-04-29 06:27:02 +0000563 return false;
564
Hongbin Zheng94868e62012-04-07 12:29:17 +0000565 if (!allBlocksValid(Context))
Tobias Grosser75805372011-04-29 06:27:02 +0000566 return false;
567
568 DEBUG(dbgs() << "OK\n");
569 return true;
570}
571
572bool ScopDetection::isValidFunction(llvm::Function &F) {
Hongbin Zheng94c5df12011-05-06 02:38:20 +0000573 return !InvalidFunctions.count(&F);
Tobias Grosser75805372011-04-29 06:27:02 +0000574}
575
Tobias Grosser531891e2012-11-01 16:45:20 +0000576void ScopDetection::getDebugLocation(const Region *R, unsigned &LineBegin,
577 unsigned &LineEnd, std::string &FileName) {
578 LineBegin = -1;
579 LineEnd = 0;
580
581 for (Region::const_block_iterator RI = R->block_begin(), RE = R->block_end();
582 RI != RE; ++RI)
583 for (BasicBlock::iterator BI = (*RI)->begin(), BE = (*RI)->end(); BI != BE;
584 ++BI) {
585 DebugLoc DL = BI->getDebugLoc();
586 if (DL.isUnknown())
587 continue;
588
589 DIScope Scope(DL.getScope(BI->getContext()));
590
591 if (FileName.empty())
592 FileName = Scope.getFilename();
593
594 unsigned NewLine = DL.getLine();
595
596 LineBegin = std::min(LineBegin, NewLine);
597 LineEnd = std::max(LineEnd, NewLine);
598 break;
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000599 }
Tobias Grosser531891e2012-11-01 16:45:20 +0000600}
601
Tobias Grosserb2863ca2013-03-04 19:49:51 +0000602void ScopDetection::printLocations(llvm::Function &F) {
603 int NumberOfScops = std::distance(begin(), end());
604
605 if (NumberOfScops)
606 outs() << ":: Static control regions in " << F.getName() << "\n";
607
Tobias Grosser531891e2012-11-01 16:45:20 +0000608 for (iterator RI = begin(), RE = end(); RI != RE; ++RI) {
609 unsigned LineEntry, LineExit;
610 std::string FileName;
611
612 getDebugLocation(*RI, LineEntry, LineExit, FileName);
613
614 if (FileName.empty()) {
615 outs() << "Scop detected at unknown location. Compile with debug info "
Tobias Grosseraf3c00b82013-02-05 09:40:22 +0000616 "(-g) to get more precise information. \n";
Tobias Grosser531891e2012-11-01 16:45:20 +0000617 return;
618 }
619
Tobias Grosserb2863ca2013-03-04 19:49:51 +0000620 outs() << FileName << ":" << LineEntry
621 << ": Start of static control region\n";
622 outs() << FileName << ":" << LineExit << ": End of static control region\n";
Tobias Grosser531891e2012-11-01 16:45:20 +0000623 }
624}
625
Tobias Grosser75805372011-04-29 06:27:02 +0000626bool ScopDetection::runOnFunction(llvm::Function &F) {
Sebastian Pop8fe6d112013-05-30 17:47:32 +0000627 LI = &getAnalysis<LoopInfo>();
628 if (!DetectScopsWithoutLoops && LI->empty())
629 return false;
630
Tobias Grosser75805372011-04-29 06:27:02 +0000631 AA = &getAnalysis<AliasAnalysis>();
632 SE = &getAnalysis<ScalarEvolution>();
Tobias Grosser75805372011-04-29 06:27:02 +0000633 RI = &getAnalysis<RegionInfo>();
634 Region *TopRegion = RI->getTopLevelRegion();
635
Tobias Grosser2ff87232011-10-23 11:17:06 +0000636 releaseMemory();
637
Tobias Grosser29ee0b12011-11-17 14:52:36 +0000638 if (OnlyFunction != "" && F.getName() != OnlyFunction)
Tobias Grosser2ff87232011-10-23 11:17:06 +0000639 return false;
640
Tobias Grosser1bb59b02012-12-29 23:47:38 +0000641 if (!isValidFunction(F))
Tobias Grosser75805372011-04-29 06:27:02 +0000642 return false;
643
644 findScops(*TopRegion);
Tobias Grosser531891e2012-11-01 16:45:20 +0000645
646 if (ReportLevel >= 1)
Tobias Grosserb2863ca2013-03-04 19:49:51 +0000647 printLocations(F);
Tobias Grosser531891e2012-11-01 16:45:20 +0000648
Tobias Grosser75805372011-04-29 06:27:02 +0000649 return false;
650}
651
Tobias Grosser75805372011-04-29 06:27:02 +0000652void polly::ScopDetection::verifyRegion(const Region &R) const {
653 assert(isMaxRegionInScop(R) && "Expect R is a valid region.");
Tobias Grosser0d1eee32013-02-05 11:56:05 +0000654 DetectionContext Context(const_cast<Region &>(R), *AA, true /*verifying*/);
Tobias Grosser75805372011-04-29 06:27:02 +0000655 isValidRegion(Context);
656}
657
658void polly::ScopDetection::verifyAnalysis() const {
659 for (RegionSet::const_iterator I = ValidRegions.begin(),
Tobias Grosseraf3c00b82013-02-05 09:40:22 +0000660 E = ValidRegions.end();
661 I != E; ++I)
Tobias Grosser75805372011-04-29 06:27:02 +0000662 verifyRegion(**I);
663}
664
665void ScopDetection::getAnalysisUsage(AnalysisUsage &AU) const {
666 AU.addRequired<DominatorTree>();
667 AU.addRequired<PostDominatorTree>();
668 AU.addRequired<LoopInfo>();
669 AU.addRequired<ScalarEvolution>();
670 // We also need AA and RegionInfo when we are verifying analysis.
671 AU.addRequiredTransitive<AliasAnalysis>();
672 AU.addRequiredTransitive<RegionInfo>();
673 AU.setPreservesAll();
674}
675
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000676void ScopDetection::print(raw_ostream &OS, const Module *) const {
Tobias Grosser75805372011-04-29 06:27:02 +0000677 for (RegionSet::const_iterator I = ValidRegions.begin(),
Tobias Grosseraf3c00b82013-02-05 09:40:22 +0000678 E = ValidRegions.end();
679 I != E; ++I)
Tobias Grosser75805372011-04-29 06:27:02 +0000680 OS << "Valid Region for Scop: " << (*I)->getNameStr() << '\n';
681
682 OS << "\n";
683}
684
685void ScopDetection::releaseMemory() {
686 ValidRegions.clear();
Tobias Grosser4f129a62011-10-08 00:30:55 +0000687 InvalidRegions.clear();
Hongbin Zheng94c5df12011-05-06 02:38:20 +0000688 // Do not clear the invalid function set.
Tobias Grosser75805372011-04-29 06:27:02 +0000689}
690
691char ScopDetection::ID = 0;
692
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000693Pass *polly::createScopDetectionPass() { return new ScopDetection(); }
694
Tobias Grosser73600b82011-10-08 00:30:40 +0000695INITIALIZE_PASS_BEGIN(ScopDetection, "polly-detect",
696 "Polly - Detect static control parts (SCoPs)", false,
Tobias Grosser4d96c8d2013-03-23 01:05:07 +0000697 false);
698INITIALIZE_AG_DEPENDENCY(AliasAnalysis);
699INITIALIZE_PASS_DEPENDENCY(DominatorTree);
700INITIALIZE_PASS_DEPENDENCY(LoopInfo);
701INITIALIZE_PASS_DEPENDENCY(PostDominatorTree);
702INITIALIZE_PASS_DEPENDENCY(RegionInfo);
703INITIALIZE_PASS_DEPENDENCY(ScalarEvolution);
Tobias Grosser73600b82011-10-08 00:30:40 +0000704INITIALIZE_PASS_END(ScopDetection, "polly-detect",
705 "Polly - Detect static control parts (SCoPs)", false, false)