Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Feature / OperandBundles / dse.ll
blob440b710a2089e0c8d679a10eddb2d6dde6cc3047
1 ; RUN: opt -S -passes=dse < %s | FileCheck %s
3 declare void @f()
4 declare noalias ptr @malloc(i32) nounwind
6 define void @test_0() {
7 ; CHECK-LABEL: @test_0(
8   %m = call ptr @malloc(i32 24)
9   tail call void @f() [ "unknown"(ptr %m) ]
10 ; CHECK: store i8 -19, ptr %m
11   store i8 -19, ptr %m
12   ret void
15 define ptr @test_1() {
16 ; CHECK-LABEL: @test_1(
17   %m = call ptr @malloc(i32 24)
18   tail call void @f() [ "unknown"(ptr %m) ]
19   store i8 -19, ptr %m
20   tail call void @f()
21   store i8 101, ptr %m
23 ; CHECK: tail call void @f() [ "unknown"(ptr %m) ]
24 ; CHECK: store i8 -19, ptr %m
25 ; CHECK: tail call void @f()
26 ; CHECK: store i8 101, ptr %m
28   ret ptr %m
31 define void @test_2() {
32 ; Since the deopt operand bundle does not escape %m (see caveat below), it is
33 ; legal to elide the final store that location.
35 ; CHECK-LABEL: @test_2(
36   %m = call ptr @malloc(i32 24)
37   tail call void @f() [ "deopt"(ptr %m) ]
38   store i8 -19, ptr %m
39   ret void
41 ; CHECK:  tail call void @f() [ "deopt"(ptr %m) ]
42 ; CHECK-NEXT:  ret void
45 define ptr @test_3() {
46 ; Since the deopt operand bundle does not escape %m (see caveat below), @f
47 ; cannot observe the stores to %m
49 ; CHECK-LABEL: @test_3(
50   %m = call ptr @malloc(i32 24)
51   tail call void @f() [ "deopt"(ptr %m) ]
52   store i8 -19, ptr %m
53   tail call void @f()
54   store i8 101, ptr %m
55   ret ptr %m
59 ; Caveat: technically, %m can only escape if the calling function is deoptimized
60 ; at the call site (i.e. the call returns to the "deopt" continuation).  Since
61 ; the calling function body will be invalidated in that case, the calling
62 ; function can be optimized under the assumption that %m does not escape.