diff options
Diffstat (limited to 'llvm/test/Feature/OperandBundles/dse.ll')
-rw-r--r-- | llvm/test/Feature/OperandBundles/dse.ll | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/test/Feature/OperandBundles/dse.ll b/llvm/test/Feature/OperandBundles/dse.ll index cc5647a2fa0..9ddf7f02e38 100644 --- a/llvm/test/Feature/OperandBundles/dse.ll +++ b/llvm/test/Feature/OperandBundles/dse.ll @@ -27,3 +27,36 @@ define i8* @test_1() { ret i8* %m } + +define void @test_2() { +; Since the deopt operand bundle does not escape %m (see caveat below), it is +; legal to elide the final store that location. + +; CHECK-LABEL: @test_2( + %m = call i8* @malloc(i32 24) + tail call void @f() [ "deopt"(i8* %m) ] + store i8 -19, i8* %m + ret void + +; CHECK: tail call void @f() [ "deopt"(i8* %m) ] +; CHECK-NEXT ret void +} + +define i8* @test_3() { +; Since the deopt operand bundle does not escape %m (see caveat below), @f +; cannot observe the stores to %m + +; CHECK-LABEL: @test_3( + %m = call i8* @malloc(i32 24) + tail call void @f() [ "deopt"(i8* %m) ] + store i8 -19, i8* %m + tail call void @f() + store i8 101, i8* %m + ret i8* %m +} + + +; Caveat: technically, %m can only escape if the calling function is deoptimized +; at the call site (i.e. the call returns to the "deopt" continuation). Since +; the calling function body will be invalidated in that case, the calling +; function can be optimized under the assumption that %m does not escape. |