[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / LoopDeletion / mustprogress.ll
blobd648f82f73f5921f38b1681546f16685a04c19d1
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
2 ; RUN: opt < %s -passes=loop-deletion -verify-dom-info -S | FileCheck %s
4 ;; Original C Code:
5 ;;  void unknown_tripcount_mustprogress_attr_mustprogress_loopmd(int a, int b) {
6 ;;    for (; a < b;) ;
7 ;;    for (;;) ;
8 ;;  }
10 define void @unknown_tripcount_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) #0 {
11 ; CHECK: Function Attrs: mustprogress
12 ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_mustprogress_loopmd
13 ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) [[ATTR0:#.*]] {
14 ; CHECK-NEXT:  entry:
15 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
16 ; CHECK:       for.end:
17 ; CHECK-NEXT:    unreachable
19 entry:
20   br label %for.cond
21 for.cond:
22   %cmp = icmp slt i32 %a, %b
23   br i1 %cmp, label %for.body, label %for.end
24 for.body:
25   br label %for.cond, !llvm.loop !2
26 for.end:
27   br label %for.cond1
28 for.cond1:
29   br label %for.cond1
32 ;; Original C Code:
33 ;;  void unknown_tripcount_mustprogress_attr_no_mustprogress_loopmd(int a, int b) {
34 ;;    for (; a < b;) ;
35 ;;    for (;;) ;
36 ;;  }
37 ;;  => Removed mustprogress loop attribute
39 define void @unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd(i32 %a, i32 %b) #0 {
40 ; CHECK: Function Attrs: mustprogress
41 ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_mustprogress_attr_no_mustprogess_loopmd
42 ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) [[ATTR0]] {
43 ; CHECK-NEXT:  entry:
44 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
45 ; CHECK:       for.end:
46 ; CHECK-NEXT:    unreachable
48 entry:
49   br label %for.cond
50 for.cond:
51   %cmp = icmp slt i32 %a, %b
52   br i1 %cmp, label %for.body, label %for.end
53 for.body:
54   br label %for.cond
55 for.end:
56   br label %for.cond1
57 for.cond1:
58   br label %for.cond1
61 ;; Original C Code:
62 ;;  void known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() {
63 ;;    for (int i = 0; i < 5; i++) ;
64 ;;  }
66 define void @known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() {
67 ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() {
68 ; CHECK-NEXT:  entry:
69 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
70 ; CHECK:       for.end:
71 ; CHECK-NEXT:    ret void
73 entry:
74   br label %for.cond
75 for.cond:
76   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
77   %cmp = icmp slt i32 %i.0, 5
78   br i1 %cmp, label %for.body, label %for.end
79 for.body:
80   br label %for.inc
81 for.inc:
82   %inc = add nsw i32 %i.0, 1
83   br label %for.cond
84 for.end:
85   ret void
88 ;; Original C Code:
89 ;;  void known_tripcount_no_mustprogress_attr_mustprogress_loopmd() {
90 ;;    for (int i = 0; i < 5; i++) ;
91 ;;  }
92 ;;  => Added mustprogress loop attribute
94 define void @known_tripcount_no_mustprogress_attr_mustprogress_loopmd() {
95 ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_no_mustprogress_attr_mustprogress_loopmd() {
96 ; CHECK-NEXT:  entry:
97 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
98 ; CHECK:       for.end:
99 ; CHECK-NEXT:    ret void
101 entry:
102   br label %for.cond
103 for.cond:
104   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
105   %cmp = icmp slt i32 %i.0, 5
106   br i1 %cmp, label %for.body, label %for.end
107 for.body:
108   br label %for.inc
109 for.inc:
110   %inc = add nsw i32 %i.0, 1
111   br label %for.cond, !llvm.loop !4
112 for.end:
113   ret void
116 ;; Original C Code:
117 ;;  void known_tripcount_mustprogress_attr_no_mustprogress_loopmd() {
118 ;;    for (int i = 0; i < 5; i++) ;
119 ;;  }
120 ;;  => Added mustprogress function attribute
122 define void @known_tripcount_mustprogress_attr_no_mustprogress_loopmd() #0 {
123 ; CHECK: Function Attrs: mustprogress
124 ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_no_mustprogress_loopmd
125 ; CHECK-SAME: () [[ATTR0]] {
126 ; CHECK-NEXT:  entry:
127 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
128 ; CHECK:       for.end:
129 ; CHECK-NEXT:    ret void
131 entry:
132   br label %for.cond
133 for.cond:
134   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
135   %cmp = icmp slt i32 %i.0, 5
136   br i1 %cmp, label %for.body, label %for.end
137 for.body:
138   br label %for.inc
139 for.inc:
140   %inc = add nsw i32 %i.0, 1
141   br label %for.cond
142 for.end:
143   ret void
146 ;; Original C Code:
147 ;;  void known_tripcount_mustprogress_attr_mustprogress_loopmd() {
148 ;;    for (int i = 0; i < 5; i++) ;
149 ;;  }
150 ;;  => Added mustprogress function and mustprogress loop attribute
152 define void @known_tripcount_mustprogress_attr_mustprogress_loopmd() #0 {
153 ; CHECK: Function Attrs: mustprogress
154 ; CHECK-LABEL: define {{[^@]+}}@known_tripcount_mustprogress_attr_mustprogress_loopmd
155 ; CHECK-SAME: () [[ATTR0]] {
156 ; CHECK-NEXT:  entry:
157 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
158 ; CHECK:       for.end:
159 ; CHECK-NEXT:    ret void
161 entry:
162   br label %for.cond
163 for.cond:
164   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
165   %cmp = icmp slt i32 %i.0, 5
166   br i1 %cmp, label %for.body, label %for.end
167 for.body:
168   br label %for.inc
169 for.inc:
170   %inc = add nsw i32 %i.0, 1
171   br label %for.cond, !llvm.loop !5
172 for.end:
173   ret void
176 ;; Original C Code:
177 ;;  void unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(int a, int b) {
178 ;;    for (; a < b;) ;
179 ;;  }
180 ;;  => Added mustprogress loop attribute
182 define void @unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd(i32 %a, i32 %b) {
183 ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_mustprogress_loopmd
184 ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
185 ; CHECK-NEXT:  entry:
186 ; CHECK-NEXT:    br label [[FOR_END:%.*]]
187 ; CHECK:       for.end:
188 ; CHECK-NEXT:    ret void
190 entry:
191   br label %for.cond
192 for.cond:
193   %cmp = icmp slt i32 %a, %b
194   br i1 %cmp, label %for.body, label %for.end
195 for.body:
196   br label %for.cond, !llvm.loop !6
197 for.end:
198   ret void
201 ;; Original C Code:
202 ;;  void unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(int a, int b) {
203 ;;    for (; a < b;) ;
204 ;;  }
206 define void @unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(i32 %a, i32 %b) {
207 ; CHECK-LABEL: define {{[^@]+}}@unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd
208 ; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]]) {
209 ; CHECK-NEXT:  entry:
210 ; CHECK-NEXT:    br label [[FOR_COND:%.*]]
211 ; CHECK:       for.cond:
212 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[A]], [[B]]
213 ; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
214 ; CHECK:       for.body:
215 ; CHECK-NEXT:    br label [[FOR_COND]]
216 ; CHECK:       for.end:
217 ; CHECK-NEXT:    ret void
219 entry:
220   br label %for.cond
221 for.cond:
222   %cmp = icmp slt i32 %a, %b
223   br i1 %cmp, label %for.body, label %for.end
224 for.body:
225   br label %for.cond
226 for.end:
227   ret void
230 ; CHECK: attributes [[ATTR0]] = { mustprogress }
232 attributes #0 = { mustprogress }
233 !2 = distinct !{!2, !3}
234 !3 = !{!"llvm.loop.mustprogress"}
235 !4 = distinct !{!4, !3}
236 !5 = distinct !{!5, !3}
237 !6 = distinct !{!6, !3}