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