Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / hoist-sink-swifterror-store.ll
blob0c13f5703447a02c01490c82e7f732c96bfea85a
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -passes='simplifycfg<sink-common-insts;hoist-common-insts>,verify' -S %s | FileCheck %s
4 declare void @clobber1()
5 declare void @clobber2()
7 ; Do not try to sink the stores to the exit block, as this requires introducing
8 ; a select for the pointer operand. This is not allowed for swifterror pointers.
9 define swiftcc void @sink(ptr %arg, ptr swifterror %arg1, i1 %c) {
10 ; CHECK-LABEL: define swiftcc void @sink
11 ; CHECK-SAME: (ptr [[ARG:%.*]], ptr swifterror [[ARG1:%.*]], 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 [[ARG1]], align 8
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 %arg1, align 8
36   br label %exit
38 exit:
39   ret void
42 define swiftcc void @hoist_store(ptr %arg, ptr swifterror %arg1, i1 %c) {
43 ; CHECK-LABEL: define swiftcc void @hoist_store
44 ; CHECK-SAME: (ptr [[ARG:%.*]], ptr swifterror [[ARG1:%.*]], 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 [[ARG1]], align 8
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 %arg1, align 8
68   call void @clobber2()
69   br label %exit
71 exit:
72   ret void
75 ; FIXME: currently simplifycfg tries to sink the load to the exit block and
76 ; introduces a select for the pointer operand. This is not allowed for
77 ; swifterror pointers.
78 define swiftcc ptr @sink_load(ptr %arg, ptr swifterror %arg1, i1 %c) {
79 bb:
80   br i1 %c, label %then, label %else
82 then:
83   call void @clobber1()
84   %l1 = load ptr, ptr %arg, align 8
85   br label %exit
87 else:
88   call void @clobber2()
89   %l2 = load ptr, ptr %arg1, align 8
90   br label %exit
92 exit:
93   %p = phi ptr [ %l1, %then ], [ %l2, %else ]
94   ret ptr %p
96 define swiftcc ptr @hoist_load(ptr %arg, ptr swifterror %arg1, i1 %c) {
97 ; CHECK-LABEL: define swiftcc ptr @hoist_load
98 ; CHECK-SAME: (ptr [[ARG:%.*]], ptr swifterror [[ARG1:%.*]], i1 [[C:%.*]]) {
99 ; CHECK-NEXT:  bb:
100 ; CHECK-NEXT:    br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
101 ; CHECK:       then:
102 ; CHECK-NEXT:    [[L1:%.*]] = load ptr, ptr [[ARG]], align 8
103 ; CHECK-NEXT:    call void @clobber1()
104 ; CHECK-NEXT:    br label [[EXIT:%.*]]
105 ; CHECK:       else:
106 ; CHECK-NEXT:    [[L2:%.*]] = load ptr, ptr [[ARG1]], align 8
107 ; CHECK-NEXT:    call void @clobber2()
108 ; CHECK-NEXT:    br label [[EXIT]]
109 ; CHECK:       exit:
110 ; CHECK-NEXT:    [[P:%.*]] = phi ptr [ [[L1]], [[THEN]] ], [ [[L2]], [[ELSE]] ]
111 ; CHECK-NEXT:    ret ptr [[P]]
114   br i1 %c, label %then, label %else
116 then:
117   %l1 = load ptr, ptr %arg, align 8
118   call void @clobber1()
119   br label %exit
121 else:
122   %l2 = load ptr, ptr %arg1, align 8
123   call void @clobber2()
124   br label %exit
126 exit:
127   %p = phi ptr [ %l1, %then ], [ %l2, %else ]
128   ret ptr %p