mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[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 llvm-svn: 252095
This commit is contained in:
parent
c127f2db5e
commit
b36621a78e
@ -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))
|
||||
|
29
test/Feature/OperandBundles/dse.ll
Normal file
29
test/Feature/OperandBundles/dse.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user