summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/CaptureTracking.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/CaptureTracking.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/CaptureTracking.cpp')
-rw-r--r--llvm/lib/Analysis/CaptureTracking.cpp12
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;
}
OpenPOWER on IntegriCloud