diff options
author | Piotr Padlewski <piotr.padlewski@gmail.com> | 2018-05-23 09:16:44 +0000 |
---|---|---|
committer | Piotr Padlewski <piotr.padlewski@gmail.com> | 2018-05-23 09:16:44 +0000 |
commit | d6f7346a4b4bdbdfef9ba7a5b8619e42091e2440 (patch) | |
tree | 9c009d37ea6f02879925ab71d94ac81a32701753 /llvm/lib/Analysis/CaptureTracking.cpp | |
parent | eb13d3d22e9bd303b4065b372a692cd04e4b8cc1 (diff) | |
download | bcm5719-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/CaptureTracking.cpp')
-rw-r--r-- | llvm/lib/Analysis/CaptureTracking.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/CaptureTracking.cpp b/llvm/lib/Analysis/CaptureTracking.cpp index 54466cd3467..d4f73bdb436 100644 --- a/llvm/lib/Analysis/CaptureTracking.cpp +++ b/llvm/lib/Analysis/CaptureTracking.cpp @@ -22,6 +22,7 @@ #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/CFG.h" #include "llvm/Analysis/OrderedBasicBlock.h" +#include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/CallSite.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Dominators.h" @@ -247,11 +248,12 @@ void llvm::PointerMayBeCaptured(const Value *V, CaptureTracker *Tracker) { if (CS.onlyReadsMemory() && CS.doesNotThrow() && I->getType()->isVoidTy()) break; - // launder.invariant.group only captures pointer by returning it, - // so the pointer wasn't captured if returned pointer is not captured. - // Note that adding similar special cases for intrinsics requires handling - // them in 'isEscapeSource' in BasicAA. - if (CS.getIntrinsicID() == Intrinsic::launder_invariant_group) { + // The pointer is not captured if returned pointer is not captured. + // NOTE: CaptureTracking users should not assume that only functions + // marked with nocapture do not capture. This means that places like + // GetUnderlyingObject in ValueTracking or DecomposeGEPExpression + // in BasicAA also need to know about this property. + if (isIntrinsicReturningPointerAliasingArgumentWithoutCapturing(CS)) { AddUses(I); break; } |