summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
authorPiotr Padlewski <piotr.padlewski@gmail.com>2018-05-23 09:16:44 +0000
committerPiotr Padlewski <piotr.padlewski@gmail.com>2018-05-23 09:16:44 +0000
commitd6f7346a4b4bdbdfef9ba7a5b8619e42091e2440 (patch)
tree9c009d37ea6f02879925ab71d94ac81a32701753 /llvm/lib/Analysis/BasicAliasAnalysis.cpp
parenteb13d3d22e9bd303b4065b372a692cd04e4b8cc1 (diff)
downloadbcm5719-llvm-d6f7346a4b4bdbdfef9ba7a5b8619e42091e2440.tar.gz
bcm5719-llvm-d6f7346a4b4bdbdfef9ba7a5b8619e42091e2440.zip
Fix aliasing of launder.invariant.group
Summary: Patch for capture tracking broke bootstrap of clang with -fstict-vtable-pointers which resulted in debbugging nightmare. It was fixed https://reviews.llvm.org/D46900 but as it turned out, there were other parts like inliner (computing of noalias metadata) that I found after bootstraping with enabled assertions. Reviewers: hfinkel, rsmith, chandlerc, amharc, kuhar Subscribers: JDevlieghere, eraman, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D47088 llvm-svn: 333070
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/BasicAliasAnalysis.cpp24
1 files changed, 12 insertions, 12 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index 55a53f2122a..c1582b6e298 100644
--- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp
+++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
@@ -132,16 +132,8 @@ static bool isNonEscapingLocalObject(const Value *V) {
/// Returns true if the pointer is one which would have been considered an
/// escape by isNonEscapingLocalObject.
static bool isEscapeSource(const Value *V) {
- if (auto CS = ImmutableCallSite(V)) {
- // launder_invariant_group captures its argument only by returning it,
- // so it might not be considered an escape by isNonEscapingLocalObject.
- // Note that adding similar special cases for intrinsics in CaptureTracking
- // requires handling them here too.
- if (CS.getIntrinsicID() == Intrinsic::launder_invariant_group)
- return false;
-
+ if (ImmutableCallSite(V))
return true;
- }
if (isa<Argument>(V))
return true;
@@ -438,11 +430,19 @@ bool BasicAAResult::DecomposeGEPExpression(const Value *V,
const GEPOperator *GEPOp = dyn_cast<GEPOperator>(Op);
if (!GEPOp) {
- if (auto CS = ImmutableCallSite(V))
- if (const Value *RV = CS.getReturnedArgOperand()) {
- V = RV;
+ if (auto CS = ImmutableCallSite(V)) {
+ // Note: getArgumentAliasingToReturnedPointer keeps it in sync with
+ // CaptureTracking, which is needed for correctness. This is because
+ // some intrinsics like launder.invariant.group returns pointers that
+ // are aliasing it's argument, which is known to CaptureTracking.
+ // If AliasAnalysis does not use the same information, it could assume
+ // that pointer returned from launder does not alias it's argument
+ // because launder could not return it if the pointer was not captured.
+ if (auto *RP = getArgumentAliasingToReturnedPointer(CS)) {
+ V = RP;
continue;
}
+ }
// If it's not a GEP, hand it off to SimplifyInstruction to see if it
// can come up with something. This matches what GetUnderlyingObject does.
OpenPOWER on IntegriCloud