annotate llvm/test/Transforms/LoopPredication/predicate-exits.ll @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
2 ; RUN: opt < %s -passes=loop-predication -S | FileCheck %s
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
3 ; RUN: opt -S -passes='require<scalar-evolution>,loop-mssa(loop-predication)' -verify-memoryssa < %s 2>&1 | FileCheck %s
150
anatofuz
parents:
diff changeset
4
anatofuz
parents:
diff changeset
5 declare void @prevent_merging()
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 ; Base case - with side effects in loop
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
8 define i32 @test1(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
9 ; CHECK-LABEL: @test1(
anatofuz
parents:
diff changeset
10 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
11 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
12 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
13 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
14 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH:%.*]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
17 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
18 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
19 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0:![0-9]+]]
150
anatofuz
parents:
diff changeset
20 ; CHECK: deopt:
anatofuz
parents:
diff changeset
21 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
22 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
23 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
24 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
25 ; CHECK: loop:
anatofuz
parents:
diff changeset
26 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
27 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
28 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
29 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
30 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
31 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
32 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
33 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
34 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
35 ; CHECK: guarded:
anatofuz
parents:
diff changeset
36 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
37 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
38 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
39 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
40 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
41 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
42 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
43 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
44 ; CHECK: exit:
anatofuz
parents:
diff changeset
45 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
46 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
47 ;
anatofuz
parents:
diff changeset
48 entry:
anatofuz
parents:
diff changeset
49 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
50 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
51 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 deopt:
anatofuz
parents:
diff changeset
54 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
55 ret i32 %deoptret
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 loop.preheader:
anatofuz
parents:
diff changeset
58 br label %loop
anatofuz
parents:
diff changeset
59
anatofuz
parents:
diff changeset
60 loop:
anatofuz
parents:
diff changeset
61 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
62 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
63 call void @unknown()
anatofuz
parents:
diff changeset
64 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
65 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 deopt2:
anatofuz
parents:
diff changeset
68 call void @unknown()
anatofuz
parents:
diff changeset
69 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
70 ret i32 %deoptret2
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 guarded:
anatofuz
parents:
diff changeset
73 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
74 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
75 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
76 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
77 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
78 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
79 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
80 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 exit:
anatofuz
parents:
diff changeset
83 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
84 ret i32 %result
anatofuz
parents:
diff changeset
85 }
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
89 define i32 @test_non_canonical(ptr %array, i32 %length, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
90 ; CHECK-LABEL: @test_non_canonical(
anatofuz
parents:
diff changeset
91 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
92 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
93 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[LENGTH:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
94 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
95 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
96 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
97 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
98 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
99 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
100 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
101 ; CHECK: deopt:
anatofuz
parents:
diff changeset
102 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
103 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
104 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
105 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
106 ; CHECK: loop:
anatofuz
parents:
diff changeset
107 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
108 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
109 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
110 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
111 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
112 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
113 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
114 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
115 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
116 ; CHECK: guarded:
anatofuz
parents:
diff changeset
117 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
118 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
119 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
120 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
121 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
122 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
123 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[LENGTH]]
anatofuz
parents:
diff changeset
124 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
125 ; CHECK: exit:
anatofuz
parents:
diff changeset
126 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
127 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
128 ;
anatofuz
parents:
diff changeset
129 entry:
anatofuz
parents:
diff changeset
130 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
131 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
132 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
133
anatofuz
parents:
diff changeset
134 deopt:
anatofuz
parents:
diff changeset
135 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
136 ret i32 %deoptret
anatofuz
parents:
diff changeset
137
anatofuz
parents:
diff changeset
138 loop.preheader:
anatofuz
parents:
diff changeset
139 br label %loop
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 loop:
anatofuz
parents:
diff changeset
142 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
143 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
144 call void @unknown()
anatofuz
parents:
diff changeset
145 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
146 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
147
anatofuz
parents:
diff changeset
148 deopt2:
anatofuz
parents:
diff changeset
149 call void @unknown()
anatofuz
parents:
diff changeset
150 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
151 ret i32 %deoptret2
anatofuz
parents:
diff changeset
152
anatofuz
parents:
diff changeset
153 guarded:
anatofuz
parents:
diff changeset
154 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
155 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
156 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
157 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
158 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
159 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
160 %continue = icmp ult i32 %i.next, %length
anatofuz
parents:
diff changeset
161 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
162
anatofuz
parents:
diff changeset
163 exit:
anatofuz
parents:
diff changeset
164 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
165 ret i32 %result
anatofuz
parents:
diff changeset
166 }
anatofuz
parents:
diff changeset
167
anatofuz
parents:
diff changeset
168
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
169 define i32 @test_two_range_checks(ptr %array, i32 %length.1, i32 %length.2, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
170 ; CHECK-LABEL: @test_two_range_checks(
anatofuz
parents:
diff changeset
171 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
172 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
173 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH_2:%.*]], i32 [[LENGTH_1:%.*]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
174 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
175 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
176 ; CHECK-NEXT: [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
177 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH_1]], [[UMIN1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
178 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
179 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
180 ; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LENGTH_2]], [[UMIN1]]
150
anatofuz
parents:
diff changeset
181 ; CHECK-NEXT: [[TMP5:%.*]] = freeze i1 [[TMP4]]
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
182 ; CHECK-NEXT: [[TMP6:%.*]] = and i1 [[TMP5]], [[TMP3]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
183 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP6]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
184 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
185 ; CHECK: deopt:
anatofuz
parents:
diff changeset
186 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
187 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
188 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
189 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
190 ; CHECK: loop:
anatofuz
parents:
diff changeset
191 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED2:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
192 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED2]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
193 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
194 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH_1]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
195 ; CHECK-NEXT: br i1 true, label [[GUARDED:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
196 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
197 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
198 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
199 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
200 ; CHECK: guarded:
anatofuz
parents:
diff changeset
201 ; CHECK-NEXT: [[WITHIN_BOUNDS2:%.*]] = icmp ult i32 [[I]], [[LENGTH_2]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
202 ; CHECK-NEXT: br i1 true, label [[GUARDED2]], label [[DEOPT3:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
203 ; CHECK: deopt3:
anatofuz
parents:
diff changeset
204 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
205 ; CHECK-NEXT: [[DEOPTRET3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
206 ; CHECK-NEXT: ret i32 [[DEOPTRET3]]
anatofuz
parents:
diff changeset
207 ; CHECK: guarded2:
anatofuz
parents:
diff changeset
208 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
209 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
210 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
211 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
212 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
213 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
214 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
215 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
216 ; CHECK: exit:
anatofuz
parents:
diff changeset
217 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED2]] ]
anatofuz
parents:
diff changeset
218 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
219 ;
anatofuz
parents:
diff changeset
220 entry:
anatofuz
parents:
diff changeset
221 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
222 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
223 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
224
anatofuz
parents:
diff changeset
225 deopt:
anatofuz
parents:
diff changeset
226 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
227 ret i32 %deoptret
anatofuz
parents:
diff changeset
228
anatofuz
parents:
diff changeset
229 loop.preheader:
anatofuz
parents:
diff changeset
230 br label %loop
anatofuz
parents:
diff changeset
231
anatofuz
parents:
diff changeset
232 loop:
anatofuz
parents:
diff changeset
233 %loop.acc = phi i32 [ %loop.acc.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
234 %i = phi i32 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
235 call void @unknown()
anatofuz
parents:
diff changeset
236 %within.bounds = icmp ult i32 %i, %length.1
anatofuz
parents:
diff changeset
237 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
238
anatofuz
parents:
diff changeset
239 deopt2:
anatofuz
parents:
diff changeset
240 call void @unknown()
anatofuz
parents:
diff changeset
241 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
242 ret i32 %deoptret2
anatofuz
parents:
diff changeset
243
anatofuz
parents:
diff changeset
244 guarded:
anatofuz
parents:
diff changeset
245 %within.bounds2 = icmp ult i32 %i, %length.2
anatofuz
parents:
diff changeset
246 br i1 %within.bounds2, label %guarded2, label %deopt3, !prof !0
anatofuz
parents:
diff changeset
247
anatofuz
parents:
diff changeset
248 deopt3:
anatofuz
parents:
diff changeset
249 call void @unknown()
anatofuz
parents:
diff changeset
250 %deoptret3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
251 ret i32 %deoptret3
anatofuz
parents:
diff changeset
252
anatofuz
parents:
diff changeset
253 guarded2:
anatofuz
parents:
diff changeset
254 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
255 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
256 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
257 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
258 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
259 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
260 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
261 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
262
anatofuz
parents:
diff changeset
263 exit:
anatofuz
parents:
diff changeset
264 %result = phi i32 [ %loop.acc.next, %guarded2 ]
anatofuz
parents:
diff changeset
265 ret i32 %result
anatofuz
parents:
diff changeset
266 }
anatofuz
parents:
diff changeset
267
anatofuz
parents:
diff changeset
268 @G = external global i32
anatofuz
parents:
diff changeset
269
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
270 define i32 @test_unanalyzeable_exit(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
271 ; CHECK-LABEL: @test_unanalyzeable_exit(
anatofuz
parents:
diff changeset
272 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
273 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
274 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
275 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
276 ; CHECK: deopt:
anatofuz
parents:
diff changeset
277 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
278 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
279 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
280 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
281 ; CHECK: loop:
anatofuz
parents:
diff changeset
282 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED2:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
283 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED2]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
284 ; CHECK-NEXT: call void @unknown()
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
285 ; CHECK-NEXT: [[VOL:%.*]] = load volatile i32, ptr @G, align 4
150
anatofuz
parents:
diff changeset
286 ; CHECK-NEXT: [[UNKNOWN:%.*]] = icmp eq i32 [[VOL]], 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
287 ; CHECK-NEXT: br i1 [[UNKNOWN]], label [[GUARDED2]], label [[DEOPT3:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
288 ; CHECK: deopt3:
anatofuz
parents:
diff changeset
289 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
290 ; CHECK-NEXT: [[DEOPTRET3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
291 ; CHECK-NEXT: ret i32 [[DEOPTRET3]]
anatofuz
parents:
diff changeset
292 ; CHECK: guarded2:
anatofuz
parents:
diff changeset
293 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
294 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
295 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
296 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
297 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
298 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
299 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N:%.*]]
anatofuz
parents:
diff changeset
300 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
301 ; CHECK: exit:
anatofuz
parents:
diff changeset
302 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED2]] ]
anatofuz
parents:
diff changeset
303 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
304 ;
anatofuz
parents:
diff changeset
305 entry:
anatofuz
parents:
diff changeset
306 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
307 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
308 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
309
anatofuz
parents:
diff changeset
310 deopt:
anatofuz
parents:
diff changeset
311 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
312 ret i32 %deoptret
anatofuz
parents:
diff changeset
313
anatofuz
parents:
diff changeset
314 loop.preheader:
anatofuz
parents:
diff changeset
315 br label %loop
anatofuz
parents:
diff changeset
316
anatofuz
parents:
diff changeset
317 loop:
anatofuz
parents:
diff changeset
318 %loop.acc = phi i32 [ %loop.acc.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
319 %i = phi i32 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
320 call void @unknown()
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
321 %vol = load volatile i32, ptr @G
150
anatofuz
parents:
diff changeset
322 %unknown = icmp eq i32 %vol, 0
anatofuz
parents:
diff changeset
323 br i1 %unknown, label %guarded2, label %deopt3, !prof !0
anatofuz
parents:
diff changeset
324
anatofuz
parents:
diff changeset
325 deopt3:
anatofuz
parents:
diff changeset
326 call void @unknown()
anatofuz
parents:
diff changeset
327 %deoptret3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
328 ret i32 %deoptret3
anatofuz
parents:
diff changeset
329
anatofuz
parents:
diff changeset
330 guarded2:
anatofuz
parents:
diff changeset
331 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
332 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
333 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
334 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
335 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
336 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
337 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
338 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
339
anatofuz
parents:
diff changeset
340 exit:
anatofuz
parents:
diff changeset
341 %result = phi i32 [ %loop.acc.next, %guarded2 ]
anatofuz
parents:
diff changeset
342 ret i32 %result
anatofuz
parents:
diff changeset
343 }
anatofuz
parents:
diff changeset
344
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
345 define i32 @test_unanalyzeable_exit2(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
346 ; CHECK-LABEL: @test_unanalyzeable_exit2(
anatofuz
parents:
diff changeset
347 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
348 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
349 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
350 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
351 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH:%.*]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
352 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
353 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
354 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
355 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
356 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
357 ; CHECK: deopt:
anatofuz
parents:
diff changeset
358 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
359 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
360 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
361 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
362 ; CHECK: loop:
anatofuz
parents:
diff changeset
363 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED2:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
364 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED2]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
365 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
366 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
367 ; CHECK-NEXT: br i1 true, label [[GUARDED:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
368 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
369 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
370 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
371 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
372 ; CHECK: guarded:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
373 ; CHECK-NEXT: [[VOL:%.*]] = load volatile i32, ptr @G, align 4
150
anatofuz
parents:
diff changeset
374 ; CHECK-NEXT: [[UNKNOWN:%.*]] = icmp eq i32 [[VOL]], 0
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
375 ; CHECK-NEXT: br i1 [[UNKNOWN]], label [[GUARDED2]], label [[DEOPT3:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
376 ; CHECK: deopt3:
anatofuz
parents:
diff changeset
377 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
378 ; CHECK-NEXT: [[DEOPTRET3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
379 ; CHECK-NEXT: ret i32 [[DEOPTRET3]]
anatofuz
parents:
diff changeset
380 ; CHECK: guarded2:
anatofuz
parents:
diff changeset
381 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
382 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
383 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
384 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
385 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
386 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
387 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
388 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
389 ; CHECK: exit:
anatofuz
parents:
diff changeset
390 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED2]] ]
anatofuz
parents:
diff changeset
391 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
392 ;
anatofuz
parents:
diff changeset
393 entry:
anatofuz
parents:
diff changeset
394 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
395 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
396 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
397
anatofuz
parents:
diff changeset
398 deopt:
anatofuz
parents:
diff changeset
399 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
400 ret i32 %deoptret
anatofuz
parents:
diff changeset
401
anatofuz
parents:
diff changeset
402 loop.preheader:
anatofuz
parents:
diff changeset
403 br label %loop
anatofuz
parents:
diff changeset
404
anatofuz
parents:
diff changeset
405 loop:
anatofuz
parents:
diff changeset
406 %loop.acc = phi i32 [ %loop.acc.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
407 %i = phi i32 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
408 call void @unknown()
anatofuz
parents:
diff changeset
409 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
410 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
411
anatofuz
parents:
diff changeset
412 deopt2:
anatofuz
parents:
diff changeset
413 call void @unknown()
anatofuz
parents:
diff changeset
414 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
415 ret i32 %deoptret2
anatofuz
parents:
diff changeset
416
anatofuz
parents:
diff changeset
417 guarded:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
418 %vol = load volatile i32, ptr @G
150
anatofuz
parents:
diff changeset
419 %unknown = icmp eq i32 %vol, 0
anatofuz
parents:
diff changeset
420 br i1 %unknown, label %guarded2, label %deopt3, !prof !0
anatofuz
parents:
diff changeset
421
anatofuz
parents:
diff changeset
422 deopt3:
anatofuz
parents:
diff changeset
423 call void @unknown()
anatofuz
parents:
diff changeset
424 %deoptret3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
425 ret i32 %deoptret3
anatofuz
parents:
diff changeset
426
anatofuz
parents:
diff changeset
427 guarded2:
anatofuz
parents:
diff changeset
428 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
429 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
430 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
431 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
432 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
433 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
434 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
435 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
436
anatofuz
parents:
diff changeset
437 exit:
anatofuz
parents:
diff changeset
438 %result = phi i32 [ %loop.acc.next, %guarded2 ]
anatofuz
parents:
diff changeset
439 ret i32 %result
anatofuz
parents:
diff changeset
440 }
anatofuz
parents:
diff changeset
441
anatofuz
parents:
diff changeset
442
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
443 define i32 @test_unanalyzeable_latch(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
444 ; CHECK-LABEL: @test_unanalyzeable_latch(
anatofuz
parents:
diff changeset
445 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
446 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
447 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
448 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
449 ; CHECK: deopt:
anatofuz
parents:
diff changeset
450 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
451 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
452 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
453 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
454 ; CHECK: loop:
anatofuz
parents:
diff changeset
455 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
456 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
457 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
458 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH:%.*]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
459 ; CHECK-NEXT: br i1 [[WITHIN_BOUNDS]], label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
460 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
461 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
462 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
463 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
464 ; CHECK: guarded:
anatofuz
parents:
diff changeset
465 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
466 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
467 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
468 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
469 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
470 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
471 ; CHECK-NEXT: [[VOL:%.*]] = load volatile i32, ptr @G, align 4
150
anatofuz
parents:
diff changeset
472 ; CHECK-NEXT: [[UNKNOWN:%.*]] = icmp eq i32 [[VOL]], 0
anatofuz
parents:
diff changeset
473 ; CHECK-NEXT: br i1 [[UNKNOWN]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
474 ; CHECK: exit:
anatofuz
parents:
diff changeset
475 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
476 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
477 ;
anatofuz
parents:
diff changeset
478 entry:
anatofuz
parents:
diff changeset
479 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
480 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
481 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
482
anatofuz
parents:
diff changeset
483 deopt:
anatofuz
parents:
diff changeset
484 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
485 ret i32 %deoptret
anatofuz
parents:
diff changeset
486
anatofuz
parents:
diff changeset
487 loop.preheader:
anatofuz
parents:
diff changeset
488 br label %loop
anatofuz
parents:
diff changeset
489
anatofuz
parents:
diff changeset
490 loop:
anatofuz
parents:
diff changeset
491 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
492 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
493 call void @unknown()
anatofuz
parents:
diff changeset
494 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
495 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
496
anatofuz
parents:
diff changeset
497 deopt2:
anatofuz
parents:
diff changeset
498 call void @unknown()
anatofuz
parents:
diff changeset
499 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
500 ret i32 %deoptret2
anatofuz
parents:
diff changeset
501
anatofuz
parents:
diff changeset
502 guarded:
anatofuz
parents:
diff changeset
503 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
504 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
505 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
506 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
507 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
508 %i.next = add nuw i32 %i, 1
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
509 %vol = load volatile i32, ptr @G
150
anatofuz
parents:
diff changeset
510 %unknown = icmp eq i32 %vol, 0
anatofuz
parents:
diff changeset
511 br i1 %unknown, label %loop, label %exit
anatofuz
parents:
diff changeset
512
anatofuz
parents:
diff changeset
513 exit:
anatofuz
parents:
diff changeset
514 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
515 ret i32 %result
anatofuz
parents:
diff changeset
516 }
anatofuz
parents:
diff changeset
517
anatofuz
parents:
diff changeset
518
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
519 define i32 @provably_taken(ptr %array, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
520 ; CHECK-LABEL: @provably_taken(
anatofuz
parents:
diff changeset
521 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
522 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
523 ; CHECK-NEXT: [[TMP0:%.*]] = freeze i1 false
anatofuz
parents:
diff changeset
524 ; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[TMP0]], [[COND_0:%.*]]
anatofuz
parents:
diff changeset
525 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP1]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
526 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
527 ; CHECK: deopt:
anatofuz
parents:
diff changeset
528 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
529 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
530 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
531 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
532 ; CHECK: loop:
anatofuz
parents:
diff changeset
533 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
534 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
535 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
536 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], 198
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
537 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
538 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
539 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
540 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
541 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
542 ; CHECK: guarded:
anatofuz
parents:
diff changeset
543 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
544 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
545 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
546 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
547 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
548 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
549 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], 200
anatofuz
parents:
diff changeset
550 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
551 ; CHECK: exit:
anatofuz
parents:
diff changeset
552 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
553 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
554 ;
anatofuz
parents:
diff changeset
555 entry:
anatofuz
parents:
diff changeset
556 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
557 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
558 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
559
anatofuz
parents:
diff changeset
560 deopt:
anatofuz
parents:
diff changeset
561 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
562 ret i32 %deoptret
anatofuz
parents:
diff changeset
563
anatofuz
parents:
diff changeset
564 loop.preheader:
anatofuz
parents:
diff changeset
565 br label %loop
anatofuz
parents:
diff changeset
566
anatofuz
parents:
diff changeset
567 loop:
anatofuz
parents:
diff changeset
568 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
569 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
570 call void @unknown()
anatofuz
parents:
diff changeset
571 %within.bounds = icmp ult i32 %i, 198
anatofuz
parents:
diff changeset
572 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
573
anatofuz
parents:
diff changeset
574 deopt2:
anatofuz
parents:
diff changeset
575 call void @unknown()
anatofuz
parents:
diff changeset
576 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
577 ret i32 %deoptret2
anatofuz
parents:
diff changeset
578
anatofuz
parents:
diff changeset
579 guarded:
anatofuz
parents:
diff changeset
580 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
581 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
582 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
583 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
584 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
585 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
586 %continue = icmp ult i32 %i.next, 200
anatofuz
parents:
diff changeset
587 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
588
anatofuz
parents:
diff changeset
589 exit:
anatofuz
parents:
diff changeset
590 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
591 ret i32 %result
anatofuz
parents:
diff changeset
592 }
anatofuz
parents:
diff changeset
593
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
594 define i32 @provably_not_taken(ptr %array, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
595 ; CHECK-LABEL: @provably_not_taken(
anatofuz
parents:
diff changeset
596 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
597 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
598 ; CHECK-NEXT: [[TMP0:%.*]] = freeze i1 true
anatofuz
parents:
diff changeset
599 ; CHECK-NEXT: [[TMP1:%.*]] = and i1 [[TMP0]], [[COND_0:%.*]]
anatofuz
parents:
diff changeset
600 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP1]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
601 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
602 ; CHECK: deopt:
anatofuz
parents:
diff changeset
603 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
604 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
605 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
606 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
607 ; CHECK: loop:
anatofuz
parents:
diff changeset
608 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
609 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
610 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
611 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], 205
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
612 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
613 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
614 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
615 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
616 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
617 ; CHECK: guarded:
anatofuz
parents:
diff changeset
618 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
619 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
620 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
621 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
622 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
623 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
624 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], 200
anatofuz
parents:
diff changeset
625 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
626 ; CHECK: exit:
anatofuz
parents:
diff changeset
627 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
628 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
629 ;
anatofuz
parents:
diff changeset
630 entry:
anatofuz
parents:
diff changeset
631 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
632 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
633 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
634
anatofuz
parents:
diff changeset
635 deopt:
anatofuz
parents:
diff changeset
636 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
637 ret i32 %deoptret
anatofuz
parents:
diff changeset
638
anatofuz
parents:
diff changeset
639 loop.preheader:
anatofuz
parents:
diff changeset
640 br label %loop
anatofuz
parents:
diff changeset
641
anatofuz
parents:
diff changeset
642 loop:
anatofuz
parents:
diff changeset
643 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
644 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
645 call void @unknown()
anatofuz
parents:
diff changeset
646 %within.bounds = icmp ult i32 %i, 205
anatofuz
parents:
diff changeset
647 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
648
anatofuz
parents:
diff changeset
649 deopt2:
anatofuz
parents:
diff changeset
650 call void @unknown()
anatofuz
parents:
diff changeset
651 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
652 ret i32 %deoptret2
anatofuz
parents:
diff changeset
653
anatofuz
parents:
diff changeset
654 guarded:
anatofuz
parents:
diff changeset
655 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
656 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
657 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
658 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
659 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
660 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
661 %continue = icmp ult i32 %i.next, 200
anatofuz
parents:
diff changeset
662 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
663
anatofuz
parents:
diff changeset
664 exit:
anatofuz
parents:
diff changeset
665 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
666 ret i32 %result
anatofuz
parents:
diff changeset
667 }
anatofuz
parents:
diff changeset
668
anatofuz
parents:
diff changeset
669
anatofuz
parents:
diff changeset
670 ;; Unswitch likes to produce some ugly exit blocks without simplifications
anatofuz
parents:
diff changeset
671 ;; being applied. Make sure we can handle that form.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
672 define i32 @unswitch_exit_form(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
673 ; CHECK-LABEL: @unswitch_exit_form(
anatofuz
parents:
diff changeset
674 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
675 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
676 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
677 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
678 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH:%.*]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
679 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
680 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
681 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
682 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP3]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
683 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
684 ; CHECK: deopt.loopexit:
anatofuz
parents:
diff changeset
685 ; CHECK-NEXT: br label [[DEOPT]]
anatofuz
parents:
diff changeset
686 ; CHECK: deopt:
anatofuz
parents:
diff changeset
687 ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ 1, [[DEOPT_LOOPEXIT:%.*]] ]
anatofuz
parents:
diff changeset
688 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
689 ; CHECK-NEXT: br label [[ACTUAL_DEOPT:%.*]]
anatofuz
parents:
diff changeset
690 ; CHECK: actual_deopt:
anatofuz
parents:
diff changeset
691 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[PHI]]) ]
anatofuz
parents:
diff changeset
692 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
693 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
694 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
695 ; CHECK: loop:
anatofuz
parents:
diff changeset
696 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
697 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
698 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
699 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
700 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT_LOOPEXIT]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
701 ; CHECK: guarded:
anatofuz
parents:
diff changeset
702 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
703 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
704 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
705 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
706 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
707 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
708 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
709 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
710 ; CHECK: exit:
anatofuz
parents:
diff changeset
711 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
712 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
713 ;
anatofuz
parents:
diff changeset
714 entry:
anatofuz
parents:
diff changeset
715 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
716 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
717 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
718
anatofuz
parents:
diff changeset
719 deopt:
anatofuz
parents:
diff changeset
720 ;; This is written to look like an unsimplified loop exit after unswitch
anatofuz
parents:
diff changeset
721 ;; (i.e. phis, merge, and branch to actual block)
anatofuz
parents:
diff changeset
722 %phi = phi i32 [0, %entry], [1, %loop]
anatofuz
parents:
diff changeset
723 call void @unknown() ;; it's okay to skip possible throws
anatofuz
parents:
diff changeset
724 br label %actual_deopt
anatofuz
parents:
diff changeset
725
anatofuz
parents:
diff changeset
726 actual_deopt:
anatofuz
parents:
diff changeset
727 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 %phi) ]
anatofuz
parents:
diff changeset
728 ret i32 %deoptret
anatofuz
parents:
diff changeset
729
anatofuz
parents:
diff changeset
730 loop.preheader:
anatofuz
parents:
diff changeset
731 br label %loop
anatofuz
parents:
diff changeset
732
anatofuz
parents:
diff changeset
733 loop:
anatofuz
parents:
diff changeset
734 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
735 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
736 call void @unknown()
anatofuz
parents:
diff changeset
737 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
738 br i1 %within.bounds, label %guarded, label %deopt, !prof !0
anatofuz
parents:
diff changeset
739
anatofuz
parents:
diff changeset
740 guarded:
anatofuz
parents:
diff changeset
741 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
742 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
743 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
744 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
745 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
746 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
747 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
748 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
749
anatofuz
parents:
diff changeset
750 exit:
anatofuz
parents:
diff changeset
751 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
752 ret i32 %result
anatofuz
parents:
diff changeset
753 }
anatofuz
parents:
diff changeset
754
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
755 define i32 @swapped_wb(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
756 ; CHECK-LABEL: @swapped_wb(
anatofuz
parents:
diff changeset
757 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
758 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
759 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
760 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
761 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH:%.*]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
762 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
763 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
764 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
765 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDENABLE_COND]], [[TMP3]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
766 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
767 ; CHECK: deopt:
anatofuz
parents:
diff changeset
768 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
769 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
770 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
771 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
772 ; CHECK: loop:
anatofuz
parents:
diff changeset
773 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
774 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
775 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
776 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
777 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
778 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
779 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
780 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
781 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
782 ; CHECK: guarded:
anatofuz
parents:
diff changeset
783 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
784 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
785 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
786 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
787 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
788 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
789 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
790 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
791 ; CHECK: exit:
anatofuz
parents:
diff changeset
792 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
793 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
794 ;
anatofuz
parents:
diff changeset
795 entry:
anatofuz
parents:
diff changeset
796 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
797 %exiplicit_guard_cond = and i1 %widenable_cond, %cond_0
anatofuz
parents:
diff changeset
798 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
799
anatofuz
parents:
diff changeset
800 deopt:
anatofuz
parents:
diff changeset
801 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
802 ret i32 %deoptret
anatofuz
parents:
diff changeset
803
anatofuz
parents:
diff changeset
804 loop.preheader:
anatofuz
parents:
diff changeset
805 br label %loop
anatofuz
parents:
diff changeset
806
anatofuz
parents:
diff changeset
807 loop:
anatofuz
parents:
diff changeset
808 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
809 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
810 call void @unknown()
anatofuz
parents:
diff changeset
811 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
812 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
813
anatofuz
parents:
diff changeset
814 deopt2:
anatofuz
parents:
diff changeset
815 call void @unknown()
anatofuz
parents:
diff changeset
816 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
817 ret i32 %deoptret2
anatofuz
parents:
diff changeset
818
anatofuz
parents:
diff changeset
819 guarded:
anatofuz
parents:
diff changeset
820 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
821 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
822 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
823 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
824 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
825 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
826 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
827 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
828
anatofuz
parents:
diff changeset
829 exit:
anatofuz
parents:
diff changeset
830 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
831 ret i32 %result
anatofuz
parents:
diff changeset
832 }
anatofuz
parents:
diff changeset
833
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
834 define i32 @trivial_wb(ptr %array, i32 %length, i32 %n) {
150
anatofuz
parents:
diff changeset
835 ; CHECK-LABEL: @trivial_wb(
anatofuz
parents:
diff changeset
836 ; CHECK-NEXT: entry:
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
837 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
838 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
839 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH:%.*]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
840 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
841 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
150
anatofuz
parents:
diff changeset
842 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
843 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
844 ; CHECK-NEXT: br i1 [[TMP3]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
845 ; CHECK: deopt:
anatofuz
parents:
diff changeset
846 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
847 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
848 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
849 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
850 ; CHECK: loop:
anatofuz
parents:
diff changeset
851 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
852 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
853 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
854 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
855 ; CHECK-NEXT: br i1 true, label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
856 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
857 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
858 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
859 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
860 ; CHECK: guarded:
anatofuz
parents:
diff changeset
861 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
862 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
863 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
864 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
865 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
866 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
867 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
868 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
869 ; CHECK: exit:
anatofuz
parents:
diff changeset
870 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED]] ]
anatofuz
parents:
diff changeset
871 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
872 ;
anatofuz
parents:
diff changeset
873 entry:
anatofuz
parents:
diff changeset
874 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
875 br i1 %widenable_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
876
anatofuz
parents:
diff changeset
877 deopt:
anatofuz
parents:
diff changeset
878 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
879 ret i32 %deoptret
anatofuz
parents:
diff changeset
880
anatofuz
parents:
diff changeset
881 loop.preheader:
anatofuz
parents:
diff changeset
882 br label %loop
anatofuz
parents:
diff changeset
883
anatofuz
parents:
diff changeset
884 loop:
anatofuz
parents:
diff changeset
885 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
886 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
887 call void @unknown()
anatofuz
parents:
diff changeset
888 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
889 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
890
anatofuz
parents:
diff changeset
891 deopt2:
anatofuz
parents:
diff changeset
892 call void @unknown()
anatofuz
parents:
diff changeset
893 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
894 ret i32 %deoptret2
anatofuz
parents:
diff changeset
895
anatofuz
parents:
diff changeset
896 guarded:
anatofuz
parents:
diff changeset
897 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
898 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
899 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
900 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
901 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
902 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
903 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
904 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
905
anatofuz
parents:
diff changeset
906 exit:
anatofuz
parents:
diff changeset
907 %result = phi i32 [ %loop.acc.next, %guarded ]
anatofuz
parents:
diff changeset
908 ret i32 %result
anatofuz
parents:
diff changeset
909 }
anatofuz
parents:
diff changeset
910
anatofuz
parents:
diff changeset
911 ; TODO: Non-latch exits can still be predicated
anatofuz
parents:
diff changeset
912 ; This is currently prevented by an overly restrictive profitability check.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
913 define i32 @todo_unconditional_latch(ptr %array, i32 %length, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
914 ; CHECK-LABEL: @todo_unconditional_latch(
anatofuz
parents:
diff changeset
915 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
916 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
917 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
918 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
919 ; CHECK: deopt:
anatofuz
parents:
diff changeset
920 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
921 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
922 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
923 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
924 ; CHECK: loop:
anatofuz
parents:
diff changeset
925 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
926 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
927 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
928 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH:%.*]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
929 ; CHECK-NEXT: br i1 [[WITHIN_BOUNDS]], label [[GUARDED]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
930 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
931 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
932 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
933 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
934 ; CHECK: guarded:
anatofuz
parents:
diff changeset
935 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
936 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
937 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
938 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
939 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
940 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
941 ; CHECK-NEXT: br label [[LOOP]]
anatofuz
parents:
diff changeset
942 ;
anatofuz
parents:
diff changeset
943 entry:
anatofuz
parents:
diff changeset
944 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
945 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
946 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
947
anatofuz
parents:
diff changeset
948 deopt:
anatofuz
parents:
diff changeset
949 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
950 ret i32 %deoptret
anatofuz
parents:
diff changeset
951
anatofuz
parents:
diff changeset
952 loop.preheader:
anatofuz
parents:
diff changeset
953 br label %loop
anatofuz
parents:
diff changeset
954
anatofuz
parents:
diff changeset
955 loop:
anatofuz
parents:
diff changeset
956 %loop.acc = phi i32 [ %loop.acc.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
957 %i = phi i32 [ %i.next, %guarded ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
958 call void @unknown()
anatofuz
parents:
diff changeset
959 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
960 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
961
anatofuz
parents:
diff changeset
962 deopt2:
anatofuz
parents:
diff changeset
963 call void @unknown()
anatofuz
parents:
diff changeset
964 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
965 ret i32 %deoptret2
anatofuz
parents:
diff changeset
966
anatofuz
parents:
diff changeset
967 guarded:
anatofuz
parents:
diff changeset
968 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
969 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
970 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
971 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
972 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
973 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
974 br label %loop
anatofuz
parents:
diff changeset
975 }
anatofuz
parents:
diff changeset
976
anatofuz
parents:
diff changeset
977
anatofuz
parents:
diff changeset
978 ; If we have a stray widenable branch in the loop, we should still be able to
anatofuz
parents:
diff changeset
979 ; run. This can happen when unswitching's cost model avoids unswitching some
anatofuz
parents:
diff changeset
980 ; branches.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
981 define i32 @wb_in_loop(ptr %array, i32 %length, i32 %n, i1 %cond_0) {
150
anatofuz
parents:
diff changeset
982 ; CHECK-LABEL: @wb_in_loop(
anatofuz
parents:
diff changeset
983 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
984 ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
985 ; CHECK-NEXT: [[WC2:%.*]] = call i1 @llvm.experimental.widenable.condition()
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
986 ; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N:%.*]], i32 1)
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
987 ; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[UMAX]], -1
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
988 ; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[LENGTH:%.*]], i32 [[TMP0]])
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
989 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
990 ; CHECK-NEXT: [[TMP2:%.*]] = freeze i1 [[TMP1]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
991 ; CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP2]], [[COND_0:%.*]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
992 ; CHECK-NEXT: [[TMP4:%.*]] = icmp ugt i32 [[LENGTH]], [[UMIN]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
993 ; CHECK-NEXT: [[TMP5:%.*]] = freeze i1 [[TMP4]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
994 ; CHECK-NEXT: [[TMP6:%.*]] = and i1 [[TMP5]], [[TMP3]]
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
995 ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[TMP6]], [[WIDENABLE_COND]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
996 ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[LOOP_PREHEADER:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
997 ; CHECK: deopt:
anatofuz
parents:
diff changeset
998 ; CHECK-NEXT: [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
999 ; CHECK-NEXT: ret i32 [[DEOPTRET]]
anatofuz
parents:
diff changeset
1000 ; CHECK: loop.preheader:
anatofuz
parents:
diff changeset
1001 ; CHECK-NEXT: br label [[LOOP:%.*]]
anatofuz
parents:
diff changeset
1002 ; CHECK: loop:
anatofuz
parents:
diff changeset
1003 ; CHECK-NEXT: [[LOOP_ACC:%.*]] = phi i32 [ [[LOOP_ACC_NEXT:%.*]], [[GUARDED2:%.*]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
1004 ; CHECK-NEXT: [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[GUARDED2]] ], [ 0, [[LOOP_PREHEADER]] ]
anatofuz
parents:
diff changeset
1005 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
1006 ; CHECK-NEXT: [[WITHIN_BOUNDS:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1007 ; CHECK-NEXT: br i1 true, label [[GUARDED:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
1008 ; CHECK: deopt2:
anatofuz
parents:
diff changeset
1009 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
1010 ; CHECK-NEXT: [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
1011 ; CHECK-NEXT: ret i32 [[DEOPTRET2]]
anatofuz
parents:
diff changeset
1012 ; CHECK: guarded:
anatofuz
parents:
diff changeset
1013 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
1014 ; CHECK-NEXT: [[WITHIN_BOUNDS2:%.*]] = icmp ult i32 [[I]], [[LENGTH]]
anatofuz
parents:
diff changeset
1015 ; CHECK-NEXT: [[WB_COND:%.*]] = and i1 [[WITHIN_BOUNDS2]], true
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1016 ; CHECK-NEXT: br i1 true, label [[GUARDED2]], label [[DEOPT3:%.*]], !prof [[PROF0]]
150
anatofuz
parents:
diff changeset
1017 ; CHECK: deopt3:
anatofuz
parents:
diff changeset
1018 ; CHECK-NEXT: call void @unknown()
anatofuz
parents:
diff changeset
1019 ; CHECK-NEXT: [[DEOPTRET3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
1020 ; CHECK-NEXT: ret i32 [[DEOPTRET3]]
anatofuz
parents:
diff changeset
1021 ; CHECK: guarded2:
anatofuz
parents:
diff changeset
1022 ; CHECK-NEXT: [[I_I64:%.*]] = zext i32 [[I]] to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1023 ; CHECK-NEXT: [[ARRAY_I_PTR:%.*]] = getelementptr inbounds i32, ptr [[ARRAY:%.*]], i64 [[I_I64]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1024 ; CHECK-NEXT: [[ARRAY_I:%.*]] = load i32, ptr [[ARRAY_I_PTR]], align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1025 ; CHECK-NEXT: store i32 0, ptr [[ARRAY_I_PTR]], align 4
150
anatofuz
parents:
diff changeset
1026 ; CHECK-NEXT: [[LOOP_ACC_NEXT]] = add i32 [[LOOP_ACC]], [[ARRAY_I]]
anatofuz
parents:
diff changeset
1027 ; CHECK-NEXT: [[I_NEXT]] = add nuw i32 [[I]], 1
anatofuz
parents:
diff changeset
1028 ; CHECK-NEXT: [[CONTINUE:%.*]] = icmp ult i32 [[I_NEXT]], [[N]]
anatofuz
parents:
diff changeset
1029 ; CHECK-NEXT: br i1 [[CONTINUE]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
1030 ; CHECK: exit:
anatofuz
parents:
diff changeset
1031 ; CHECK-NEXT: [[RESULT:%.*]] = phi i32 [ [[LOOP_ACC_NEXT]], [[GUARDED2]] ]
anatofuz
parents:
diff changeset
1032 ; CHECK-NEXT: ret i32 [[RESULT]]
anatofuz
parents:
diff changeset
1033 ;
anatofuz
parents:
diff changeset
1034 entry:
anatofuz
parents:
diff changeset
1035 %widenable_cond = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
1036 %wc2 = call i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
1037 %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
anatofuz
parents:
diff changeset
1038 br i1 %exiplicit_guard_cond, label %loop.preheader, label %deopt, !prof !0
anatofuz
parents:
diff changeset
1039
anatofuz
parents:
diff changeset
1040 deopt:
anatofuz
parents:
diff changeset
1041 %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
1042 ret i32 %deoptret
anatofuz
parents:
diff changeset
1043
anatofuz
parents:
diff changeset
1044 loop.preheader:
anatofuz
parents:
diff changeset
1045 br label %loop
anatofuz
parents:
diff changeset
1046
anatofuz
parents:
diff changeset
1047 loop:
anatofuz
parents:
diff changeset
1048 %loop.acc = phi i32 [ %loop.acc.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
1049 %i = phi i32 [ %i.next, %guarded2 ], [ 0, %loop.preheader ]
anatofuz
parents:
diff changeset
1050 call void @unknown()
anatofuz
parents:
diff changeset
1051 %within.bounds = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
1052 br i1 %within.bounds, label %guarded, label %deopt2, !prof !0
anatofuz
parents:
diff changeset
1053
anatofuz
parents:
diff changeset
1054 deopt2:
anatofuz
parents:
diff changeset
1055 call void @unknown()
anatofuz
parents:
diff changeset
1056 %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
1057 ret i32 %deoptret2
anatofuz
parents:
diff changeset
1058
anatofuz
parents:
diff changeset
1059 guarded:
anatofuz
parents:
diff changeset
1060 call void @unknown()
anatofuz
parents:
diff changeset
1061 %within.bounds2 = icmp ult i32 %i, %length
anatofuz
parents:
diff changeset
1062 %wb_cond = and i1 %within.bounds2, %wc2
anatofuz
parents:
diff changeset
1063 br i1 %wb_cond, label %guarded2, label %deopt3, !prof !0
anatofuz
parents:
diff changeset
1064
anatofuz
parents:
diff changeset
1065 deopt3:
anatofuz
parents:
diff changeset
1066 call void @unknown()
anatofuz
parents:
diff changeset
1067 %deoptret3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
anatofuz
parents:
diff changeset
1068 ret i32 %deoptret3
anatofuz
parents:
diff changeset
1069
anatofuz
parents:
diff changeset
1070 guarded2:
anatofuz
parents:
diff changeset
1071 %i.i64 = zext i32 %i to i64
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1072 %array.i.ptr = getelementptr inbounds i32, ptr %array, i64 %i.i64
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1073 %array.i = load i32, ptr %array.i.ptr, align 4
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1074 store i32 0, ptr %array.i.ptr
150
anatofuz
parents:
diff changeset
1075 %loop.acc.next = add i32 %loop.acc, %array.i
anatofuz
parents:
diff changeset
1076 %i.next = add nuw i32 %i, 1
anatofuz
parents:
diff changeset
1077 %continue = icmp ult i32 %i.next, %n
anatofuz
parents:
diff changeset
1078 br i1 %continue, label %loop, label %exit
anatofuz
parents:
diff changeset
1079
anatofuz
parents:
diff changeset
1080 exit:
anatofuz
parents:
diff changeset
1081 %result = phi i32 [ %loop.acc.next, %guarded2 ]
anatofuz
parents:
diff changeset
1082 ret i32 %result
anatofuz
parents:
diff changeset
1083 }
anatofuz
parents:
diff changeset
1084
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1085 define void @test_memssa() {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1086 ; CHECK-LABEL: @test_memssa(
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1087 ; CHECK-NEXT: bb:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1088 ; CHECK-NEXT: [[TMP:%.*]] = call i1 @llvm.experimental.widenable.condition()
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1089 ; CHECK-NEXT: [[TMP1:%.*]] = call i1 @llvm.experimental.widenable.condition()
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1090 ; CHECK-NEXT: br i1 [[TMP]], label [[BB3:%.*]], label [[BB2:%.*]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1091 ; CHECK: bb2:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1092 ; CHECK-NEXT: unreachable
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1093 ; CHECK: bb3:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1094 ; CHECK-NEXT: br label [[BB4:%.*]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1095 ; CHECK: bb4:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1096 ; CHECK-NEXT: [[TMP5:%.*]] = phi i32 [ [[TMP7:%.*]], [[BB6:%.*]] ], [ 0, [[BB3]] ]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1097 ; CHECK-NEXT: br i1 true, label [[BB10:%.*]], label [[BB6]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1098 ; CHECK: bb6:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1099 ; CHECK-NEXT: [[TMP7]] = add nuw nsw i32 [[TMP5]], 1
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1100 ; CHECK-NEXT: [[TMP8:%.*]] = icmp ult i32 [[TMP7]], undef
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1101 ; CHECK-NEXT: br i1 [[TMP8]], label [[BB4]], label [[BB9:%.*]]
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1102 ; CHECK: bb9:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1103 ; CHECK-NEXT: ret void
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1104 ; CHECK: bb10:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1105 ; CHECK-NEXT: ret void
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
1106 ;
236
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1107 bb:
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1108 %tmp = call i1 @llvm.experimental.widenable.condition()
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1109 %tmp1 = call i1 @llvm.experimental.widenable.condition()
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1110 br i1 %tmp, label %bb3, label %bb2
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1111
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1112 bb2: ; preds = %bb
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1113 unreachable
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1114
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1115 bb3: ; preds = %bb
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1116 br label %bb4
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1117
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1118 bb4: ; preds = %bb6, %bb3
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1119 %tmp5 = phi i32 [ %tmp7, %bb6 ], [ 0, %bb3 ]
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1120 br i1 undef, label %bb10, label %bb6
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1121
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1122 bb6: ; preds = %bb4
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1123 %tmp7 = add nuw nsw i32 %tmp5, 1
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1124 %tmp8 = icmp ult i32 %tmp7, undef
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1125 br i1 %tmp8, label %bb4, label %bb9
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1126
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1127 bb9: ; preds = %bb6
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1128 ret void
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1129
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1130 bb10: ; preds = %bb4
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1131 ret void
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1132 }
c4bab56944e8 LLVM 16
kono
parents: 221
diff changeset
1133
150
anatofuz
parents:
diff changeset
1134
anatofuz
parents:
diff changeset
1135
anatofuz
parents:
diff changeset
1136 declare void @unknown()
anatofuz
parents:
diff changeset
1137
anatofuz
parents:
diff changeset
1138 declare i1 @llvm.experimental.widenable.condition()
anatofuz
parents:
diff changeset
1139 declare i32 @llvm.experimental.deoptimize.i32(...)
anatofuz
parents:
diff changeset
1140
anatofuz
parents:
diff changeset
1141 !0 = !{!"branch_weights", i32 1048576, i32 1}
anatofuz
parents:
diff changeset
1142 !1 = !{i32 1, i32 -2147483648}
anatofuz
parents:
diff changeset
1143 !2 = !{i32 0, i32 50}