xref: /llvm-project/llvm/test/Transforms/LoopDeletion/mustprogress.ll (revision 4931cacb9778bde3d8d2e04575ac162bb090d6be)
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
3
4;; Original C Code:
5;;  void unknown_tripcount_mustprogress_attr_mustprogress_loopmd(int a, int b) {
6;;    for (; a < b;) ;
7;;    for (;;) ;
8;;  }
9
10define 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
18;
19entry:
20  br label %for.cond
21for.cond:
22  %cmp = icmp slt i32 %a, %b
23  br i1 %cmp, label %for.body, label %for.end
24for.body:
25  br label %for.cond, !llvm.loop !2
26for.end:
27  br label %for.cond1
28for.cond1:
29  br label %for.cond1
30}
31
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
38
39define 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
47;
48entry:
49  br label %for.cond
50for.cond:
51  %cmp = icmp slt i32 %a, %b
52  br i1 %cmp, label %for.body, label %for.end
53for.body:
54  br label %for.cond
55for.end:
56  br label %for.cond1
57for.cond1:
58  br label %for.cond1
59}
60
61;; Original C Code:
62;;  void known_tripcount_no_mustprogress_attr_no_mustprogress_loopmd() {
63;;    for (int i = 0; i < 5; i++) ;
64;;  }
65
66define 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
72;
73entry:
74  br label %for.cond
75for.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
79for.body:
80  br label %for.inc
81for.inc:
82  %inc = add nsw i32 %i.0, 1
83  br label %for.cond
84for.end:
85  ret void
86}
87
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
93
94define 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
100;
101entry:
102  br label %for.cond
103for.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
107for.body:
108  br label %for.inc
109for.inc:
110  %inc = add nsw i32 %i.0, 1
111  br label %for.cond, !llvm.loop !4
112for.end:
113  ret void
114}
115
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
121
122define 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
130;
131entry:
132  br label %for.cond
133for.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
137for.body:
138  br label %for.inc
139for.inc:
140  %inc = add nsw i32 %i.0, 1
141  br label %for.cond
142for.end:
143  ret void
144}
145
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
151
152define 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
160;
161entry:
162  br label %for.cond
163for.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
167for.body:
168  br label %for.inc
169for.inc:
170  %inc = add nsw i32 %i.0, 1
171  br label %for.cond, !llvm.loop !5
172for.end:
173  ret void
174}
175
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
181
182define 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
189;
190entry:
191  br label %for.cond
192for.cond:
193  %cmp = icmp slt i32 %a, %b
194  br i1 %cmp, label %for.body, label %for.end
195for.body:
196  br label %for.cond, !llvm.loop !6
197for.end:
198  ret void
199}
200
201;; Original C Code:
202;;  void unknown_tripcount_no_mustprogress_attr_no_mustprogress_loopmd(int a, int b) {
203;;    for (; a < b;) ;
204;;  }
205
206define 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
218;
219entry:
220  br label %for.cond
221for.cond:
222  %cmp = icmp slt i32 %a, %b
223  br i1 %cmp, label %for.body, label %for.end
224for.body:
225  br label %for.cond
226for.end:
227  ret void
228}
229
230; CHECK: attributes [[ATTR0]] = { mustprogress }
231
232attributes #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}
238