1; RUN: opt %loadPolly -polly-scops -analyze < %s
2
3; Verify that the compilation of this test case does not take infinite time.
4; At some point Polly tried to model this test case and got stuck in
5; computing a lexicographic minima. Today it should gracefully bail out.
6target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
7target triple = "aarch64--linux-android"
8
9%0 = type { i8*, i64, i64, i64, i64, i64, i64 }
10
11define void @_Z1fR1SS0_Ph(%0* nocapture readonly dereferenceable(56) %arg, %0* nocapture readonly dereferenceable(56) %arg1, i8* nocapture readonly %arg2) {
12bb:
13  %tmp = getelementptr inbounds %0, %0* %arg1, i64 0, i32 1
14  %tmp3 = getelementptr inbounds %0, %0* %arg, i64 0, i32 0
15  %tmp4 = load i8*, i8** %tmp3, align 8
16  %tmp5 = getelementptr inbounds %0, %0* %arg, i64 0, i32 4
17  %tmp6 = load i64, i64* %tmp5, align 8
18  %tmp7 = getelementptr inbounds %0, %0* %arg, i64 0, i32 1
19  %tmp8 = load i64, i64* %tmp7, align 8
20  %tmp9 = mul i64 %tmp8, %tmp6
21  %tmp10 = getelementptr inbounds i8, i8* %tmp4, i64 %tmp9
22  %tmp11 = getelementptr inbounds %0, %0* %arg, i64 0, i32 3
23  %tmp12 = load i64, i64* %tmp11, align 8
24  %tmp13 = getelementptr inbounds i8, i8* %tmp10, i64 %tmp12
25  %tmp14 = getelementptr inbounds %0, %0* %arg, i64 0, i32 6
26  %tmp15 = load i64, i64* %tmp14, align 8
27  %tmp16 = add i64 %tmp15, 1
28  %tmp17 = icmp eq i64 %tmp16, %tmp6
29  br i1 %tmp17, label %bb51, label %bb18
30
31bb18:                                             ; preds = %bb
32  %tmp19 = getelementptr inbounds %0, %0* %arg, i64 0, i32 2
33  %tmp20 = load i64, i64* %tmp19, align 8
34  %tmp21 = mul i64 %tmp20, %tmp8
35  %tmp22 = getelementptr inbounds i8, i8* %tmp13, i64 %tmp21
36  %tmp23 = getelementptr inbounds i8, i8* %tmp22, i64 %tmp9
37  %tmp24 = getelementptr inbounds i8, i8* %tmp23, i64 %tmp12
38  %tmp25 = bitcast %0* %arg1 to i16**
39  %tmp26 = load i16*, i16** %tmp25, align 8
40  %tmp27 = load i64, i64* %tmp, align 8
41  %tmp28 = getelementptr inbounds %0, %0* %arg1, i64 0, i32 4
42  %tmp29 = load i64, i64* %tmp28, align 8
43  %tmp30 = mul i64 %tmp27, %tmp29
44  %tmp31 = getelementptr inbounds i16, i16* %tmp26, i64 %tmp30
45  %tmp32 = getelementptr inbounds %0, %0* %arg1, i64 0, i32 3
46  %tmp33 = load i64, i64* %tmp32, align 8
47  %tmp34 = getelementptr inbounds i16, i16* %tmp31, i64 %tmp33
48  %tmp35 = getelementptr inbounds %0, %0* %arg, i64 0, i32 5
49  %tmp36 = load i64, i64* %tmp35, align 8
50  br label %bb37
51
52bb37:                                             ; preds = %bb57, %bb18
53  %tmp38 = phi i64 [ %tmp6, %bb18 ], [ %tmp58, %bb57 ]
54  %tmp39 = phi i64 [ %tmp15, %bb18 ], [ %tmp59, %bb57 ]
55  %tmp40 = phi i64 [ %tmp27, %bb18 ], [ %tmp60, %bb57 ]
56  %tmp41 = phi i64 [ %tmp8, %bb18 ], [ %tmp61, %bb57 ]
57  %tmp42 = phi i64 [ %tmp12, %bb18 ], [ %tmp62, %bb57 ]
58  %tmp43 = phi i64 [ %tmp36, %bb18 ], [ %tmp63, %bb57 ]
59  %tmp44 = phi i16* [ %tmp34, %bb18 ], [ %tmp69, %bb57 ]
60  %tmp45 = phi i8* [ %tmp13, %bb18 ], [ %tmp64, %bb57 ]
61  %tmp46 = phi i8* [ %tmp24, %bb18 ], [ %tmp68, %bb57 ]
62  %tmp47 = phi i64 [ 0, %bb18 ], [ %tmp70, %bb57 ]
63  %tmp48 = add i64 %tmp43, 1
64  %tmp49 = sub i64 %tmp48, %tmp42
65  %tmp50 = icmp eq i64 %tmp49, 0
66  br i1 %tmp50, label %bb57, label %bb74
67
68bb51:                                             ; preds = %bb57, %bb
69  ret void
70
71bb52:                                             ; preds = %bb176
72  %tmp53 = load i64, i64* %tmp7, align 8
73  %tmp54 = load i64, i64* %tmp, align 8
74  %tmp55 = load i64, i64* %tmp14, align 8
75  %tmp56 = load i64, i64* %tmp5, align 8
76  br label %bb57
77
78bb57:                                             ; preds = %bb52, %bb37
79  %tmp58 = phi i64 [ %tmp56, %bb52 ], [ %tmp38, %bb37 ]
80  %tmp59 = phi i64 [ %tmp55, %bb52 ], [ %tmp39, %bb37 ]
81  %tmp60 = phi i64 [ %tmp54, %bb52 ], [ %tmp40, %bb37 ]
82  %tmp61 = phi i64 [ %tmp53, %bb52 ], [ %tmp41, %bb37 ]
83  %tmp62 = phi i64 [ %tmp179, %bb52 ], [ %tmp42, %bb37 ]
84  %tmp63 = phi i64 [ %tmp178, %bb52 ], [ %tmp43, %bb37 ]
85  %tmp64 = getelementptr inbounds i8, i8* %tmp45, i64 %tmp61
86  %tmp65 = and i64 %tmp47, 1
87  %tmp66 = icmp eq i64 %tmp65, 0
88  %tmp67 = getelementptr inbounds i8, i8* %tmp46, i64 %tmp61
89  %tmp68 = select i1 %tmp66, i8* %tmp46, i8* %tmp67
90  %tmp69 = getelementptr inbounds i16, i16* %tmp44, i64 %tmp60
91  %tmp70 = add i64 %tmp47, 1
92  %tmp71 = add i64 %tmp59, 1
93  %tmp72 = sub i64 %tmp71, %tmp58
94  %tmp73 = icmp ult i64 %tmp70, %tmp72
95  br i1 %tmp73, label %bb37, label %bb51
96
97bb74:                                             ; preds = %bb176, %bb37
98  %tmp75 = phi i64 [ %tmp181, %bb176 ], [ %tmp49, %bb37 ]
99  %tmp76 = phi i64 [ %tmp177, %bb176 ], [ 0, %bb37 ]
100  %tmp77 = getelementptr inbounds i8, i8* %tmp45, i64 %tmp76
101  %tmp78 = load i8, i8* %tmp77, align 1
102  %tmp79 = zext i8 %tmp78 to i32
103  %tmp80 = or i64 %tmp76, 1
104  %tmp81 = getelementptr inbounds i8, i8* %tmp45, i64 %tmp80
105  %tmp82 = load i8, i8* %tmp81, align 1
106  %tmp83 = zext i8 %tmp82 to i32
107  %tmp84 = getelementptr inbounds i8, i8* %tmp46, i64 %tmp76
108  %tmp85 = load i8, i8* %tmp84, align 1
109  %tmp86 = zext i8 %tmp85 to i32
110  %tmp87 = getelementptr inbounds i8, i8* %tmp46, i64 %tmp80
111  %tmp88 = load i8, i8* %tmp87, align 1
112  %tmp89 = zext i8 %tmp88 to i32
113  %tmp90 = mul nuw nsw i32 %tmp86, 517
114  %tmp91 = add nsw i32 %tmp90, -66176
115  %tmp92 = sub nsw i32 128, %tmp86
116  %tmp93 = mul nsw i32 %tmp92, 100
117  %tmp94 = sub nsw i32 128, %tmp89
118  %tmp95 = mul nsw i32 %tmp94, 208
119  %tmp96 = mul nuw nsw i32 %tmp89, 409
120  %tmp97 = add nsw i32 %tmp96, -52352
121  %tmp98 = mul nuw nsw i32 %tmp79, 298
122  %tmp99 = add nsw i32 %tmp98, -4768
123  %tmp100 = add nsw i32 %tmp91, %tmp99
124  %tmp101 = sdiv i32 %tmp100, 256
125  %tmp102 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %tmp99, i32 %tmp95)
126  %tmp103 = extractvalue { i32, i1 } %tmp102, 1
127  br i1 %tmp103, label %bb104, label %bb105
128
129bb104:                                            ; preds = %bb120, %bb109, %bb105, %bb74
130  tail call void @llvm.trap()
131  unreachable
132
133bb105:                                            ; preds = %bb74
134  %tmp106 = extractvalue { i32, i1 } %tmp102, 0
135  %tmp107 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %tmp106, i32 %tmp93)
136  %tmp108 = extractvalue { i32, i1 } %tmp107, 1
137  br i1 %tmp108, label %bb104, label %bb109
138
139bb109:                                            ; preds = %bb105
140  %tmp110 = extractvalue { i32, i1 } %tmp107, 0
141  %tmp111 = sdiv i32 %tmp110, 256
142  %tmp112 = add nsw i32 %tmp97, %tmp99
143  %tmp113 = sdiv i32 %tmp112, 256
144  %tmp114 = mul nuw nsw i32 %tmp83, 298
145  %tmp115 = add nsw i32 %tmp114, -4768
146  %tmp116 = add nsw i32 %tmp91, %tmp115
147  %tmp117 = sdiv i32 %tmp116, 256
148  %tmp118 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %tmp115, i32 %tmp95)
149  %tmp119 = extractvalue { i32, i1 } %tmp118, 1
150  br i1 %tmp119, label %bb104, label %bb120
151
152bb120:                                            ; preds = %bb109
153  %tmp121 = extractvalue { i32, i1 } %tmp118, 0
154  %tmp122 = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %tmp121, i32 %tmp93)
155  %tmp123 = extractvalue { i32, i1 } %tmp122, 1
156  br i1 %tmp123, label %bb104, label %bb124
157
158bb124:                                            ; preds = %bb120
159  %tmp125 = sext i32 %tmp101 to i64
160  %tmp126 = getelementptr inbounds i8, i8* %arg2, i64 %tmp125
161  %tmp127 = load i8, i8* %tmp126, align 1
162  %tmp128 = zext i8 %tmp127 to i32
163  %tmp129 = lshr i32 %tmp128, 3
164  %tmp130 = shl nuw nsw i32 %tmp129, 11
165  %tmp131 = sext i32 %tmp111 to i64
166  %tmp132 = getelementptr inbounds i8, i8* %arg2, i64 %tmp131
167  %tmp133 = load i8, i8* %tmp132, align 1
168  %tmp134 = zext i8 %tmp133 to i32
169  %tmp135 = lshr i32 %tmp134, 2
170  %tmp136 = shl nuw nsw i32 %tmp135, 5
171  %tmp137 = or i32 %tmp136, %tmp130
172  %tmp138 = sext i32 %tmp113 to i64
173  %tmp139 = getelementptr inbounds i8, i8* %arg2, i64 %tmp138
174  %tmp140 = load i8, i8* %tmp139, align 1
175  %tmp141 = zext i8 %tmp140 to i32
176  %tmp142 = lshr i32 %tmp141, 3
177  %tmp143 = or i32 %tmp137, %tmp142
178  %tmp144 = icmp ult i64 %tmp80, %tmp75
179  br i1 %tmp144, label %bb145, label %bb173
180
181bb145:                                            ; preds = %bb124
182  %tmp146 = add nsw i32 %tmp97, %tmp115
183  %tmp147 = sdiv i32 %tmp146, 256
184  %tmp148 = sext i32 %tmp147 to i64
185  %tmp149 = getelementptr inbounds i8, i8* %arg2, i64 %tmp148
186  %tmp150 = load i8, i8* %tmp149, align 1
187  %tmp151 = extractvalue { i32, i1 } %tmp122, 0
188  %tmp152 = sdiv i32 %tmp151, 256
189  %tmp153 = sext i32 %tmp152 to i64
190  %tmp154 = getelementptr inbounds i8, i8* %arg2, i64 %tmp153
191  %tmp155 = load i8, i8* %tmp154, align 1
192  %tmp156 = sext i32 %tmp117 to i64
193  %tmp157 = getelementptr inbounds i8, i8* %arg2, i64 %tmp156
194  %tmp158 = load i8, i8* %tmp157, align 1
195  %tmp159 = zext i8 %tmp158 to i32
196  %tmp160 = lshr i32 %tmp159, 3
197  %tmp161 = shl nuw nsw i32 %tmp160, 11
198  %tmp162 = zext i8 %tmp155 to i32
199  %tmp163 = lshr i32 %tmp162, 2
200  %tmp164 = shl nuw nsw i32 %tmp163, 5
201  %tmp165 = zext i8 %tmp150 to i32
202  %tmp166 = lshr i32 %tmp165, 3
203  %tmp167 = or i32 %tmp164, %tmp166
204  %tmp168 = or i32 %tmp167, %tmp161
205  %tmp169 = shl nuw i32 %tmp168, 16
206  %tmp170 = or i32 %tmp169, %tmp143
207  %tmp171 = getelementptr inbounds i16, i16* %tmp44, i64 %tmp76
208  %tmp172 = bitcast i16* %tmp171 to i32*
209  store i32 %tmp170, i32* %tmp172, align 4
210  br label %bb176
211
212bb173:                                            ; preds = %bb124
213  %tmp174 = trunc i32 %tmp143 to i16
214  %tmp175 = getelementptr inbounds i16, i16* %tmp44, i64 %tmp76
215  store i16 %tmp174, i16* %tmp175, align 2
216  br label %bb176
217
218bb176:                                            ; preds = %bb173, %bb145
219  %tmp177 = add i64 %tmp76, 2
220  %tmp178 = load i64, i64* %tmp35, align 8
221  %tmp179 = load i64, i64* %tmp11, align 8
222  %tmp180 = add i64 %tmp178, 1
223  %tmp181 = sub i64 %tmp180, %tmp179
224  %tmp182 = icmp ult i64 %tmp177, %tmp181
225  br i1 %tmp182, label %bb74, label %bb52
226}
227
228; Function Attrs: noreturn nounwind
229declare void @llvm.trap() #0
230
231; Function Attrs: nounwind readnone speculatable
232declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) #1
233
234attributes #0 = { noreturn nounwind }
235attributes #1 = { nounwind readnone speculatable }
236