Index: lib/Analysis/CaptureTracking.cpp =================================================================== --- lib/Analysis/CaptureTracking.cpp +++ lib/Analysis/CaptureTracking.cpp @@ -253,7 +253,7 @@ // 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(); + CallSite::arg_iterator B = CS.param_begin(), E = CS.param_end(); for (CallSite::arg_iterator A = B; A != E; ++A) if (A->get() == V && !CS.doesNotCapture(A - B)) // The parameter is not marked 'nocapture' - captured. Index: test/Feature/OperandBundles/dse.ll =================================================================== --- /dev/null +++ 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 +}