Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / mmra.ll
blob6670657471376bdbb494a355f551341f0f7a37f5
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
4 ; RUN: opt -passes='simplifycfg<sink-common-insts;hoist-common-insts>,verify' -S %s | FileCheck %s
6 declare void @clobber1()
7 declare void @clobber2()
9 define 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
25 bb:
26   br i1 %c, label %then, label %else
28 then:
29   call void @clobber1()
30   store ptr null, ptr %arg, align 8
31   br label %exit
33 else:
34   call void @clobber2()
35   store ptr null, ptr %arg, align 8, !mmra !0
36   br label %exit
38 exit:
39   ret void
42 define 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
58 bb:
59   br i1 %c, label %then, label %else
61 then:
62   store ptr null, ptr %arg, align 8
63   call void @clobber1()
64   br label %exit
66 else:
67   store ptr null, ptr %arg, align 8, !mmra !0
68   call void @clobber2()
69   br label %exit
71 exit:
72   ret void
75 define 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]]
92 bb:
93   br i1 %c, label %then, label %else
95 then:
96   call void @clobber1()
97   %l1 = load ptr, ptr %arg, align 8
98   br label %exit
100 else:
101   call void @clobber2()
102   %l2 = load ptr, ptr %arg, align 8, !mmra !0
103   br label %exit
105 exit:
106   %p = phi ptr [ %l1, %then ], [ %l2, %else ]
107   ret ptr %p
110 define 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]]
128   br i1 %c, label %then, label %else
130 then:
131   %l1 = load ptr, ptr %arg, align 8
132   call void @clobber1()
133   br label %exit
135 else:
136   %l2 = load ptr, ptr %arg, align 8, !mmra !0
137   call void @clobber2()
138   br label %exit
140 exit:
141   %p = phi ptr [ %l1, %then ], [ %l2, %else ]
142   ret ptr %p
146 !0 = !{!"foo", !"bar"}
149 ; CHECK: [[META0]] = !{!"foo", !"bar"}