xref: /llvm-project/llvm/test/Transforms/SimplifyCFG/mmra.ll (revision cf328ff96daf5e676fb51ac86e550af7fd689fec)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S %s | FileCheck %s
3
4; RUN: opt -passes='simplifycfg<sink-common-insts;hoist-common-insts>,verify' -S %s | FileCheck %s
5
6declare void @clobber1()
7declare void @clobber2()
8
9define void @sink(ptr %arg, i1 %c) {
10; CHECK-LABEL: define void @sink(
11; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) {
12; CHECK-NEXT:  bb:
13; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
14; CHECK:       then:
15; CHECK-NEXT:    call void @clobber1()
16; CHECK-NEXT:    store ptr null, ptr [[ARG]], align 8
17; CHECK-NEXT:    br label [[EXIT:%.*]]
18; CHECK:       else:
19; CHECK-NEXT:    call void @clobber2()
20; CHECK-NEXT:    store ptr null, ptr [[ARG]], align 8, !mmra [[META0:![0-9]+]]
21; CHECK-NEXT:    br label [[EXIT]]
22; CHECK:       exit:
23; CHECK-NEXT:    ret void
24;
25bb:
26  br i1 %c, label %then, label %else
27
28then:
29  call void @clobber1()
30  store ptr null, ptr %arg, align 8
31  br label %exit
32
33else:
34  call void @clobber2()
35  store ptr null, ptr %arg, align 8, !mmra !0
36  br label %exit
37
38exit:
39  ret void
40}
41
42define void @hoist_store(ptr %arg, i1 %c) {
43; CHECK-LABEL: define void @hoist_store(
44; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) {
45; CHECK-NEXT:  bb:
46; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
47; CHECK:       then:
48; CHECK-NEXT:    store ptr null, ptr [[ARG]], align 8
49; CHECK-NEXT:    call void @clobber1()
50; CHECK-NEXT:    br label [[EXIT:%.*]]
51; CHECK:       else:
52; CHECK-NEXT:    store ptr null, ptr [[ARG]], align 8, !mmra [[META0]]
53; CHECK-NEXT:    call void @clobber2()
54; CHECK-NEXT:    br label [[EXIT]]
55; CHECK:       exit:
56; CHECK-NEXT:    ret void
57;
58bb:
59  br i1 %c, label %then, label %else
60
61then:
62  store ptr null, ptr %arg, align 8
63  call void @clobber1()
64  br label %exit
65
66else:
67  store ptr null, ptr %arg, align 8, !mmra !0
68  call void @clobber2()
69  br label %exit
70
71exit:
72  ret void
73}
74
75define ptr @sink_load(ptr %arg, i1 %c) {
76; CHECK-LABEL: define ptr @sink_load(
77; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) {
78; CHECK-NEXT:  bb:
79; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
80; CHECK:       then:
81; CHECK-NEXT:    call void @clobber1()
82; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr [[ARG]], align 8
83; CHECK-NEXT:    br label [[EXIT:%.*]]
84; CHECK:       else:
85; CHECK-NEXT:    call void @clobber2()
86; CHECK-NEXT:    [[L2:%.*]] = load ptr, ptr [[ARG]], align 8, !mmra [[META0]]
87; CHECK-NEXT:    br label [[EXIT]]
88; CHECK:       exit:
89; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ]
90; CHECK-NEXT:    ret ptr [[P]]
91;
92bb:
93  br i1 %c, label %then, label %else
94
95then:
96  call void @clobber1()
97  %l1 = load ptr, ptr %arg, align 8
98  br label %exit
99
100else:
101  call void @clobber2()
102  %l2 = load ptr, ptr %arg, align 8, !mmra !0
103  br label %exit
104
105exit:
106  %p = phi ptr [ %l1, %then ], [ %l2, %else ]
107  ret ptr %p
108}
109
110define ptr @hoist_load(ptr %arg, i1 %c) {
111; CHECK-LABEL: define ptr @hoist_load(
112; CHECK-SAME: ptr [[ARG:%.*]], i1 [[C:%.*]]) {
113; CHECK-NEXT:  bb:
114; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
115; CHECK:       then:
116; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr [[ARG]], align 8
117; CHECK-NEXT:    call void @clobber1()
118; CHECK-NEXT:    br label [[EXIT:%.*]]
119; CHECK:       else:
120; CHECK-NEXT:    [[L2:%.*]] = load ptr, ptr [[ARG]], align 8, !mmra [[META0]]
121; CHECK-NEXT:    call void @clobber2()
122; CHECK-NEXT:    br label [[EXIT]]
123; CHECK:       exit:
124; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ]
125; CHECK-NEXT:    ret ptr [[P]]
126;
127bb:
128  br i1 %c, label %then, label %else
129
130then:
131  %l1 = load ptr, ptr %arg, align 8
132  call void @clobber1()
133  br label %exit
134
135else:
136  %l2 = load ptr, ptr %arg, align 8, !mmra !0
137  call void @clobber2()
138  br label %exit
139
140exit:
141  %p = phi ptr [ %l1, %then ], [ %l2, %else ]
142  ret ptr %p
143}
144
145
146!0 = !{!"foo", !"bar"}
147
148;.
149; CHECK: [[META0]] = !{!"foo", !"bar"}
150;.
151