1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 19:52:54 +01:00
llvm-mirror/lib/Analysis
Nikita Popov 5c1515db12 [ValueTracking][ConstantRange] Distinguish low/high always overflow
In order to fold an always overflowing signed saturating add/sub,
we need to know in which direction the always overflow occurs.
This patch splits up AlwaysOverflows into AlwaysOverflowsLow and
AlwaysOverflowsHigh to pass through this information (but it is
not used yet).

Differential Revision: https://reviews.llvm.org/D62463

llvm-svn: 361858
2019-05-28 18:08:31 +00:00
..
AliasAnalysis.cpp [AliasAnalysis/NewPassManager] Invalidate AAManager less often. 2019-04-30 22:15:47 +00:00
AliasAnalysisEvaluator.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
AliasAnalysisSummary.cpp Move CFLGraph and the AA summary code over to the new CallBase 2019-02-11 09:25:41 +00:00
AliasAnalysisSummary.h Move CFLGraph and the AA summary code over to the new CallBase 2019-02-11 09:25:41 +00:00
AliasSetTracker.cpp [LICM/MSSA] Add promotion to scalars by building an AliasSetTracker with MemorySSA. 2019-02-06 20:25:17 +00:00
Analysis.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
AssumptionCache.cpp [CodeExtractor] Update function's assumption cache after extracting blocks from it 2019-02-08 06:55:18 +00:00
BasicAliasAnalysis.cpp Add an optional list of blocks to avoid when looking for a path in isPotentiallyReachable. 2019-04-02 01:05:48 +00:00
BlockFrequencyInfo.cpp Add optional arg to profile count getters to filter 2019-04-24 19:51:16 +00:00
BlockFrequencyInfoImpl.cpp Add optional arg to profile count getters to filter 2019-04-24 19:51:16 +00:00
BranchProbabilityInfo.cpp [BPI] Look through bitcasts in calcZeroHeuristic 2019-02-15 11:50:21 +00:00
CallGraph.cpp [CallSite removal] Move the legacy PM, call graph, and some inliner 2019-04-19 05:59:42 +00:00
CallGraphSCCPass.cpp [CallSite removal] Move the legacy PM, call graph, and some inliner 2019-04-19 05:59:42 +00:00
CallPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
CaptureTracking.cpp Add an optional list of blocks to avoid when looking for a path in isPotentiallyReachable. 2019-04-02 01:05:48 +00:00
CFG.cpp An unreachable block may have a route to a reachable block, don't fast-path return that it can't. 2019-04-04 23:09:40 +00:00
CFGPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
CFLAndersAliasAnalysis.cpp [AliasAnalysis] Second prototype to cache BasicAA / anyAA state. 2019-03-22 17:22:19 +00:00
CFLGraph.h Move CFLGraph and the AA summary code over to the new CallBase 2019-02-11 09:25:41 +00:00
CFLSteensAliasAnalysis.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
CGSCCPassManager.cpp [NewPM] Fix a nasty bug with analysis invalidation in the new PM. 2019-03-28 00:51:36 +00:00
CMakeLists.txt Move DomTreeUpdater from IR to Analysis 2019-02-06 02:52:52 +00:00
CmpInstAnalysis.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
CodeMetrics.cpp Remove CallSite from the CodeMetrics analysis, moving it to the new 2019-02-11 09:03:32 +00:00
ConstantFolding.cpp Add FNeg IR constant folding support 2019-05-05 16:07:09 +00:00
CostModel.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Delinearization.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
DemandedBits.cpp [DemandedBits] Remove some redundancy in the work list 2019-03-03 14:50:01 +00:00
DependenceAnalysis.cpp [DA][NewPM] Handle transitive dependencies in the new-pm version of DA 2019-02-03 12:25:41 +00:00
DivergenceAnalysis.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
DominanceFrontier.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
DomPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
DomTreeUpdater.cpp [DTU] Refine the interface and logic of applyUpdates 2019-02-22 13:48:38 +00:00
EHPersonalities.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
GlobalsModRef.cpp Add "const" in GetUnderlyingObjects. NFC 2019-04-24 06:55:50 +00:00
GuardUtils.cpp [WideableCond] Fix a nasty bug in detection of "explicit guards" 2019-04-02 16:51:43 +00:00
IndirectCallPromotionAnalysis.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
InlineCost.cpp [InlineCost] Fix a couple comments. NFC 2019-05-28 07:25:27 +00:00
InstCount.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
InstructionPrecedenceTracking.cpp Make widenable condition transparent for MemoryWriteTracking 2019-02-14 11:10:29 +00:00
InstructionSimplify.cpp [InstSimplify] fold insertelement-of-extractelement 2019-05-24 00:13:58 +00:00
Interval.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
IntervalPartition.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
IteratedDominanceFrontier.cpp [IDF] Delete a redundant J-edge test 2019-03-07 11:42:59 +00:00
IVDescriptors.cpp Save the induction binary operator in IVDescriptors for non FP induction variables. 2019-05-14 13:26:36 +00:00
IVUsers.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
LazyBlockFrequencyInfo.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
LazyBranchProbabilityInfo.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
LazyCallGraph.cpp [LCG] Add aliased functions as LCG roots 2019-04-05 18:51:08 +00:00
LazyValueInfo.cpp [LVI][CVP] Add support for saturating add/sub 2019-05-25 16:44:14 +00:00
LegacyDivergenceAnalysis.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Lint.cpp [Lint] Permit aliasing noalias readonly arguments 2019-04-23 23:43:47 +00:00
LLVMBuild.txt Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
Loads.cpp [Analysis] Fix isSafeToLoadUnconditionally handling of volatile. 2019-01-24 21:31:13 +00:00
LoopAccessAnalysis.cpp Add "const" in GetUnderlyingObjects. NFC 2019-04-24 06:55:50 +00:00
LoopAnalysisManager.cpp [MemorySSA] LCSSA preserves MemorySSA. 2019-04-23 20:59:44 +00:00
LoopInfo.cpp Revert [LOOPINFO] Extend Loop object to add utilities to get the loop bounds, step, induction variable, and guard branch. 2019-05-23 20:53:05 +00:00
LoopPass.cpp [IR] Refactor attribute methods in Function class (NFC) 2019-04-04 22:40:06 +00:00
LoopUnrollAnalyzer.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
MemDepPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
MemDerefPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
MemoryBuiltins.cpp Fix a hang when lowering __builtin_dynamic_object_size 2019-04-10 23:42:11 +00:00
MemoryDependenceAnalysis.cpp [MemDepAnalysis] Allow caller to pass in an OrderedBasicBlock. 2019-03-28 19:17:31 +00:00
MemoryLocation.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
MemorySSA.cpp [MemorySSA] Check that block is reachable when adding phis. 2019-05-02 23:41:58 +00:00
MemorySSAUpdater.cpp [MemorySSA] Teach LoopSimplify to preserve MemorySSA. 2019-05-08 17:05:36 +00:00
ModuleDebugInfoPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ModuleSummaryAnalysis.cpp [ThinLTO] Auto-hide prevailing linkonce_odr only when all copies eligible 2019-05-10 20:08:24 +00:00
MustExecute.cpp [MustExecute] Improve MustExecute to correctly handle loop nest 2019-05-27 13:57:28 +00:00
ObjCARCAliasAnalysis.cpp [AliasAnalysis] Second prototype to cache BasicAA / anyAA state. 2019-03-22 17:22:19 +00:00
ObjCARCAnalysisUtils.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ObjCARCInstKind.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
OptimizationRemarkEmitter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
OrderedBasicBlock.cpp Recommit "[DSE] Preserve basic block ordering using OrderedBasicBlock." 2019-03-29 14:10:24 +00:00
OrderedInstructions.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
PHITransAddr.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
PhiValues.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
PostDominators.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ProfileSummaryInfo.cpp Add optional arg to profile count getters to filter 2019-04-24 19:51:16 +00:00
PtrUseVisitor.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
README.txt
RegionInfo.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
RegionPass.cpp [IR] Refactor attribute methods in Function class (NFC) 2019-04-04 22:40:06 +00:00
RegionPrinter.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ScalarEvolution.cpp [SCEV] Add explicit representations of umin/smin 2019-05-07 15:28:47 +00:00
ScalarEvolutionAliasAnalysis.cpp [AliasAnalysis] Second prototype to cache BasicAA / anyAA state. 2019-03-22 17:22:19 +00:00
ScalarEvolutionExpander.cpp [SCEV] Suppress hoisting insertion point of binops when unsafe 2019-05-08 18:50:07 +00:00
ScalarEvolutionNormalization.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ScopedNoAliasAA.cpp [AliasAnalysis] Second prototype to cache BasicAA / anyAA state. 2019-03-22 17:22:19 +00:00
StackSafetyAnalysis.cpp Hide two unused debugging methods, NFCI. 2019-03-01 17:15:21 +00:00
StratifiedSets.h Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
SyncDependenceAnalysis.cpp [SDA] Bug fix: Use IPD outside the loop as divergence bound 2019-04-18 16:17:35 +00:00
SyntheticCountsUtils.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
TargetLibraryInfo.cpp Add Triple::isPPC64() 2019-05-16 08:31:22 +00:00
TargetTransformInfo.cpp [CostModel] Add really basic support for being able to query the cost of the FNeg instruction. 2019-05-28 04:09:18 +00:00
Trace.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
TypeBasedAliasAnalysis.cpp [AliasAnalysis] Second prototype to cache BasicAA / anyAA state. 2019-03-22 17:22:19 +00:00
TypeMetadataUtils.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ValueLattice.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ValueLatticeUtils.cpp Update the file headers across all of the LLVM projects in the monorepo 2019-01-19 08:50:56 +00:00
ValueTracking.cpp [ValueTracking][ConstantRange] Distinguish low/high always overflow 2019-05-28 18:08:31 +00:00
VectorUtils.cpp Consolidate existing utilities for interpreting vector predicate maskes [NFC] 2019-04-25 02:30:17 +00:00

Analysis Opportunities:

//===---------------------------------------------------------------------===//

In test/Transforms/LoopStrengthReduce/quadradic-exit-value.ll, the
ScalarEvolution expression for %r is this:

  {1,+,3,+,2}<loop>

Outside the loop, this could be evaluated simply as (%n * %n), however
ScalarEvolution currently evaluates it as

  (-2 + (2 * (trunc i65 (((zext i64 (-2 + %n) to i65) * (zext i64 (-1 + %n) to i65)) /u 2) to i64)) + (3 * %n))

In addition to being much more complicated, it involves i65 arithmetic,
which is very inefficient when expanded into code.

//===---------------------------------------------------------------------===//

In formatValue in test/CodeGen/X86/lsr-delayed-fold.ll,

ScalarEvolution is forming this expression:

((trunc i64 (-1 * %arg5) to i32) + (trunc i64 %arg5 to i32) + (-1 * (trunc i64 undef to i32)))

This could be folded to

(-1 * (trunc i64 undef to i32))

//===---------------------------------------------------------------------===//