llvm-project/llvm/lib/Analysis
Tom Stellard 3d36e5c3e6 Only promote args when function attributes are compatible
Summary:
Check to make sure that the caller and the callee have compatible
function arguments before promoting arguments.  This uses the same
TargetTransformInfo queries that are used to determine if attributes
are compatible for inlining.

The goal here is to avoid breaking ABI when a called function's ABI
depends on a target feature that is not enabled in the caller.

This is a very conservative fix for PR37358.  Ideally we would have a more
sophisticated check for ABI compatiblity rather than checking if the
attributes are compatible for inlining.

Reviewers: echristo, chandlerc, eli.friedman, craig.topper

Reviewed By: echristo, chandlerc

Subscribers: nikic, xbolva00, rkruppe, alexcrichton, llvm-commits

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

llvm-svn: 351296
2019-01-16 05:15:31 +00:00
..
AliasAnalysis.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
AliasAnalysisEvaluator.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
AliasAnalysisSummary.cpp
AliasAnalysisSummary.h Revert r332657: "[AA] cfl-anders-aa with field sensitivity" 2018-05-17 21:56:39 +00:00
AliasSetTracker.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
Analysis.cpp [stack-safety] Empty local passes for Stack Safety Global Analysis 2018-11-26 23:05:48 +00:00
AssumptionCache.cpp
BasicAliasAnalysis.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
BlockFrequencyInfo.cpp refactor BlockFrequencyInfo::view to take a title parameter 2019-01-09 19:12:38 +00:00
BlockFrequencyInfoImpl.cpp llvm::sort(C.begin(), C.end(), ...) -> llvm::sort(C, ...) 2018-09-27 02:13:45 +00:00
BranchProbabilityInfo.cpp [TI removal] Make variables declared as `TerminatorInst` and initialized 2018-10-15 10:04:59 +00:00
CFG.cpp [TI removal] Make variables declared as `TerminatorInst` and initialized 2018-10-15 10:04:59 +00:00
CFGPrinter.cpp [CFG Printer] Add support for writing the dot files with a custom 2018-10-09 04:30:23 +00:00
CFLAndersAliasAnalysis.cpp Replace most users of UnknownSize with LocationSize::unknown(); NFC 2018-10-10 21:28:44 +00:00
CFLGraph.h [IR] Replace `isa<TerminatorInst>` with `isTerminator()`. 2018-08-26 09:51:22 +00:00
CFLSteensAliasAnalysis.cpp Rename DEBUG macro to LLVM_DEBUG. 2018-05-14 12:53:11 +00:00
CGSCCPassManager.cpp [NewPM] fixing asserts on deleted loop in -print-after-all 2018-12-11 19:05:35 +00:00
CMakeLists.txt [stack-safety] Empty local passes for Stack Safety Local Analysis 2018-11-26 21:57:47 +00:00
CallGraph.cpp llvm::sort(C.begin(), C.end(), ...) -> llvm::sort(C, ...) 2018-09-27 02:13:45 +00:00
CallGraphSCCPass.cpp Fixing -print-module-scope for legacy SCC passes 2018-12-03 14:48:15 +00:00
CallPrinter.cpp Revert "Extend CFGPrinter and CallPrinter with Heat Colors" 2018-06-29 17:48:58 +00:00
CaptureTracking.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
CmpInstAnalysis.cpp [CmpInstAnalysis] fix function signature for ICmp code to predicate; NFC 2018-12-04 18:53:27 +00:00
CodeMetrics.cpp Rename DEBUG macro to LLVM_DEBUG. 2018-05-14 12:53:11 +00:00
ConstantFolding.cpp [ConstantFolding] Fold undef for integer intrinsics 2019-01-11 21:18:00 +00:00
CostModel.cpp Remove redundant includes from lib/Analysis. 2017-12-13 21:30:41 +00:00
Delinearization.cpp [NFC] Consolidate six getPointerOperand() utility functions into one place 2018-03-09 21:05:58 +00:00
DemandedBits.cpp Reapply "[DemandedBits] Use SetVector for Worklist" 2019-01-12 09:09:15 +00:00
DependenceAnalysis.cpp [DA][NewPM] Add a printerpass and port the testsuite 2019-01-08 14:06:58 +00:00
DivergenceAnalysis.cpp [DA] GPUDivergenceAnalysis for unstructured GPU kernels 2018-11-30 22:55:20 +00:00
DomPrinter.cpp Revert "Extend CFGPrinter and CallPrinter with Heat Colors" 2018-06-29 17:48:58 +00:00
DominanceFrontier.cpp IWYU for llvm-config.h in llvm, additions. 2018-04-30 14:59:11 +00:00
EHPersonalities.cpp [TI removal] Make variables declared as `TerminatorInst` and initialized 2018-10-15 10:04:59 +00:00
GlobalsModRef.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
GuardUtils.cpp Re-enable "[NFC] Unify guards detection" 2018-08-30 03:39:16 +00:00
IVDescriptors.cpp Fix parenthesis warning in IVDescriptors 2018-11-30 13:54:36 +00:00
IVUsers.cpp Rename DEBUG macro to LLVM_DEBUG. 2018-05-14 12:53:11 +00:00
IndirectCallPromotionAnalysis.cpp [CallSite removal] Port `IndirectCallSiteVisitor` to use `CallBase` and 2019-01-07 07:15:51 +00:00
InlineCost.cpp [Inliner] Assert that the computed inline threshold is non-negative. 2019-01-09 19:26:17 +00:00
InstCount.cpp
InstructionPrecedenceTracking.cpp [IPT] Drop cache less eagerly in GVN and LoopSafetyInfo 2019-01-09 07:28:13 +00:00
InstructionSimplify.cpp [InstSimplify] Simplify saturating add/sub + icmp 2018-12-17 17:45:18 +00:00
Interval.cpp
IntervalPartition.cpp
IteratedDominanceFrontier.cpp [IDF] Teach Iterated Dominance Frontier to use a snapshot CFG based on a GraphDiff. 2018-08-17 17:39:15 +00:00
LLVMBuild.txt
LazyBlockFrequencyInfo.cpp Require DominatorTree when requiring/preserving LoopInfo in the old pass manager 2018-05-17 09:05:40 +00:00
LazyBranchProbabilityInfo.cpp Require DominatorTree when requiring/preserving LoopInfo in the old pass manager 2018-05-17 09:05:40 +00:00
LazyCallGraph.cpp ADT/STLExtras: Introduce llvm::empty; NFC 2018-10-31 00:23:23 +00:00
LazyValueInfo.cpp [LVI] run transfer function for binary operator even when the RHS isn't a constant 2018-11-21 05:24:12 +00:00
LegacyDivergenceAnalysis.cpp LegacyDivergenceAnalysis: fix uninitialized value 2018-11-30 23:07:49 +00:00
Lint.cpp [Lint] Use LocationSize instead of ints; NFC 2018-12-23 02:50:08 +00:00
Loads.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
LoopAccessAnalysis.cpp [LAA] Avoid generating RT checks for known deps preventing vectorization. 2018-12-20 18:49:09 +00:00
LoopAnalysisManager.cpp [LoopPassManager] MemorySSA should be preserved when enabled. 2018-09-06 20:54:24 +00:00
LoopInfo.cpp Introduce llvm.loop.parallel_accesses and llvm.access.group metadata. 2018-12-20 04:58:07 +00:00
LoopPass.cpp [LoopPass] fixing 'Modification' messages in -debug-pass=Executions for loop passes 2018-11-19 15:10:59 +00:00
LoopUnrollAnalyzer.cpp Remove \brief commands from doxygen comments. 2018-05-01 15:54:18 +00:00
MemDepPrinter.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
MemDerefPrinter.cpp Remove redundant includes from lib/Analysis. 2017-12-13 21:30:41 +00:00
MemoryBuiltins.cpp Reverting r340807. 2018-08-30 18:37:18 +00:00
MemoryDependenceAnalysis.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
MemoryLocation.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
MemorySSA.cpp [MemorySSA] Disable checkClobberSanity for SkipSelfWalker. 2019-01-10 21:47:15 +00:00
MemorySSAUpdater.cpp [IR] Add hasNPredecessors, hasNPredecessorsOrMore to BasicBlock 2018-11-19 19:54:27 +00:00
ModuleDebugInfoPrinter.cpp Remove redundant includes from lib/Analysis. 2017-12-13 21:30:41 +00:00
ModuleSummaryAnalysis.cpp [LTO] Record whether LTOUnit splitting is enabled in index 2019-01-11 18:31:57 +00:00
MustExecute.cpp [IPT] Drop cache less eagerly in GVN and LoopSafetyInfo 2019-01-09 07:28:13 +00:00
ObjCARCAliasAnalysis.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
ObjCARCAnalysisUtils.cpp Remove \brief commands from doxygen comments. 2018-05-01 15:54:18 +00:00
ObjCARCInstKind.cpp Change the objc ARC optimizer to use the new objc.* intrinsics 2018-12-18 20:32:49 +00:00
OptimizationRemarkEmitter.cpp Remove redundant includes from lib/Analysis. 2017-12-13 21:30:41 +00:00
OrderedBasicBlock.cpp [NFC] Sanitizing asserts for OrderedBasicBlock 2018-09-11 08:46:19 +00:00
OrderedInstructions.cpp [NFC] Move OrderedInstructions and InstructionPrecedenceTracking to Analysis 2018-08-30 04:49:03 +00:00
PHITransAddr.cpp IWYU for llvm-config.h in llvm, additions. 2018-04-30 14:59:11 +00:00
PhiValues.cpp [PhiValues] Use callback value handles to invalidate deleted values 2018-08-24 15:48:30 +00:00
PostDominators.cpp [Dominators] Add PDT constructor from Function 2018-05-23 17:29:21 +00:00
ProfileSummaryInfo.cpp [SampleFDO] handle ProfileSampleAccurate when initializing function entry count 2018-12-13 21:51:42 +00:00
PtrUseVisitor.cpp
README.txt
RegionInfo.cpp Test commit, fix a minor typo. 2018-07-22 20:04:42 +00:00
RegionPass.cpp [NFC][PassTiming] factor out generic PassTimingInfo 2018-08-28 21:06:51 +00:00
RegionPrinter.cpp Revert "Extend CFGPrinter and CallPrinter with Heat Colors" 2018-06-29 17:48:58 +00:00
ScalarEvolution.cpp [SCEV][NFC] Verify IR in isLoop[Entry,Backedge]GuardedByCond 2018-11-08 05:07:58 +00:00
ScalarEvolutionAliasAnalysis.cpp [Analysis] More LocationSize cleanup; NFC 2018-12-22 18:23:21 +00:00
ScalarEvolutionExpander.cpp Revert r347934 "[SCEV] Guard movement of insertion point for loop-invariants" 2018-12-05 23:13:50 +00:00
ScalarEvolutionNormalization.cpp
ScopedNoAliasAA.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
StackSafetyAnalysis.cpp [IR] Add Instruction::isLifetimeStartOrEnd, NFC 2018-12-21 21:49:40 +00:00
StratifiedSets.h Remove \brief commands from doxygen comments. 2018-05-01 15:54:18 +00:00
SyncDependenceAnalysis.cpp [TI removal] Switch some newly added code over to use `Instruction` 2018-10-19 00:22:10 +00:00
SyntheticCountsUtils.cpp Refactor synthetic profile count computation. NFC. 2019-01-09 20:10:27 +00:00
TargetLibraryInfo.cpp Revert unapproved commit 2018-11-24 07:26:55 +00:00
TargetTransformInfo.cpp Only promote args when function attributes are compatible 2019-01-16 05:15:31 +00:00
Trace.cpp IWYU for llvm-config.h in llvm, additions. 2018-04-30 14:59:11 +00:00
TypeBasedAliasAnalysis.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
TypeMetadataUtils.cpp [WPD] Fix incorrect devirtualization after indirect call promotion 2018-09-27 14:55:32 +00:00
ValueLattice.cpp
ValueLatticeUtils.cpp [IPSCCP] Move common functions to ValueLatticeUtils (NFC) 2017-10-13 17:53:44 +00:00
ValueTracking.cpp [CallSite removal] Migrate all Alias Analysis APIs to use the newly 2019-01-07 05:42:51 +00:00
VectorUtils.cpp [SLPVectorizer] Flag ADD/SUB SSAT/USAT intrinsics trivially vectorizable (PR40123) 2019-01-03 12:18:23 +00:00

README.txt

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))

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