1 ; RUN: llc -mtriple=thumbv7-apple-darwin10 -mcpu=cortex-a8 < %s | FileCheck %s 2 3 ; LSR should recognize that this is an unrolled loop which can use 4 ; constant offset addressing, so that each of the following stores 5 ; uses the same register. 6 7 ; CHECK: vstr.32 s{{.*}}, [{{(r[0-9]+)|(lr)}}, #32] 8 ; CHECK: vstr.32 s{{.*}}, [{{(r[0-9]+)|(lr)}}, #64] 9 ; CHECK: vstr.32 s{{.*}}, [{{(r[0-9]+)|(lr)}}, #96] 10 11 target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:64:64-v128:128:128-a0:0:32-n32" 12 13 %0 = type { %1*, %3*, %6*, i8*, i32, i32, %8*, i32, i32, i32, i32, i32, i32, i32, double, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i8**, i32, i32, i32, i32, i32, [64 x i32]*, [4 x %9*], [4 x %10*], [4 x %10*], i32, %11*, i32, i32, [16 x i8], [16 x i8], [16 x i8], i32, i32, i8, i8, i8, i16, i16, i32, i8, i32, %12*, i32, i32, i32, i32, i8*, i32, [4 x %11*], i32, i32, i32, [10 x i32], i32, i32, i32, i32, i32, %13*, %14*, %15*, %16*, %17*, %18*, %19*, %20*, %21*, %22*, %23* } 14 %1 = type { void (%2*)*, void (%2*, i32)*, void (%2*)*, void (%2*, i8*)*, void (%2*)*, i32, %7, i32, i32, i8**, i32, i8**, i32, i32 } 15 %2 = type { %1*, %3*, %6*, i8*, i32, i32 } 16 %3 = type { i8* (%2*, i32, i32)*, i8* (%2*, i32, i32)*, i8** (%2*, i32, i32, i32)*, [64 x i16]** (%2*, i32, i32, i32)*, %4* (%2*, i32, i32, i32, i32, i32)*, %5* (%2*, i32, i32, i32, i32, i32)*, void (%2*)*, i8** (%2*, %4*, i32, i32, i32)*, [64 x i16]** (%2*, %5*, i32, i32, i32)*, void (%2*, i32)*, void (%2*)*, i32, i32 } 17 %4 = type opaque 18 %5 = type opaque 19 %6 = type { void (%2*)*, i32, i32, i32, i32 } 20 %7 = type { [8 x i32], [12 x i32] } 21 %8 = type { i8*, i32, void (%0*)*, i32 (%0*)*, void (%0*, i32)*, i32 (%0*, i32)*, void (%0*)* } 22 %9 = type { [64 x i16], i32 } 23 %10 = type { [17 x i8], [256 x i8], i32 } 24 %11 = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, %9*, i8* } 25 %12 = type { %12*, i8, i32, i32, i8* } 26 %13 = type { void (%0*)*, void (%0*)*, i32 } 27 %14 = type { void (%0*, i32)*, void (%0*, i8**, i32*, i32)* } 28 %15 = type { void (%0*)*, i32 (%0*)*, void (%0*)*, i32 (%0*, i8***)*, %5** } 29 %16 = type { void (%0*, i32)*, void (%0*, i8***, i32*, i32, i8**, i32*, i32)* } 30 %17 = type { i32 (%0*)*, void (%0*)*, void (%0*)*, void (%0*)*, i32, i32 } 31 %18 = type { void (%0*)*, i32 (%0*)*, i32 (%0*)*, i32, i32, i32, i32 } 32 %19 = type { void (%0*)*, i32 (%0*, [64 x i16]**)*, i32 } 33 %20 = type { void (%0*)*, [10 x void (%0*, %11*, i16*, i8**, i32)*] } 34 %21 = type { void (%0*)*, void (%0*, i8***, i32*, i32, i8**, i32*, i32)*, i32 } 35 %22 = type { void (%0*)*, void (%0*, i8***, i32, i8**, i32)* } 36 %23 = type { void (%0*, i32)*, void (%0*, i8**, i8**, i32)*, void (%0*)*, void (%0*)* } 37 38 define void @test(%0* nocapture %a0, %11* nocapture %a1, i16* nocapture %a2, i8** nocapture %a3, i32 %a4) nounwind { 39 bb: 40 %t = alloca [64 x float], align 4 41 %t5 = getelementptr inbounds %0* %a0, i32 0, i32 65 42 %t6 = load i8** %t5, align 4 43 %t7 = getelementptr inbounds %11* %a1, i32 0, i32 20 44 %t8 = load i8** %t7, align 4 45 br label %bb9 46 47 bb9: 48 %t10 = phi i32 [ 0, %bb ], [ %t157, %bb156 ] 49 %t11 = add i32 %t10, 8 50 %t12 = getelementptr [64 x float]* %t, i32 0, i32 %t11 51 %t13 = add i32 %t10, 16 52 %t14 = getelementptr [64 x float]* %t, i32 0, i32 %t13 53 %t15 = add i32 %t10, 24 54 %t16 = getelementptr [64 x float]* %t, i32 0, i32 %t15 55 %t17 = add i32 %t10, 32 56 %t18 = getelementptr [64 x float]* %t, i32 0, i32 %t17 57 %t19 = add i32 %t10, 40 58 %t20 = getelementptr [64 x float]* %t, i32 0, i32 %t19 59 %t21 = add i32 %t10, 48 60 %t22 = getelementptr [64 x float]* %t, i32 0, i32 %t21 61 %t23 = add i32 %t10, 56 62 %t24 = getelementptr [64 x float]* %t, i32 0, i32 %t23 63 %t25 = getelementptr [64 x float]* %t, i32 0, i32 %t10 64 %t26 = shl i32 %t10, 5 65 %t27 = or i32 %t26, 8 66 %t28 = getelementptr i8* %t8, i32 %t27 67 %t29 = bitcast i8* %t28 to float* 68 %t30 = or i32 %t26, 16 69 %t31 = getelementptr i8* %t8, i32 %t30 70 %t32 = bitcast i8* %t31 to float* 71 %t33 = or i32 %t26, 24 72 %t34 = getelementptr i8* %t8, i32 %t33 73 %t35 = bitcast i8* %t34 to float* 74 %t36 = or i32 %t26, 4 75 %t37 = getelementptr i8* %t8, i32 %t36 76 %t38 = bitcast i8* %t37 to float* 77 %t39 = or i32 %t26, 12 78 %t40 = getelementptr i8* %t8, i32 %t39 79 %t41 = bitcast i8* %t40 to float* 80 %t42 = or i32 %t26, 20 81 %t43 = getelementptr i8* %t8, i32 %t42 82 %t44 = bitcast i8* %t43 to float* 83 %t45 = or i32 %t26, 28 84 %t46 = getelementptr i8* %t8, i32 %t45 85 %t47 = bitcast i8* %t46 to float* 86 %t48 = getelementptr i8* %t8, i32 %t26 87 %t49 = bitcast i8* %t48 to float* 88 %t50 = shl i32 %t10, 3 89 %t51 = or i32 %t50, 1 90 %t52 = getelementptr i16* %a2, i32 %t51 91 %t53 = or i32 %t50, 2 92 %t54 = getelementptr i16* %a2, i32 %t53 93 %t55 = or i32 %t50, 3 94 %t56 = getelementptr i16* %a2, i32 %t55 95 %t57 = or i32 %t50, 4 96 %t58 = getelementptr i16* %a2, i32 %t57 97 %t59 = or i32 %t50, 5 98 %t60 = getelementptr i16* %a2, i32 %t59 99 %t61 = or i32 %t50, 6 100 %t62 = getelementptr i16* %a2, i32 %t61 101 %t63 = or i32 %t50, 7 102 %t64 = getelementptr i16* %a2, i32 %t63 103 %t65 = getelementptr i16* %a2, i32 %t50 104 %t66 = load i16* %t52, align 2 105 %t67 = icmp eq i16 %t66, 0 106 %t68 = load i16* %t54, align 2 107 %t69 = icmp eq i16 %t68, 0 108 %t70 = and i1 %t67, %t69 109 br i1 %t70, label %bb71, label %bb91 110 111 bb71: 112 %t72 = load i16* %t56, align 2 113 %t73 = icmp eq i16 %t72, 0 114 br i1 %t73, label %bb74, label %bb91 115 116 bb74: 117 %t75 = load i16* %t58, align 2 118 %t76 = icmp eq i16 %t75, 0 119 br i1 %t76, label %bb77, label %bb91 120 121 bb77: 122 %t78 = load i16* %t60, align 2 123 %t79 = icmp eq i16 %t78, 0 124 br i1 %t79, label %bb80, label %bb91 125 126 bb80: 127 %t81 = load i16* %t62, align 2 128 %t82 = icmp eq i16 %t81, 0 129 br i1 %t82, label %bb83, label %bb91 130 131 bb83: 132 %t84 = load i16* %t64, align 2 133 %t85 = icmp eq i16 %t84, 0 134 br i1 %t85, label %bb86, label %bb91 135 136 bb86: 137 %t87 = load i16* %t65, align 2 138 %t88 = sitofp i16 %t87 to float 139 %t89 = load float* %t49, align 4 140 %t90 = fmul float %t88, %t89 141 store float %t90, float* %t25, align 4 142 store float %t90, float* %t12, align 4 143 store float %t90, float* %t14, align 4 144 store float %t90, float* %t16, align 4 145 store float %t90, float* %t18, align 4 146 store float %t90, float* %t20, align 4 147 store float %t90, float* %t22, align 4 148 store float %t90, float* %t24, align 4 149 br label %bb156 150 151 bb91: 152 %t92 = load i16* %t65, align 2 153 %t93 = sitofp i16 %t92 to float 154 %t94 = load float* %t49, align 4 155 %t95 = fmul float %t93, %t94 156 %t96 = sitofp i16 %t68 to float 157 %t97 = load float* %t29, align 4 158 %t98 = fmul float %t96, %t97 159 %t99 = load i16* %t58, align 2 160 %t100 = sitofp i16 %t99 to float 161 %t101 = load float* %t32, align 4 162 %t102 = fmul float %t100, %t101 163 %t103 = load i16* %t62, align 2 164 %t104 = sitofp i16 %t103 to float 165 %t105 = load float* %t35, align 4 166 %t106 = fmul float %t104, %t105 167 %t107 = fadd float %t95, %t102 168 %t108 = fsub float %t95, %t102 169 %t109 = fadd float %t98, %t106 170 %t110 = fsub float %t98, %t106 171 %t111 = fmul float %t110, 0x3FF6A09E60000000 172 %t112 = fsub float %t111, %t109 173 %t113 = fadd float %t107, %t109 174 %t114 = fsub float %t107, %t109 175 %t115 = fadd float %t108, %t112 176 %t116 = fsub float %t108, %t112 177 %t117 = sitofp i16 %t66 to float 178 %t118 = load float* %t38, align 4 179 %t119 = fmul float %t117, %t118 180 %t120 = load i16* %t56, align 2 181 %t121 = sitofp i16 %t120 to float 182 %t122 = load float* %t41, align 4 183 %t123 = fmul float %t121, %t122 184 %t124 = load i16* %t60, align 2 185 %t125 = sitofp i16 %t124 to float 186 %t126 = load float* %t44, align 4 187 %t127 = fmul float %t125, %t126 188 %t128 = load i16* %t64, align 2 189 %t129 = sitofp i16 %t128 to float 190 %t130 = load float* %t47, align 4 191 %t131 = fmul float %t129, %t130 192 %t132 = fadd float %t127, %t123 193 %t133 = fsub float %t127, %t123 194 %t134 = fadd float %t119, %t131 195 %t135 = fsub float %t119, %t131 196 %t136 = fadd float %t134, %t132 197 %t137 = fsub float %t134, %t132 198 %t138 = fmul float %t137, 0x3FF6A09E60000000 199 %t139 = fadd float %t133, %t135 200 %t140 = fmul float %t139, 0x3FFD906BC0000000 201 %t141 = fmul float %t135, 0x3FF1517A80000000 202 %t142 = fsub float %t141, %t140 203 %t143 = fmul float %t133, 0xC004E7AEA0000000 204 %t144 = fadd float %t143, %t140 205 %t145 = fsub float %t144, %t136 206 %t146 = fsub float %t138, %t145 207 %t147 = fadd float %t142, %t146 208 %t148 = fadd float %t113, %t136 209 store float %t148, float* %t25, align 4 210 %t149 = fsub float %t113, %t136 211 store float %t149, float* %t24, align 4 212 %t150 = fadd float %t115, %t145 213 store float %t150, float* %t12, align 4 214 %t151 = fsub float %t115, %t145 215 store float %t151, float* %t22, align 4 216 %t152 = fadd float %t116, %t146 217 store float %t152, float* %t14, align 4 218 %t153 = fsub float %t116, %t146 219 store float %t153, float* %t20, align 4 220 %t154 = fadd float %t114, %t147 221 store float %t154, float* %t18, align 4 222 %t155 = fsub float %t114, %t147 223 store float %t155, float* %t16, align 4 224 br label %bb156 225 226 bb156: 227 %t157 = add i32 %t10, 1 228 %t158 = icmp eq i32 %t157, 8 229 br i1 %t158, label %bb159, label %bb9 230 231 bb159: 232 %t160 = add i32 %a4, 7 233 %t161 = add i32 %a4, 1 234 %t162 = add i32 %a4, 6 235 %t163 = add i32 %a4, 2 236 %t164 = add i32 %a4, 5 237 %t165 = add i32 %a4, 4 238 %t166 = add i32 %a4, 3 239 br label %bb167 240 241 bb167: 242 %t168 = phi i32 [ 0, %bb159 ], [ %t293, %bb167 ] 243 %t169 = getelementptr i8** %a3, i32 %t168 244 %t170 = shl i32 %t168, 3 245 %t171 = or i32 %t170, 4 246 %t172 = getelementptr [64 x float]* %t, i32 0, i32 %t171 247 %t173 = or i32 %t170, 2 248 %t174 = getelementptr [64 x float]* %t, i32 0, i32 %t173 249 %t175 = or i32 %t170, 6 250 %t176 = getelementptr [64 x float]* %t, i32 0, i32 %t175 251 %t177 = or i32 %t170, 5 252 %t178 = getelementptr [64 x float]* %t, i32 0, i32 %t177 253 %t179 = or i32 %t170, 3 254 %t180 = getelementptr [64 x float]* %t, i32 0, i32 %t179 255 %t181 = or i32 %t170, 1 256 %t182 = getelementptr [64 x float]* %t, i32 0, i32 %t181 257 %t183 = or i32 %t170, 7 258 %t184 = getelementptr [64 x float]* %t, i32 0, i32 %t183 259 %t185 = getelementptr [64 x float]* %t, i32 0, i32 %t170 260 %t186 = load i8** %t169, align 4 261 %t187 = getelementptr inbounds i8* %t186, i32 %a4 262 %t188 = load float* %t185, align 4 263 %t189 = load float* %t172, align 4 264 %t190 = fadd float %t188, %t189 265 %t191 = fsub float %t188, %t189 266 %t192 = load float* %t174, align 4 267 %t193 = load float* %t176, align 4 268 %t194 = fadd float %t192, %t193 269 %t195 = fsub float %t192, %t193 270 %t196 = fmul float %t195, 0x3FF6A09E60000000 271 %t197 = fsub float %t196, %t194 272 %t198 = fadd float %t190, %t194 273 %t199 = fsub float %t190, %t194 274 %t200 = fadd float %t191, %t197 275 %t201 = fsub float %t191, %t197 276 %t202 = load float* %t178, align 4 277 %t203 = load float* %t180, align 4 278 %t204 = fadd float %t202, %t203 279 %t205 = fsub float %t202, %t203 280 %t206 = load float* %t182, align 4 281 %t207 = load float* %t184, align 4 282 %t208 = fadd float %t206, %t207 283 %t209 = fsub float %t206, %t207 284 %t210 = fadd float %t208, %t204 285 %t211 = fsub float %t208, %t204 286 %t212 = fmul float %t211, 0x3FF6A09E60000000 287 %t213 = fadd float %t205, %t209 288 %t214 = fmul float %t213, 0x3FFD906BC0000000 289 %t215 = fmul float %t209, 0x3FF1517A80000000 290 %t216 = fsub float %t215, %t214 291 %t217 = fmul float %t205, 0xC004E7AEA0000000 292 %t218 = fadd float %t217, %t214 293 %t219 = fsub float %t218, %t210 294 %t220 = fsub float %t212, %t219 295 %t221 = fadd float %t216, %t220 296 %t222 = fadd float %t198, %t210 297 %t223 = fptosi float %t222 to i32 298 %t224 = add nsw i32 %t223, 4 299 %t225 = lshr i32 %t224, 3 300 %t226 = and i32 %t225, 1023 301 %t227 = add i32 %t226, 128 302 %t228 = getelementptr inbounds i8* %t6, i32 %t227 303 %t229 = load i8* %t228, align 1 304 store i8 %t229, i8* %t187, align 1 305 %t230 = fsub float %t198, %t210 306 %t231 = fptosi float %t230 to i32 307 %t232 = add nsw i32 %t231, 4 308 %t233 = lshr i32 %t232, 3 309 %t234 = and i32 %t233, 1023 310 %t235 = add i32 %t234, 128 311 %t236 = getelementptr inbounds i8* %t6, i32 %t235 312 %t237 = load i8* %t236, align 1 313 %t238 = getelementptr inbounds i8* %t186, i32 %t160 314 store i8 %t237, i8* %t238, align 1 315 %t239 = fadd float %t200, %t219 316 %t240 = fptosi float %t239 to i32 317 %t241 = add nsw i32 %t240, 4 318 %t242 = lshr i32 %t241, 3 319 %t243 = and i32 %t242, 1023 320 %t244 = add i32 %t243, 128 321 %t245 = getelementptr inbounds i8* %t6, i32 %t244 322 %t246 = load i8* %t245, align 1 323 %t247 = getelementptr inbounds i8* %t186, i32 %t161 324 store i8 %t246, i8* %t247, align 1 325 %t248 = fsub float %t200, %t219 326 %t249 = fptosi float %t248 to i32 327 %t250 = add nsw i32 %t249, 4 328 %t251 = lshr i32 %t250, 3 329 %t252 = and i32 %t251, 1023 330 %t253 = add i32 %t252, 128 331 %t254 = getelementptr inbounds i8* %t6, i32 %t253 332 %t255 = load i8* %t254, align 1 333 %t256 = getelementptr inbounds i8* %t186, i32 %t162 334 store i8 %t255, i8* %t256, align 1 335 %t257 = fadd float %t201, %t220 336 %t258 = fptosi float %t257 to i32 337 %t259 = add nsw i32 %t258, 4 338 %t260 = lshr i32 %t259, 3 339 %t261 = and i32 %t260, 1023 340 %t262 = add i32 %t261, 128 341 %t263 = getelementptr inbounds i8* %t6, i32 %t262 342 %t264 = load i8* %t263, align 1 343 %t265 = getelementptr inbounds i8* %t186, i32 %t163 344 store i8 %t264, i8* %t265, align 1 345 %t266 = fsub float %t201, %t220 346 %t267 = fptosi float %t266 to i32 347 %t268 = add nsw i32 %t267, 4 348 %t269 = lshr i32 %t268, 3 349 %t270 = and i32 %t269, 1023 350 %t271 = add i32 %t270, 128 351 %t272 = getelementptr inbounds i8* %t6, i32 %t271 352 %t273 = load i8* %t272, align 1 353 %t274 = getelementptr inbounds i8* %t186, i32 %t164 354 store i8 %t273, i8* %t274, align 1 355 %t275 = fadd float %t199, %t221 356 %t276 = fptosi float %t275 to i32 357 %t277 = add nsw i32 %t276, 4 358 %t278 = lshr i32 %t277, 3 359 %t279 = and i32 %t278, 1023 360 %t280 = add i32 %t279, 128 361 %t281 = getelementptr inbounds i8* %t6, i32 %t280 362 %t282 = load i8* %t281, align 1 363 %t283 = getelementptr inbounds i8* %t186, i32 %t165 364 store i8 %t282, i8* %t283, align 1 365 %t284 = fsub float %t199, %t221 366 %t285 = fptosi float %t284 to i32 367 %t286 = add nsw i32 %t285, 4 368 %t287 = lshr i32 %t286, 3 369 %t288 = and i32 %t287, 1023 370 %t289 = add i32 %t288, 128 371 %t290 = getelementptr inbounds i8* %t6, i32 %t289 372 %t291 = load i8* %t290, align 1 373 %t292 = getelementptr inbounds i8* %t186, i32 %t166 374 store i8 %t291, i8* %t292, align 1 375 %t293 = add nsw i32 %t168, 1 376 %t294 = icmp eq i32 %t293, 8 377 br i1 %t294, label %bb295, label %bb167 378 379 bb295: 380 ret void 381 } 382 383 %struct.ct_data_s = type { %union.anon, %union.anon } 384 %struct.gz_header = type { i32, i32, i32, i32, i8*, i32, i32, i8*, i32, i8*, i32, i32, i32 } 385 %struct.internal_state = type { %struct.z_stream*, i32, i8*, i32, i8*, i32, i32, %struct.gz_header*, i32, i8, i32, i32, i32, i32, i8*, i32, i16*, i16*, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, [573 x %struct.ct_data_s], [61 x %struct.ct_data_s], [39 x %struct.ct_data_s], %struct.tree_desc_s, %struct.tree_desc_s, %struct.tree_desc_s, [16 x i16], [573 x i32], i32, i32, [573 x i8], i8*, i32, i32, i16*, i32, i32, i32, i32, i16, i32 } 386 %struct.static_tree_desc = type { i32 } 387 %struct.tree_desc_s = type { %struct.ct_data_s*, i32, %struct.static_tree_desc* } 388 %struct.z_stream = type { i8*, i32, i32, i8*, i32, i32, i8*, %struct.internal_state*, i8* (i8*, i32, i32)*, void (i8*, i8*)*, i8*, i32, i32, i32 } 389 %union.anon = type { i16 } 390 391 define i32 @longest_match(%struct.internal_state* %s, i32 %cur_match) nounwind optsize { 392 entry: 393 %0 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 31 ; <i32*> [#uses=1] 394 %1 = load i32* %0, align 4 ; <i32> [#uses=2] 395 %2 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 14 ; <i8**> [#uses=1] 396 %3 = load i8** %2, align 4 ; <i8*> [#uses=27] 397 %4 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 27 ; <i32*> [#uses=1] 398 %5 = load i32* %4, align 4 ; <i32> [#uses=17] 399 %6 = getelementptr inbounds i8* %3, i32 %5 ; <i8*> [#uses=1] 400 %7 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 30 ; <i32*> [#uses=1] 401 %8 = load i32* %7, align 4 ; <i32> [#uses=4] 402 %9 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 36 ; <i32*> [#uses=1] 403 %10 = load i32* %9, align 4 ; <i32> [#uses=2] 404 %11 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 11 ; <i32*> [#uses=1] 405 %12 = load i32* %11, align 4 ; <i32> [#uses=2] 406 %13 = add i32 %12, -262 ; <i32> [#uses=1] 407 %14 = icmp ugt i32 %5, %13 ; <i1> [#uses=1] 408 br i1 %14, label %bb, label %bb2 409 410 bb: ; preds = %entry 411 %15 = add i32 %5, 262 ; <i32> [#uses=1] 412 %16 = sub i32 %15, %12 ; <i32> [#uses=1] 413 br label %bb2 414 415 bb2: ; preds = %bb, %entry 416 %iftmp.48.0 = phi i32 [ %16, %bb ], [ 0, %entry ] ; <i32> [#uses=1] 417 %17 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 16 ; <i16**> [#uses=1] 418 %18 = load i16** %17, align 4 ; <i16*> [#uses=1] 419 %19 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 13 ; <i32*> [#uses=1] 420 %20 = load i32* %19, align 4 ; <i32> [#uses=1] 421 %.sum = add i32 %5, 258 ; <i32> [#uses=2] 422 %21 = getelementptr inbounds i8* %3, i32 %.sum ; <i8*> [#uses=1] 423 %22 = add nsw i32 %5, -1 ; <i32> [#uses=1] 424 %.sum30 = add i32 %22, %8 ; <i32> [#uses=1] 425 %23 = getelementptr inbounds i8* %3, i32 %.sum30 ; <i8*> [#uses=1] 426 %24 = load i8* %23, align 1 ; <i8> [#uses=1] 427 %.sum31 = add i32 %8, %5 ; <i32> [#uses=1] 428 %25 = getelementptr inbounds i8* %3, i32 %.sum31 ; <i8*> [#uses=1] 429 %26 = load i8* %25, align 1 ; <i8> [#uses=1] 430 %27 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 35 ; <i32*> [#uses=1] 431 %28 = load i32* %27, align 4 ; <i32> [#uses=1] 432 %29 = lshr i32 %1, 2 ; <i32> [#uses=1] 433 %30 = icmp ult i32 %8, %28 ; <i1> [#uses=1] 434 %. = select i1 %30, i32 %1, i32 %29 ; <i32> [#uses=1] 435 %31 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 29 ; <i32*> [#uses=1] 436 %32 = load i32* %31, align 4 ; <i32> [#uses=4] 437 %33 = icmp ugt i32 %10, %32 ; <i1> [#uses=1] 438 %nice_match.0.ph = select i1 %33, i32 %32, i32 %10 ; <i32> [#uses=1] 439 %34 = getelementptr inbounds %struct.internal_state* %s, i32 0, i32 28 ; <i32*> [#uses=1] 440 %35 = ptrtoint i8* %21 to i32 ; <i32> [#uses=1] 441 %36 = add nsw i32 %5, 257 ; <i32> [#uses=1] 442 %tmp81 = add i32 %., -1 ; <i32> [#uses=1] 443 br label %bb6 444 445 bb6: ; preds = %bb24, %bb2 446 %indvar78 = phi i32 [ 0, %bb2 ], [ %indvar.next79, %bb24 ] ; <i32> [#uses=2] 447 %best_len.2 = phi i32 [ %8, %bb2 ], [ %best_len.0, %bb24 ] ; <i32> [#uses=8] 448 %scan_end1.1 = phi i8 [ %24, %bb2 ], [ %scan_end1.0, %bb24 ] ; <i8> [#uses=6] 449 %cur_match_addr.0 = phi i32 [ %cur_match, %bb2 ], [ %90, %bb24 ] ; <i32> [#uses=14] 450 %scan_end.1 = phi i8 [ %26, %bb2 ], [ %scan_end.0, %bb24 ] ; <i8> [#uses=6] 451 %37 = getelementptr inbounds i8* %3, i32 %cur_match_addr.0 ; <i8*> [#uses=1] 452 %.sum32 = add i32 %cur_match_addr.0, %best_len.2 ; <i32> [#uses=1] 453 %38 = getelementptr inbounds i8* %3, i32 %.sum32 ; <i8*> [#uses=1] 454 %39 = load i8* %38, align 1 ; <i8> [#uses=1] 455 %40 = icmp eq i8 %39, %scan_end.1 ; <i1> [#uses=1] 456 br i1 %40, label %bb7, label %bb23 457 458 bb7: ; preds = %bb6 459 %41 = add nsw i32 %best_len.2, -1 ; <i32> [#uses=1] 460 %.sum33 = add i32 %41, %cur_match_addr.0 ; <i32> [#uses=1] 461 %42 = getelementptr inbounds i8* %3, i32 %.sum33 ; <i8*> [#uses=1] 462 %43 = load i8* %42, align 1 ; <i8> [#uses=1] 463 %44 = icmp eq i8 %43, %scan_end1.1 ; <i1> [#uses=1] 464 br i1 %44, label %bb8, label %bb23 465 466 bb8: ; preds = %bb7 467 %45 = load i8* %37, align 1 ; <i8> [#uses=1] 468 %46 = load i8* %6, align 1 ; <i8> [#uses=1] 469 %47 = icmp eq i8 %45, %46 ; <i1> [#uses=1] 470 br i1 %47, label %bb9, label %bb23 471 472 bb9: ; preds = %bb8 473 %.sum34 = add i32 %cur_match_addr.0, 1 ; <i32> [#uses=1] 474 %48 = getelementptr inbounds i8* %3, i32 %.sum34 ; <i8*> [#uses=1] 475 %49 = load i8* %48, align 1 ; <i8> [#uses=1] 476 %.sum88 = add i32 %5, 1 ; <i32> [#uses=1] 477 %50 = getelementptr inbounds i8* %3, i32 %.sum88 ; <i8*> [#uses=1] 478 %51 = load i8* %50, align 1 ; <i8> [#uses=1] 479 %52 = icmp eq i8 %49, %51 ; <i1> [#uses=1] 480 br i1 %52, label %bb10, label %bb23 481 482 bb10: ; preds = %bb9 483 %tmp39 = add i32 %cur_match_addr.0, 10 ; <i32> [#uses=1] 484 %tmp41 = add i32 %cur_match_addr.0, 9 ; <i32> [#uses=1] 485 %tmp44 = add i32 %cur_match_addr.0, 8 ; <i32> [#uses=1] 486 %tmp47 = add i32 %cur_match_addr.0, 7 ; <i32> [#uses=1] 487 %tmp50 = add i32 %cur_match_addr.0, 6 ; <i32> [#uses=1] 488 %tmp53 = add i32 %cur_match_addr.0, 5 ; <i32> [#uses=1] 489 %tmp56 = add i32 %cur_match_addr.0, 4 ; <i32> [#uses=1] 490 %tmp59 = add i32 %cur_match_addr.0, 3 ; <i32> [#uses=1] 491 br label %bb11 492 493 bb11: ; preds = %bb18, %bb10 494 %indvar = phi i32 [ %indvar.next, %bb18 ], [ 0, %bb10 ] ; <i32> [#uses=2] 495 %tmp = shl i32 %indvar, 3 ; <i32> [#uses=16] 496 %tmp40 = add i32 %tmp39, %tmp ; <i32> [#uses=1] 497 %scevgep = getelementptr i8* %3, i32 %tmp40 ; <i8*> [#uses=1] 498 %tmp42 = add i32 %tmp41, %tmp ; <i32> [#uses=1] 499 %scevgep43 = getelementptr i8* %3, i32 %tmp42 ; <i8*> [#uses=1] 500 %tmp45 = add i32 %tmp44, %tmp ; <i32> [#uses=1] 501 %scevgep46 = getelementptr i8* %3, i32 %tmp45 ; <i8*> [#uses=1] 502 %tmp48 = add i32 %tmp47, %tmp ; <i32> [#uses=1] 503 %scevgep49 = getelementptr i8* %3, i32 %tmp48 ; <i8*> [#uses=1] 504 %tmp51 = add i32 %tmp50, %tmp ; <i32> [#uses=1] 505 %scevgep52 = getelementptr i8* %3, i32 %tmp51 ; <i8*> [#uses=1] 506 %tmp54 = add i32 %tmp53, %tmp ; <i32> [#uses=1] 507 %scevgep55 = getelementptr i8* %3, i32 %tmp54 ; <i8*> [#uses=1] 508 %tmp60 = add i32 %tmp59, %tmp ; <i32> [#uses=1] 509 %scevgep61 = getelementptr i8* %3, i32 %tmp60 ; <i8*> [#uses=1] 510 %tmp62 = add i32 %tmp, 10 ; <i32> [#uses=1] 511 %.sum89 = add i32 %5, %tmp62 ; <i32> [#uses=2] 512 %scevgep63 = getelementptr i8* %3, i32 %.sum89 ; <i8*> [#uses=2] 513 %tmp64 = add i32 %tmp, 9 ; <i32> [#uses=1] 514 %.sum90 = add i32 %5, %tmp64 ; <i32> [#uses=1] 515 %scevgep65 = getelementptr i8* %3, i32 %.sum90 ; <i8*> [#uses=2] 516 %tmp66 = add i32 %tmp, 8 ; <i32> [#uses=1] 517 %.sum91 = add i32 %5, %tmp66 ; <i32> [#uses=1] 518 %scevgep67 = getelementptr i8* %3, i32 %.sum91 ; <i8*> [#uses=2] 519 %tmp6883 = or i32 %tmp, 7 ; <i32> [#uses=1] 520 %.sum92 = add i32 %5, %tmp6883 ; <i32> [#uses=1] 521 %scevgep69 = getelementptr i8* %3, i32 %.sum92 ; <i8*> [#uses=2] 522 %tmp7084 = or i32 %tmp, 6 ; <i32> [#uses=1] 523 %.sum93 = add i32 %5, %tmp7084 ; <i32> [#uses=1] 524 %scevgep71 = getelementptr i8* %3, i32 %.sum93 ; <i8*> [#uses=2] 525 %tmp7285 = or i32 %tmp, 5 ; <i32> [#uses=1] 526 %.sum94 = add i32 %5, %tmp7285 ; <i32> [#uses=1] 527 %scevgep73 = getelementptr i8* %3, i32 %.sum94 ; <i8*> [#uses=2] 528 %tmp7486 = or i32 %tmp, 4 ; <i32> [#uses=1] 529 %.sum95 = add i32 %5, %tmp7486 ; <i32> [#uses=1] 530 %scevgep75 = getelementptr i8* %3, i32 %.sum95 ; <i8*> [#uses=2] 531 %tmp7687 = or i32 %tmp, 3 ; <i32> [#uses=1] 532 %.sum96 = add i32 %5, %tmp7687 ; <i32> [#uses=1] 533 %scevgep77 = getelementptr i8* %3, i32 %.sum96 ; <i8*> [#uses=2] 534 %53 = load i8* %scevgep77, align 1 ; <i8> [#uses=1] 535 %54 = load i8* %scevgep61, align 1 ; <i8> [#uses=1] 536 %55 = icmp eq i8 %53, %54 ; <i1> [#uses=1] 537 br i1 %55, label %bb12, label %bb20 538 539 bb12: ; preds = %bb11 540 %tmp57 = add i32 %tmp56, %tmp ; <i32> [#uses=1] 541 %scevgep58 = getelementptr i8* %3, i32 %tmp57 ; <i8*> [#uses=1] 542 %56 = load i8* %scevgep75, align 1 ; <i8> [#uses=1] 543 %57 = load i8* %scevgep58, align 1 ; <i8> [#uses=1] 544 %58 = icmp eq i8 %56, %57 ; <i1> [#uses=1] 545 br i1 %58, label %bb13, label %bb20 546 547 bb13: ; preds = %bb12 548 %59 = load i8* %scevgep73, align 1 ; <i8> [#uses=1] 549 %60 = load i8* %scevgep55, align 1 ; <i8> [#uses=1] 550 %61 = icmp eq i8 %59, %60 ; <i1> [#uses=1] 551 br i1 %61, label %bb14, label %bb20 552 553 bb14: ; preds = %bb13 554 %62 = load i8* %scevgep71, align 1 ; <i8> [#uses=1] 555 %63 = load i8* %scevgep52, align 1 ; <i8> [#uses=1] 556 %64 = icmp eq i8 %62, %63 ; <i1> [#uses=1] 557 br i1 %64, label %bb15, label %bb20 558 559 bb15: ; preds = %bb14 560 %65 = load i8* %scevgep69, align 1 ; <i8> [#uses=1] 561 %66 = load i8* %scevgep49, align 1 ; <i8> [#uses=1] 562 %67 = icmp eq i8 %65, %66 ; <i1> [#uses=1] 563 br i1 %67, label %bb16, label %bb20 564 565 bb16: ; preds = %bb15 566 %68 = load i8* %scevgep67, align 1 ; <i8> [#uses=1] 567 %69 = load i8* %scevgep46, align 1 ; <i8> [#uses=1] 568 %70 = icmp eq i8 %68, %69 ; <i1> [#uses=1] 569 br i1 %70, label %bb17, label %bb20 570 571 bb17: ; preds = %bb16 572 %71 = load i8* %scevgep65, align 1 ; <i8> [#uses=1] 573 %72 = load i8* %scevgep43, align 1 ; <i8> [#uses=1] 574 %73 = icmp eq i8 %71, %72 ; <i1> [#uses=1] 575 br i1 %73, label %bb18, label %bb20 576 577 bb18: ; preds = %bb17 578 %74 = load i8* %scevgep63, align 1 ; <i8> [#uses=1] 579 %75 = load i8* %scevgep, align 1 ; <i8> [#uses=1] 580 %76 = icmp eq i8 %74, %75 ; <i1> [#uses=1] 581 %77 = icmp slt i32 %.sum89, %.sum ; <i1> [#uses=1] 582 %or.cond = and i1 %76, %77 ; <i1> [#uses=1] 583 %indvar.next = add i32 %indvar, 1 ; <i32> [#uses=1] 584 br i1 %or.cond, label %bb11, label %bb20 585 586 bb20: ; preds = %bb18, %bb17, %bb16, %bb15, %bb14, %bb13, %bb12, %bb11 587 %scan.3 = phi i8* [ %scevgep77, %bb11 ], [ %scevgep75, %bb12 ], [ %scevgep73, %bb13 ], [ %scevgep71, %bb14 ], [ %scevgep69, %bb15 ], [ %scevgep67, %bb16 ], [ %scevgep65, %bb17 ], [ %scevgep63, %bb18 ] ; <i8*> [#uses=1] 588 %78 = ptrtoint i8* %scan.3 to i32 ; <i32> [#uses=1] 589 %79 = sub nsw i32 %78, %35 ; <i32> [#uses=2] 590 %80 = add i32 %79, 258 ; <i32> [#uses=5] 591 %81 = icmp sgt i32 %80, %best_len.2 ; <i1> [#uses=1] 592 br i1 %81, label %bb21, label %bb23 593 594 bb21: ; preds = %bb20 595 store i32 %cur_match_addr.0, i32* %34, align 4 596 %82 = icmp slt i32 %80, %nice_match.0.ph ; <i1> [#uses=1] 597 br i1 %82, label %bb22, label %bb25 598 599 bb22: ; preds = %bb21 600 %.sum37 = add i32 %36, %79 ; <i32> [#uses=1] 601 %83 = getelementptr inbounds i8* %3, i32 %.sum37 ; <i8*> [#uses=1] 602 %84 = load i8* %83, align 1 ; <i8> [#uses=1] 603 %.sum38 = add i32 %80, %5 ; <i32> [#uses=1] 604 %85 = getelementptr inbounds i8* %3, i32 %.sum38 ; <i8*> [#uses=1] 605 %86 = load i8* %85, align 1 ; <i8> [#uses=1] 606 br label %bb23 607 608 bb23: ; preds = %bb22, %bb20, %bb9, %bb8, %bb7, %bb6 609 %best_len.0 = phi i32 [ %best_len.2, %bb6 ], [ %best_len.2, %bb7 ], [ %best_len.2, %bb8 ], [ %best_len.2, %bb9 ], [ %80, %bb22 ], [ %best_len.2, %bb20 ] ; <i32> [#uses=3] 610 %scan_end1.0 = phi i8 [ %scan_end1.1, %bb6 ], [ %scan_end1.1, %bb7 ], [ %scan_end1.1, %bb8 ], [ %scan_end1.1, %bb9 ], [ %84, %bb22 ], [ %scan_end1.1, %bb20 ] ; <i8> [#uses=1] 611 %scan_end.0 = phi i8 [ %scan_end.1, %bb6 ], [ %scan_end.1, %bb7 ], [ %scan_end.1, %bb8 ], [ %scan_end.1, %bb9 ], [ %86, %bb22 ], [ %scan_end.1, %bb20 ] ; <i8> [#uses=1] 612 %87 = and i32 %cur_match_addr.0, %20 ; <i32> [#uses=1] 613 %88 = getelementptr inbounds i16* %18, i32 %87 ; <i16*> [#uses=1] 614 %89 = load i16* %88, align 2 ; <i16> [#uses=1] 615 %90 = zext i16 %89 to i32 ; <i32> [#uses=2] 616 %91 = icmp ugt i32 %90, %iftmp.48.0 ; <i1> [#uses=1] 617 br i1 %91, label %bb24, label %bb25 618 619 bb24: ; preds = %bb23 620 621 ; LSR should use count-down iteration to avoid requiring the trip count 622 ; in a register. 623 624 ; CHECK: @ %bb24 625 ; CHECK: subs{{.*}} {{(r[0-9]+)|(lr)}}, #1 626 ; CHECK: bne.w 627 628 %92 = icmp eq i32 %tmp81, %indvar78 ; <i1> [#uses=1] 629 %indvar.next79 = add i32 %indvar78, 1 ; <i32> [#uses=1] 630 br i1 %92, label %bb25, label %bb6 631 632 bb25: ; preds = %bb24, %bb23, %bb21 633 %best_len.1 = phi i32 [ %best_len.0, %bb23 ], [ %best_len.0, %bb24 ], [ %80, %bb21 ] ; <i32> [#uses=2] 634 %93 = icmp ugt i32 %best_len.1, %32 ; <i1> [#uses=1] 635 %merge = select i1 %93, i32 %32, i32 %best_len.1 ; <i32> [#uses=1] 636 ret i32 %merge 637 } 638