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