llvm/lib/Transforms/IPO
Ashutosh Nema 9feccf470d New Loop Versioning LICM Pass
Summary:
When alias analysis is uncertain about the aliasing between any two accesses,
it will return MayAlias. This uncertainty from alias analysis restricts LICM
from proceeding further. In cases where alias analysis is uncertain we might
use loop versioning as an alternative.

Loop Versioning will create a version of the loop with aggressive aliasing
assumptions in addition to the original with conservative (default) aliasing
assumptions. The version of the loop making aggressive aliasing assumptions
will have all the memory accesses marked as no-alias. These two versions of
loop will be preceded by a memory runtime check. This runtime check consists
of bound checks for all unique memory accessed in loop, and it ensures the
lack of memory aliasing. The result of the runtime check determines which of
the loop versions is executed: If the runtime check detects any memory
aliasing, then the original loop is executed. Otherwise, the version with
aggressive aliasing assumptions is used.

The pass is off by default and can be enabled with command line option 
-enable-loop-versioning-licm.

Reviewers: hfinkel, anemet, chatur01, reames

Subscribers: MatzeB, grosser, joker.eph, sanjoy, javed.absar, sbaranga,
             llvm-commits

Differential Revision: http://reviews.llvm.org/D9151



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@259986 91177308-0d34-0410-b5e6-96231b3b80d8
2016-02-06 07:47:48 +00:00
..
ArgumentPromotion.cpp DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00
BarrierNoopPass.cpp
CMakeLists.txt [attrs] Extract the pure inference of function attributes into 2015-12-27 08:41:34 +00:00
ConstantMerge.cpp IPO: Remove implicit ilist iterator conversions, NFC 2015-10-13 17:51:03 +00:00
CrossDSOCFI.cpp [cfi] Cross-DSO CFI diagnostic mode (LLVM part). 2016-01-25 23:35:03 +00:00
DeadArgumentElimination.cpp Convert int to Twine instead of using utostr since it was already being added to a Twine. NFC 2016-01-31 00:15:35 +00:00
ElimAvailExtern.cpp Disallow aliases to available_externally. 2015-11-26 19:22:59 +00:00
ExtractGV.cpp GlobalValue: use getValueType() instead of getType()->getPointerElementType(). 2016-01-16 20:30:46 +00:00
ForceFunctionAttrs.cpp Fix option desc in FunctionAttrs; NFC 2016-01-06 18:18:16 +00:00
FunctionAttrs.cpp [attrs] Split the late-revisit pattern for deducing norecurse in 2016-01-08 10:55:52 +00:00
FunctionImport.cpp [ThinLTO] Do metadata linking during batch function importing 2016-01-22 00:15:53 +00:00
GlobalDCE.cpp Re-reapply "[IR] Move optional data in llvm::Function into a hungoff uselist" 2015-12-19 08:52:49 +00:00
GlobalOpt.cpp Transforms: Move GlobalOpt's Evaluator to Utils where it can be reused. 2016-02-03 02:51:00 +00:00
InferFunctionAttrs.cpp [BasicAA] Remove special casing of memset_pattern16 in favor of generic attribute inference 2016-01-06 04:53:16 +00:00
InlineAlways.cpp Refactor threshold computation for inline cost analysis 2016-01-14 23:16:29 +00:00
Inliner.cpp Refactor threshold computation for inline cost analysis 2016-01-14 23:16:29 +00:00
InlineSimple.cpp Refactor threshold computation for inline cost analysis 2016-01-14 23:16:29 +00:00
Internalize.cpp IPO: Remove implicit ilist iterator conversions, NFC 2015-10-13 17:51:03 +00:00
IPConstantPropagation.cpp
IPO.cpp [attrs] Split the late-revisit pattern for deducing norecurse in 2016-01-08 10:55:52 +00:00
LLVMBuild.txt [PGO] Passmanagerbuilder change that enable IR level PGO instrumentation 2016-01-21 18:28:59 +00:00
LoopExtractor.cpp LoopInfo: Simplify ownership of Loop objects 2016-01-08 19:08:53 +00:00
LowerBitSets.cpp LowerBitSets: Don't bother to do any work if the llvm.bitset.test intrinsic is unused. 2016-02-03 03:48:46 +00:00
MergeFunctions.cpp Avoid overly large SmallPtrSet/SmallSet 2016-01-30 01:24:31 +00:00
PartialInlining.cpp IPO: Remove implicit ilist iterator conversions, NFC 2015-10-13 17:51:03 +00:00
PassManagerBuilder.cpp New Loop Versioning LICM Pass 2016-02-06 07:47:48 +00:00
PruneEH.cpp [PruneEH] Don't try to insert a terminator after another terminator 2016-01-23 06:00:44 +00:00
SampleProfile.cpp Avoid overly large SmallPtrSet/SmallSet 2016-01-30 01:24:31 +00:00
StripDeadPrototypes.cpp [PM] Port StripDeadPrototypes to the new pass manager 2015-10-30 23:28:12 +00:00
StripSymbols.cpp DI: Reverse direction of subprogram -> function edge. 2015-11-05 22:03:56 +00:00