From a6cbeb82b6689a1956d20c22c2e431388bdc5602 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Wed, 4 Nov 2015 23:21:06 +0000 Subject: [PATCH] [CaptureTracking] Support operand bundles conservatively Summary: Earlier CaptureTracking would assume all "interesting" operands to a call or invoke were its arguments. With operand bundles this is no longer true. Note: an earlier change got `doesNotCapture` working correctly with operand bundles. This change uses DSE to test the changes to CaptureTracking. DSE is a vehicle for testing only, and is not directly involved in this change. Reviewers: reames, majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14306 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252095 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CaptureTracking.cpp | 5 +++-- test/Feature/OperandBundles/dse.ll | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 test/Feature/OperandBundles/dse.ll diff --git a/lib/Analysis/CaptureTracking.cpp b/lib/Analysis/CaptureTracking.cpp index de5ec29c857..230a380c4bf 100644 --- a/lib/Analysis/CaptureTracking.cpp +++ b/lib/Analysis/CaptureTracking.cpp @@ -253,8 +253,9 @@ void llvm::PointerMayBeCaptured(const Value *V, CaptureTracker *Tracker) { // that loading a value from a pointer does not cause the pointer to be // captured, even though the loaded value might be the pointer itself // (think of self-referential objects). - CallSite::arg_iterator B = CS.arg_begin(), E = CS.arg_end(); - for (CallSite::arg_iterator A = B; A != E; ++A) + CallSite::data_operand_iterator B = + CS.data_operands_begin(), E = CS.data_operands_end(); + for (CallSite::data_operand_iterator A = B; A != E; ++A) if (A->get() == V && !CS.doesNotCapture(A - B)) // The parameter is not marked 'nocapture' - captured. if (Tracker->captured(U)) diff --git a/test/Feature/OperandBundles/dse.ll b/test/Feature/OperandBundles/dse.ll new file mode 100644 index 00000000000..cc5647a2fa0 --- /dev/null +++ b/test/Feature/OperandBundles/dse.ll @@ -0,0 +1,29 @@ +; RUN: opt -S -dse < %s | FileCheck %s + +declare void @f() +declare noalias i8* @malloc(i32) nounwind + +define void @test_0() { +; CHECK-LABEL: @test_0( + %m = call i8* @malloc(i32 24) + tail call void @f() [ "unknown"(i8* %m) ] +; CHECK: store i8 -19, i8* %m + store i8 -19, i8* %m + ret void +} + +define i8* @test_1() { +; CHECK-LABEL: @test_1( + %m = call i8* @malloc(i32 24) + tail call void @f() [ "unknown"(i8* %m) ] + store i8 -19, i8* %m + tail call void @f() + store i8 101, i8* %m + +; CHECK: tail call void @f() [ "unknown"(i8* %m) ] +; CHECK: store i8 -19, i8* %m +; CHECK: tail call void @f() +; CHECK: store i8 101, i8* %m + + ret i8* %m +} -- 2.34.1