Home | History | Annotate | Download | only in PowerPC
      1 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
      2 target triple = "powerpc64-unknown-linux-gnu"
      3 ; RUN: llc < %s -march=ppc64 | FileCheck %s
      4 
      5 ; XFAIL: *
      6 ; SE needs improvement
      7 
      8 ; CHECK: test_pos1_ir_sle
      9 ; CHECK: bdnz
     10 ; a < b
     11 define void @test_pos1_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     12 entry:
     13   %cmp3 = icmp sle i32 28395, %b
     14   br i1 %cmp3, label %for.body.lr.ph, label %for.end
     15 
     16 for.body.lr.ph:                                   ; preds = %entry
     17   br label %for.body
     18 
     19 for.body:                                         ; preds = %for.body.lr.ph, %for.body
     20   %i.04 = phi i32 [ 28395, %for.body.lr.ph ], [ %inc, %for.body ]
     21   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
     22   %0 = load i8, i8* %arrayidx, align 1
     23   %conv = zext i8 %0 to i32
     24   %add = add nsw i32 %conv, 1
     25   %conv1 = trunc i32 %add to i8
     26   store i8 %conv1, i8* %arrayidx, align 1
     27   %inc = add nsw i32 %i.04, 1
     28   %cmp = icmp sle i32 %inc, %b
     29   br i1 %cmp, label %for.body, label %for.end
     30 
     31 for.end:                                          ; preds = %for.body, %entry
     32   ret void
     33 }
     34 
     35 
     36 
     37 ; CHECK: test_pos2_ir_sle
     38 ; CHECK: bdnz
     39 ; a < b
     40 define void @test_pos2_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     41 entry:
     42   %cmp3 = icmp sle i32 9073, %b
     43   br i1 %cmp3, label %for.body.lr.ph, label %for.end
     44 
     45 for.body.lr.ph:                                   ; preds = %entry
     46   br label %for.body
     47 
     48 for.body:                                         ; preds = %for.body.lr.ph, %for.body
     49   %i.04 = phi i32 [ 9073, %for.body.lr.ph ], [ %inc, %for.body ]
     50   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
     51   %0 = load i8, i8* %arrayidx, align 1
     52   %conv = zext i8 %0 to i32
     53   %add = add nsw i32 %conv, 1
     54   %conv1 = trunc i32 %add to i8
     55   store i8 %conv1, i8* %arrayidx, align 1
     56   %inc = add nsw i32 %i.04, 2
     57   %cmp = icmp sle i32 %inc, %b
     58   br i1 %cmp, label %for.body, label %for.end
     59 
     60 for.end:                                          ; preds = %for.body, %entry
     61   ret void
     62 }
     63 
     64 
     65 
     66 ; CHECK: test_pos4_ir_sle
     67 ; CHECK: bdnz
     68 ; a < b
     69 define void @test_pos4_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     70 entry:
     71   %cmp3 = icmp sle i32 21956, %b
     72   br i1 %cmp3, label %for.body.lr.ph, label %for.end
     73 
     74 for.body.lr.ph:                                   ; preds = %entry
     75   br label %for.body
     76 
     77 for.body:                                         ; preds = %for.body.lr.ph, %for.body
     78   %i.04 = phi i32 [ 21956, %for.body.lr.ph ], [ %inc, %for.body ]
     79   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
     80   %0 = load i8, i8* %arrayidx, align 1
     81   %conv = zext i8 %0 to i32
     82   %add = add nsw i32 %conv, 1
     83   %conv1 = trunc i32 %add to i8
     84   store i8 %conv1, i8* %arrayidx, align 1
     85   %inc = add nsw i32 %i.04, 4
     86   %cmp = icmp sle i32 %inc, %b
     87   br i1 %cmp, label %for.body, label %for.end
     88 
     89 for.end:                                          ; preds = %for.body, %entry
     90   ret void
     91 }
     92 
     93 
     94 
     95 ; CHECK: test_pos8_ir_sle
     96 ; CHECK: bdnz
     97 ; a < b
     98 define void @test_pos8_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     99 entry:
    100   %cmp3 = icmp sle i32 16782, %b
    101   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    102 
    103 for.body.lr.ph:                                   ; preds = %entry
    104   br label %for.body
    105 
    106 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    107   %i.04 = phi i32 [ 16782, %for.body.lr.ph ], [ %inc, %for.body ]
    108   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    109   %0 = load i8, i8* %arrayidx, align 1
    110   %conv = zext i8 %0 to i32
    111   %add = add nsw i32 %conv, 1
    112   %conv1 = trunc i32 %add to i8
    113   store i8 %conv1, i8* %arrayidx, align 1
    114   %inc = add nsw i32 %i.04, 8
    115   %cmp = icmp sle i32 %inc, %b
    116   br i1 %cmp, label %for.body, label %for.end
    117 
    118 for.end:                                          ; preds = %for.body, %entry
    119   ret void
    120 }
    121 
    122 
    123 
    124 ; CHECK: test_pos16_ir_sle
    125 ; CHECK: bdnz
    126 ; a < b
    127 define void @test_pos16_ir_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    128 entry:
    129   %cmp3 = icmp sle i32 19097, %b
    130   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    131 
    132 for.body.lr.ph:                                   ; preds = %entry
    133   br label %for.body
    134 
    135 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    136   %i.04 = phi i32 [ 19097, %for.body.lr.ph ], [ %inc, %for.body ]
    137   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    138   %0 = load i8, i8* %arrayidx, align 1
    139   %conv = zext i8 %0 to i32
    140   %add = add nsw i32 %conv, 1
    141   %conv1 = trunc i32 %add to i8
    142   store i8 %conv1, i8* %arrayidx, align 1
    143   %inc = add nsw i32 %i.04, 16
    144   %cmp = icmp sle i32 %inc, %b
    145   br i1 %cmp, label %for.body, label %for.end
    146 
    147 for.end:                                          ; preds = %for.body, %entry
    148   ret void
    149 }
    150 
    151 
    152 
    153 ; CHECK: test_pos1_ri_sle
    154 ; CHECK: bdnz
    155 ; a < b
    156 define void @test_pos1_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    157 entry:
    158   %cmp3 = icmp sle i32 %a, 14040
    159   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    160 
    161 for.body.lr.ph:                                   ; preds = %entry
    162   br label %for.body
    163 
    164 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    165   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    166   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    167   %0 = load i8, i8* %arrayidx, align 1
    168   %conv = zext i8 %0 to i32
    169   %add = add nsw i32 %conv, 1
    170   %conv1 = trunc i32 %add to i8
    171   store i8 %conv1, i8* %arrayidx, align 1
    172   %inc = add nsw i32 %i.04, 1
    173   %cmp = icmp sle i32 %inc, 14040
    174   br i1 %cmp, label %for.body, label %for.end
    175 
    176 for.end:                                          ; preds = %for.body, %entry
    177   ret void
    178 }
    179 
    180 
    181 
    182 ; CHECK: test_pos2_ri_sle
    183 ; CHECK: bdnz
    184 ; a < b
    185 define void @test_pos2_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    186 entry:
    187   %cmp3 = icmp sle i32 %a, 13710
    188   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    189 
    190 for.body.lr.ph:                                   ; preds = %entry
    191   br label %for.body
    192 
    193 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    194   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    195   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    196   %0 = load i8, i8* %arrayidx, align 1
    197   %conv = zext i8 %0 to i32
    198   %add = add nsw i32 %conv, 1
    199   %conv1 = trunc i32 %add to i8
    200   store i8 %conv1, i8* %arrayidx, align 1
    201   %inc = add nsw i32 %i.04, 2
    202   %cmp = icmp sle i32 %inc, 13710
    203   br i1 %cmp, label %for.body, label %for.end
    204 
    205 for.end:                                          ; preds = %for.body, %entry
    206   ret void
    207 }
    208 
    209 
    210 
    211 ; CHECK: test_pos4_ri_sle
    212 ; CHECK: bdnz
    213 ; a < b
    214 define void @test_pos4_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    215 entry:
    216   %cmp3 = icmp sle i32 %a, 9920
    217   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    218 
    219 for.body.lr.ph:                                   ; preds = %entry
    220   br label %for.body
    221 
    222 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    223   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    224   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    225   %0 = load i8, i8* %arrayidx, align 1
    226   %conv = zext i8 %0 to i32
    227   %add = add nsw i32 %conv, 1
    228   %conv1 = trunc i32 %add to i8
    229   store i8 %conv1, i8* %arrayidx, align 1
    230   %inc = add nsw i32 %i.04, 4
    231   %cmp = icmp sle i32 %inc, 9920
    232   br i1 %cmp, label %for.body, label %for.end
    233 
    234 for.end:                                          ; preds = %for.body, %entry
    235   ret void
    236 }
    237 
    238 
    239 
    240 ; CHECK: test_pos8_ri_sle
    241 ; CHECK: bdnz
    242 ; a < b
    243 define void @test_pos8_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    244 entry:
    245   %cmp3 = icmp sle i32 %a, 18924
    246   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    247 
    248 for.body.lr.ph:                                   ; preds = %entry
    249   br label %for.body
    250 
    251 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    252   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    253   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    254   %0 = load i8, i8* %arrayidx, align 1
    255   %conv = zext i8 %0 to i32
    256   %add = add nsw i32 %conv, 1
    257   %conv1 = trunc i32 %add to i8
    258   store i8 %conv1, i8* %arrayidx, align 1
    259   %inc = add nsw i32 %i.04, 8
    260   %cmp = icmp sle i32 %inc, 18924
    261   br i1 %cmp, label %for.body, label %for.end
    262 
    263 for.end:                                          ; preds = %for.body, %entry
    264   ret void
    265 }
    266 
    267 
    268 
    269 ; CHECK: test_pos16_ri_sle
    270 ; CHECK: bdnz
    271 ; a < b
    272 define void @test_pos16_ri_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    273 entry:
    274   %cmp3 = icmp sle i32 %a, 11812
    275   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    276 
    277 for.body.lr.ph:                                   ; preds = %entry
    278   br label %for.body
    279 
    280 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    281   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    282   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    283   %0 = load i8, i8* %arrayidx, align 1
    284   %conv = zext i8 %0 to i32
    285   %add = add nsw i32 %conv, 1
    286   %conv1 = trunc i32 %add to i8
    287   store i8 %conv1, i8* %arrayidx, align 1
    288   %inc = add nsw i32 %i.04, 16
    289   %cmp = icmp sle i32 %inc, 11812
    290   br i1 %cmp, label %for.body, label %for.end
    291 
    292 for.end:                                          ; preds = %for.body, %entry
    293   ret void
    294 }
    295 
    296 
    297 
    298 ; CHECK: test_pos1_rr_sle
    299 ; FIXME: Support this loop!
    300 ; CHECK-NOT: bdnz
    301 ; a < b
    302 define void @test_pos1_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    303 entry:
    304   %cmp3 = icmp sle i32 %a, %b
    305   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    306 
    307 for.body.lr.ph:                                   ; preds = %entry
    308   br label %for.body
    309 
    310 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    311   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    312   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    313   %0 = load i8, i8* %arrayidx, align 1
    314   %conv = zext i8 %0 to i32
    315   %add = add nsw i32 %conv, 1
    316   %conv1 = trunc i32 %add to i8
    317   store i8 %conv1, i8* %arrayidx, align 1
    318   %inc = add nsw i32 %i.04, 1
    319   %cmp = icmp sle i32 %inc, %b
    320   br i1 %cmp, label %for.body, label %for.end
    321 
    322 for.end:                                          ; preds = %for.body, %entry
    323   ret void
    324 }
    325 
    326 
    327 
    328 ; CHECK: test_pos2_rr_sle
    329 ; FIXME: Support this loop!
    330 ; CHECK-NOT: bdnz
    331 ; a < b
    332 define void @test_pos2_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    333 entry:
    334   %cmp3 = icmp sle i32 %a, %b
    335   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    336 
    337 for.body.lr.ph:                                   ; preds = %entry
    338   br label %for.body
    339 
    340 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    341   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    342   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    343   %0 = load i8, i8* %arrayidx, align 1
    344   %conv = zext i8 %0 to i32
    345   %add = add nsw i32 %conv, 1
    346   %conv1 = trunc i32 %add to i8
    347   store i8 %conv1, i8* %arrayidx, align 1
    348   %inc = add nsw i32 %i.04, 2
    349   %cmp = icmp sle i32 %inc, %b
    350   br i1 %cmp, label %for.body, label %for.end
    351 
    352 for.end:                                          ; preds = %for.body, %entry
    353   ret void
    354 }
    355 
    356 
    357 
    358 ; CHECK: test_pos4_rr_sle
    359 ; FIXME: Support this loop!
    360 ; CHECK-NOT: bdnz
    361 ; a < b
    362 define void @test_pos4_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    363 entry:
    364   %cmp3 = icmp sle i32 %a, %b
    365   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    366 
    367 for.body.lr.ph:                                   ; preds = %entry
    368   br label %for.body
    369 
    370 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    371   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    372   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    373   %0 = load i8, i8* %arrayidx, align 1
    374   %conv = zext i8 %0 to i32
    375   %add = add nsw i32 %conv, 1
    376   %conv1 = trunc i32 %add to i8
    377   store i8 %conv1, i8* %arrayidx, align 1
    378   %inc = add nsw i32 %i.04, 4
    379   %cmp = icmp sle i32 %inc, %b
    380   br i1 %cmp, label %for.body, label %for.end
    381 
    382 for.end:                                          ; preds = %for.body, %entry
    383   ret void
    384 }
    385 
    386 
    387 
    388 ; CHECK: test_pos8_rr_sle
    389 ; FIXME: Support this loop!
    390 ; CHECK-NOT: bdnz
    391 ; a < b
    392 define void @test_pos8_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    393 entry:
    394   %cmp3 = icmp sle i32 %a, %b
    395   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    396 
    397 for.body.lr.ph:                                   ; preds = %entry
    398   br label %for.body
    399 
    400 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    401   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    402   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    403   %0 = load i8, i8* %arrayidx, align 1
    404   %conv = zext i8 %0 to i32
    405   %add = add nsw i32 %conv, 1
    406   %conv1 = trunc i32 %add to i8
    407   store i8 %conv1, i8* %arrayidx, align 1
    408   %inc = add nsw i32 %i.04, 8
    409   %cmp = icmp sle i32 %inc, %b
    410   br i1 %cmp, label %for.body, label %for.end
    411 
    412 for.end:                                          ; preds = %for.body, %entry
    413   ret void
    414 }
    415 
    416 
    417 
    418 ; CHECK: test_pos16_rr_sle
    419 ; FIXME: Support this loop!
    420 ; CHECK-NOT: bdnz
    421 ; a < b
    422 define void @test_pos16_rr_sle(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    423 entry:
    424   %cmp3 = icmp sle i32 %a, %b
    425   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    426 
    427 for.body.lr.ph:                                   ; preds = %entry
    428   br label %for.body
    429 
    430 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    431   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    432   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    433   %0 = load i8, i8* %arrayidx, align 1
    434   %conv = zext i8 %0 to i32
    435   %add = add nsw i32 %conv, 1
    436   %conv1 = trunc i32 %add to i8
    437   store i8 %conv1, i8* %arrayidx, align 1
    438   %inc = add nsw i32 %i.04, 16
    439   %cmp = icmp sle i32 %inc, %b
    440   br i1 %cmp, label %for.body, label %for.end
    441 
    442 for.end:                                          ; preds = %for.body, %entry
    443   ret void
    444 }
    445