annotate llvm/test/Transforms/IndVarSimplify/rewrite-loop-exit-value.ll @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
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 -passes='loop(indvars),instcombine' -S < %s | FileCheck %s
150
anatofuz
parents:
diff changeset
3
anatofuz
parents:
diff changeset
4 ;; Test that loop's exit value is rewritten to its initial
anatofuz
parents:
diff changeset
5 ;; value from loop preheader
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
6 define i32 @test1(ptr %var) {
150
anatofuz
parents:
diff changeset
7 ; CHECK-LABEL: @test1(
anatofuz
parents:
diff changeset
8 ; CHECK-NEXT: entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
9 ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[VAR:%.*]], null
150
anatofuz
parents:
diff changeset
10 ; CHECK-NEXT: br label [[HEADER:%.*]]
anatofuz
parents:
diff changeset
11 ; CHECK: header:
anatofuz
parents:
diff changeset
12 ; CHECK-NEXT: br i1 [[COND]], label [[LOOP:%.*]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
13 ; CHECK: loop:
anatofuz
parents:
diff changeset
14 ; CHECK-NEXT: br label [[HEADER]]
anatofuz
parents:
diff changeset
15 ; CHECK: exit:
anatofuz
parents:
diff changeset
16 ; CHECK-NEXT: ret i32 0
anatofuz
parents:
diff changeset
17 ;
anatofuz
parents:
diff changeset
18 entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
19 %cond = icmp eq ptr %var, null
150
anatofuz
parents:
diff changeset
20 br label %header
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 header:
anatofuz
parents:
diff changeset
23 %phi_indvar = phi i32 [0, %entry], [%indvar, %loop]
anatofuz
parents:
diff changeset
24 br i1 %cond, label %loop, label %exit
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 loop:
anatofuz
parents:
diff changeset
27 %indvar = add i32 %phi_indvar, 1
anatofuz
parents:
diff changeset
28 br label %header
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 exit:
anatofuz
parents:
diff changeset
31 ret i32 %phi_indvar
anatofuz
parents:
diff changeset
32 }
anatofuz
parents:
diff changeset
33
anatofuz
parents:
diff changeset
34 ;; Test that we can not rewrite loop exit value if it's not
anatofuz
parents:
diff changeset
35 ;; a phi node (%indvar is an add instruction in this test).
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
36 define i32 @test2(ptr %var) {
150
anatofuz
parents:
diff changeset
37 ; CHECK-LABEL: @test2(
anatofuz
parents:
diff changeset
38 ; CHECK-NEXT: entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
39 ; CHECK-NEXT: [[COND:%.*]] = icmp eq ptr [[VAR:%.*]], null
150
anatofuz
parents:
diff changeset
40 ; CHECK-NEXT: br label [[HEADER:%.*]]
anatofuz
parents:
diff changeset
41 ; CHECK: header:
anatofuz
parents:
diff changeset
42 ; CHECK-NEXT: [[PHI_INDVAR:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDVAR:%.*]], [[HEADER]] ]
anatofuz
parents:
diff changeset
43 ; CHECK-NEXT: [[INDVAR]] = add i32 [[PHI_INDVAR]], 1
anatofuz
parents:
diff changeset
44 ; CHECK-NEXT: br i1 [[COND]], label [[HEADER]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
45 ; CHECK: exit:
anatofuz
parents:
diff changeset
46 ; CHECK-NEXT: ret i32 [[INDVAR]]
anatofuz
parents:
diff changeset
47 ;
anatofuz
parents:
diff changeset
48 entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
49 %cond = icmp eq ptr %var, null
150
anatofuz
parents:
diff changeset
50 br label %header
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 header:
anatofuz
parents:
diff changeset
53 %phi_indvar = phi i32 [0, %entry], [%indvar, %header]
anatofuz
parents:
diff changeset
54 %indvar = add i32 %phi_indvar, 1
anatofuz
parents:
diff changeset
55 br i1 %cond, label %header, label %exit
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 exit:
anatofuz
parents:
diff changeset
58 ret i32 %indvar
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 ;; Test that we can not rewrite loop exit value if the condition
anatofuz
parents:
diff changeset
62 ;; is not in loop header.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
63 define i32 @test3(ptr %var) {
150
anatofuz
parents:
diff changeset
64 ; CHECK-LABEL: @test3(
anatofuz
parents:
diff changeset
65 ; CHECK-NEXT: entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
66 ; CHECK-NEXT: [[COND1:%.*]] = icmp eq ptr [[VAR:%.*]], null
150
anatofuz
parents:
diff changeset
67 ; CHECK-NEXT: br label [[HEADER:%.*]]
anatofuz
parents:
diff changeset
68 ; CHECK: header:
anatofuz
parents:
diff changeset
69 ; CHECK-NEXT: [[PHI_INDVAR:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDVAR:%.*]], [[HEADER_BACKEDGE:%.*]] ]
anatofuz
parents:
diff changeset
70 ; CHECK-NEXT: [[INDVAR]] = add i32 [[PHI_INDVAR]], 1
anatofuz
parents:
diff changeset
71 ; CHECK-NEXT: [[COND2:%.*]] = icmp eq i32 [[INDVAR]], 10
anatofuz
parents:
diff changeset
72 ; CHECK-NEXT: br i1 [[COND2]], label [[HEADER_BACKEDGE]], label [[BODY:%.*]]
anatofuz
parents:
diff changeset
73 ; CHECK: header.backedge:
anatofuz
parents:
diff changeset
74 ; CHECK-NEXT: br label [[HEADER]]
anatofuz
parents:
diff changeset
75 ; CHECK: body:
anatofuz
parents:
diff changeset
76 ; CHECK-NEXT: br i1 [[COND1]], label [[HEADER_BACKEDGE]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
77 ; CHECK: exit:
anatofuz
parents:
diff changeset
78 ; CHECK-NEXT: ret i32 [[PHI_INDVAR]]
anatofuz
parents:
diff changeset
79 ;
anatofuz
parents:
diff changeset
80 entry:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
81 %cond1 = icmp eq ptr %var, null
150
anatofuz
parents:
diff changeset
82 br label %header
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 header:
anatofuz
parents:
diff changeset
85 %phi_indvar = phi i32 [0, %entry], [%indvar, %header], [%indvar, %body]
anatofuz
parents:
diff changeset
86 %indvar = add i32 %phi_indvar, 1
anatofuz
parents:
diff changeset
87 %cond2 = icmp eq i32 %indvar, 10
anatofuz
parents:
diff changeset
88 br i1 %cond2, label %header, label %body
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 body:
anatofuz
parents:
diff changeset
91 br i1 %cond1, label %header, label %exit
anatofuz
parents:
diff changeset
92
anatofuz
parents:
diff changeset
93 exit:
anatofuz
parents:
diff changeset
94 ret i32 %phi_indvar
anatofuz
parents:
diff changeset
95 }
anatofuz
parents:
diff changeset
96
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 ; Multiple exits dominating latch
anatofuz
parents:
diff changeset
99 define i32 @test4(i1 %cond1, i1 %cond2) {
anatofuz
parents:
diff changeset
100 ; CHECK-LABEL: @test4(
anatofuz
parents:
diff changeset
101 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
102 ; CHECK-NEXT: br label [[HEADER:%.*]]
anatofuz
parents:
diff changeset
103 ; CHECK: header:
anatofuz
parents:
diff changeset
104 ; CHECK-NEXT: br i1 [[COND1:%.*]], label [[LOOP:%.*]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
105 ; CHECK: loop:
anatofuz
parents:
diff changeset
106 ; CHECK-NEXT: br i1 [[COND2:%.*]], label [[HEADER]], label [[EXIT]]
anatofuz
parents:
diff changeset
107 ; CHECK: exit:
anatofuz
parents:
diff changeset
108 ; CHECK-NEXT: ret i32 0
anatofuz
parents:
diff changeset
109 ;
anatofuz
parents:
diff changeset
110 entry:
anatofuz
parents:
diff changeset
111 br label %header
anatofuz
parents:
diff changeset
112
anatofuz
parents:
diff changeset
113 header:
anatofuz
parents:
diff changeset
114 %phi_indvar = phi i32 [0, %entry], [%indvar, %loop]
anatofuz
parents:
diff changeset
115 br i1 %cond1, label %loop, label %exit
anatofuz
parents:
diff changeset
116
anatofuz
parents:
diff changeset
117 loop:
anatofuz
parents:
diff changeset
118 %indvar = add i32 %phi_indvar, 1
anatofuz
parents:
diff changeset
119 br i1 %cond2, label %header, label %exit
anatofuz
parents:
diff changeset
120
anatofuz
parents:
diff changeset
121 exit:
anatofuz
parents:
diff changeset
122 ret i32 %phi_indvar
anatofuz
parents:
diff changeset
123 }
anatofuz
parents:
diff changeset
124
anatofuz
parents:
diff changeset
125 ; A conditionally executed exit.
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
126 define i32 @test5(ptr %addr, i1 %cond2) {
150
anatofuz
parents:
diff changeset
127 ; CHECK-LABEL: @test5(
anatofuz
parents:
diff changeset
128 ; CHECK-NEXT: entry:
anatofuz
parents:
diff changeset
129 ; CHECK-NEXT: br label [[HEADER:%.*]]
anatofuz
parents:
diff changeset
130 ; CHECK: header:
anatofuz
parents:
diff changeset
131 ; CHECK-NEXT: [[PHI_INDVAR:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INDVAR:%.*]], [[LOOP:%.*]] ]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
132 ; CHECK-NEXT: [[COND1:%.*]] = load volatile i1, ptr [[ADDR:%.*]], align 1
150
anatofuz
parents:
diff changeset
133 ; CHECK-NEXT: br i1 [[COND1]], label [[LOOP]], label [[MAYBE:%.*]]
anatofuz
parents:
diff changeset
134 ; CHECK: maybe:
anatofuz
parents:
diff changeset
135 ; CHECK-NEXT: br i1 [[COND2:%.*]], label [[LOOP]], label [[EXIT:%.*]]
anatofuz
parents:
diff changeset
136 ; CHECK: loop:
anatofuz
parents:
diff changeset
137 ; CHECK-NEXT: [[INDVAR]] = add i32 [[PHI_INDVAR]], 1
anatofuz
parents:
diff changeset
138 ; CHECK-NEXT: br label [[HEADER]]
anatofuz
parents:
diff changeset
139 ; CHECK: exit:
anatofuz
parents:
diff changeset
140 ; CHECK-NEXT: ret i32 [[PHI_INDVAR]]
anatofuz
parents:
diff changeset
141 ;
anatofuz
parents:
diff changeset
142 entry:
anatofuz
parents:
diff changeset
143 br label %header
anatofuz
parents:
diff changeset
144
anatofuz
parents:
diff changeset
145 header:
anatofuz
parents:
diff changeset
146 %phi_indvar = phi i32 [0, %entry], [%indvar, %loop]
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
147 %cond1 = load volatile i1, ptr %addr
150
anatofuz
parents:
diff changeset
148 br i1 %cond1, label %loop, label %maybe
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 maybe:
anatofuz
parents:
diff changeset
151 br i1 %cond2, label %loop, label %exit
anatofuz
parents:
diff changeset
152
anatofuz
parents:
diff changeset
153 loop:
anatofuz
parents:
diff changeset
154 %indvar = add i32 %phi_indvar, 1
anatofuz
parents:
diff changeset
155 br label %header
anatofuz
parents:
diff changeset
156
anatofuz
parents:
diff changeset
157 exit:
anatofuz
parents:
diff changeset
158 ret i32 %phi_indvar
anatofuz
parents:
diff changeset
159 }
anatofuz
parents:
diff changeset
160
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
161 define i16 @pr57336(i16 %end, i16 %m) mustprogress {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
162 ; CHECK-LABEL: @pr57336(
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
163 ; CHECK-NEXT: entry:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
164 ; CHECK-NEXT: br label [[FOR_BODY:%.*]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
165 ; CHECK: for.body:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
166 ; CHECK-NEXT: [[INC8:%.*]] = phi i16 [ [[INC:%.*]], [[FOR_BODY]] ], [ 0, [[ENTRY:%.*]] ]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
167 ; CHECK-NEXT: [[INC]] = add nuw nsw i16 [[INC8]], 1
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
168 ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i16 [[INC8]], [[M:%.*]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
169 ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp sgt i16 [[MUL]], [[END:%.*]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
170 ; CHECK-NEXT: br i1 [[CMP_NOT]], label [[CRIT_EDGE:%.*]], label [[FOR_BODY]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
171 ; CHECK: crit_edge:
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
172 ; CHECK-NEXT: [[TMP0:%.*]] = add i16 [[END]], 1
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
173 ; CHECK-NEXT: [[SMAX:%.*]] = call i16 @llvm.smax.i16(i16 [[TMP0]], i16 0)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
174 ; CHECK-NEXT: [[TMP1:%.*]] = icmp ult i16 [[END]], 32767
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
175 ; CHECK-NEXT: [[UMIN:%.*]] = zext i1 [[TMP1]] to i16
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
176 ; CHECK-NEXT: [[TMP2:%.*]] = sub nsw i16 [[SMAX]], [[UMIN]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
177 ; CHECK-NEXT: [[UMAX:%.*]] = call i16 @llvm.umax.i16(i16 [[M]], i16 1)
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
178 ; CHECK-NEXT: [[TMP3:%.*]] = udiv i16 [[TMP2]], [[UMAX]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
179 ; CHECK-NEXT: [[TMP4:%.*]] = add i16 [[TMP3]], [[UMIN]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
180 ; CHECK-NEXT: ret i16 [[TMP4]]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
181 ;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
182 entry:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
183 br label %for.body
150
anatofuz
parents:
diff changeset
184
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
185 for.body:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
186 %inc8 = phi i16 [ %inc, %for.body ], [ 0, %entry ]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
187 %inc137 = phi i32 [ %inc1, %for.body ], [ 0, %entry ]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
188 %inc1 = add nsw i32 %inc137, 1
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
189 %inc = add nsw i16 %inc8, 1
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
190 %mul = mul nsw i16 %m, %inc8
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
191 %cmp.not = icmp slt i16 %end, %mul
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
192 br i1 %cmp.not, label %crit_edge, label %for.body
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
193
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
194 crit_edge:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
195 %inc137.lcssa = phi i32 [ %inc137, %for.body ]
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
196 %conv = trunc i32 %inc137.lcssa to i16
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
197 ret i16 %conv
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
198 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
199