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_slt
      9 ; CHECK: bdnz
     10 ; a < b
     11 define void @test_pos1_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     12 entry:
     13   %cmp3 = icmp slt i32 8531, %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 [ 8531, %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 slt 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_slt
     38 ; FIXME: Support this loop!
     39 ; CHECK: bdnz
     40 ; a < b
     41 define void @test_pos2_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     42 entry:
     43   %cmp3 = icmp slt i32 9152, %b
     44   br i1 %cmp3, label %for.body.lr.ph, label %for.end
     45 
     46 for.body.lr.ph:                                   ; preds = %entry
     47   br label %for.body
     48 
     49 for.body:                                         ; preds = %for.body.lr.ph, %for.body
     50   %i.04 = phi i32 [ 9152, %for.body.lr.ph ], [ %inc, %for.body ]
     51   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
     52   %0 = load i8, i8* %arrayidx, align 1
     53   %conv = zext i8 %0 to i32
     54   %add = add nsw i32 %conv, 1
     55   %conv1 = trunc i32 %add to i8
     56   store i8 %conv1, i8* %arrayidx, align 1
     57   %inc = add nsw i32 %i.04, 2
     58   %cmp = icmp slt i32 %inc, %b
     59   br i1 %cmp, label %for.body, label %for.end
     60 
     61 for.end:                                          ; preds = %for.body, %entry
     62   ret void
     63 }
     64 
     65 
     66 
     67 ; CHECK: test_pos4_ir_slt
     68 ; FIXME: Support this loop!
     69 ; CHECK: bdnz
     70 ; a < b
     71 define void @test_pos4_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
     72 entry:
     73   %cmp3 = icmp slt i32 18851, %b
     74   br i1 %cmp3, label %for.body.lr.ph, label %for.end
     75 
     76 for.body.lr.ph:                                   ; preds = %entry
     77   br label %for.body
     78 
     79 for.body:                                         ; preds = %for.body.lr.ph, %for.body
     80   %i.04 = phi i32 [ 18851, %for.body.lr.ph ], [ %inc, %for.body ]
     81   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
     82   %0 = load i8, i8* %arrayidx, align 1
     83   %conv = zext i8 %0 to i32
     84   %add = add nsw i32 %conv, 1
     85   %conv1 = trunc i32 %add to i8
     86   store i8 %conv1, i8* %arrayidx, align 1
     87   %inc = add nsw i32 %i.04, 4
     88   %cmp = icmp slt i32 %inc, %b
     89   br i1 %cmp, label %for.body, label %for.end
     90 
     91 for.end:                                          ; preds = %for.body, %entry
     92   ret void
     93 }
     94 
     95 
     96 
     97 ; CHECK: test_pos8_ir_slt
     98 ; CHECK: bdnz
     99 ; a < b
    100 define void @test_pos8_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    101 entry:
    102   %cmp3 = icmp slt i32 25466, %b
    103   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    104 
    105 for.body.lr.ph:                                   ; preds = %entry
    106   br label %for.body
    107 
    108 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    109   %i.04 = phi i32 [ 25466, %for.body.lr.ph ], [ %inc, %for.body ]
    110   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    111   %0 = load i8, i8* %arrayidx, align 1
    112   %conv = zext i8 %0 to i32
    113   %add = add nsw i32 %conv, 1
    114   %conv1 = trunc i32 %add to i8
    115   store i8 %conv1, i8* %arrayidx, align 1
    116   %inc = add nsw i32 %i.04, 8
    117   %cmp = icmp slt i32 %inc, %b
    118   br i1 %cmp, label %for.body, label %for.end
    119 
    120 for.end:                                          ; preds = %for.body, %entry
    121   ret void
    122 }
    123 
    124 
    125 
    126 ; CHECK: test_pos16_ir_slt
    127 ; CHECK: bdnz
    128 ; a < b
    129 define void @test_pos16_ir_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    130 entry:
    131   %cmp3 = icmp slt i32 9295, %b
    132   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    133 
    134 for.body.lr.ph:                                   ; preds = %entry
    135   br label %for.body
    136 
    137 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    138   %i.04 = phi i32 [ 9295, %for.body.lr.ph ], [ %inc, %for.body ]
    139   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    140   %0 = load i8, i8* %arrayidx, align 1
    141   %conv = zext i8 %0 to i32
    142   %add = add nsw i32 %conv, 1
    143   %conv1 = trunc i32 %add to i8
    144   store i8 %conv1, i8* %arrayidx, align 1
    145   %inc = add nsw i32 %i.04, 16
    146   %cmp = icmp slt i32 %inc, %b
    147   br i1 %cmp, label %for.body, label %for.end
    148 
    149 for.end:                                          ; preds = %for.body, %entry
    150   ret void
    151 }
    152 
    153 
    154 
    155 ; CHECK: test_pos1_ri_slt
    156 ; CHECK: bdnz
    157 ; a < b
    158 define void @test_pos1_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    159 entry:
    160   %cmp3 = icmp slt i32 %a, 31236
    161   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    162 
    163 for.body.lr.ph:                                   ; preds = %entry
    164   br label %for.body
    165 
    166 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    167   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    168   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    169   %0 = load i8, i8* %arrayidx, align 1
    170   %conv = zext i8 %0 to i32
    171   %add = add nsw i32 %conv, 1
    172   %conv1 = trunc i32 %add to i8
    173   store i8 %conv1, i8* %arrayidx, align 1
    174   %inc = add nsw i32 %i.04, 1
    175   %cmp = icmp slt i32 %inc, 31236
    176   br i1 %cmp, label %for.body, label %for.end
    177 
    178 for.end:                                          ; preds = %for.body, %entry
    179   ret void
    180 }
    181 
    182 
    183 
    184 ; CHECK: test_pos2_ri_slt
    185 ; CHECK: bdnz
    186 ; a < b
    187 define void @test_pos2_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    188 entry:
    189   %cmp3 = icmp slt i32 %a, 22653
    190   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    191 
    192 for.body.lr.ph:                                   ; preds = %entry
    193   br label %for.body
    194 
    195 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    196   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    197   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    198   %0 = load i8, i8* %arrayidx, align 1
    199   %conv = zext i8 %0 to i32
    200   %add = add nsw i32 %conv, 1
    201   %conv1 = trunc i32 %add to i8
    202   store i8 %conv1, i8* %arrayidx, align 1
    203   %inc = add nsw i32 %i.04, 2
    204   %cmp = icmp slt i32 %inc, 22653
    205   br i1 %cmp, label %for.body, label %for.end
    206 
    207 for.end:                                          ; preds = %for.body, %entry
    208   ret void
    209 }
    210 
    211 
    212 
    213 ; CHECK: test_pos4_ri_slt
    214 ; CHECK: bdnz
    215 ; a < b
    216 define void @test_pos4_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    217 entry:
    218   %cmp3 = icmp slt i32 %a, 1431
    219   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    220 
    221 for.body.lr.ph:                                   ; preds = %entry
    222   br label %for.body
    223 
    224 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    225   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    226   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    227   %0 = load i8, i8* %arrayidx, align 1
    228   %conv = zext i8 %0 to i32
    229   %add = add nsw i32 %conv, 1
    230   %conv1 = trunc i32 %add to i8
    231   store i8 %conv1, i8* %arrayidx, align 1
    232   %inc = add nsw i32 %i.04, 4
    233   %cmp = icmp slt i32 %inc, 1431
    234   br i1 %cmp, label %for.body, label %for.end
    235 
    236 for.end:                                          ; preds = %for.body, %entry
    237   ret void
    238 }
    239 
    240 
    241 
    242 ; CHECK: test_pos8_ri_slt
    243 ; CHECK: bdnz
    244 ; a < b
    245 define void @test_pos8_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    246 entry:
    247   %cmp3 = icmp slt i32 %a, 22403
    248   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    249 
    250 for.body.lr.ph:                                   ; preds = %entry
    251   br label %for.body
    252 
    253 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    254   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    255   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    256   %0 = load i8, i8* %arrayidx, align 1
    257   %conv = zext i8 %0 to i32
    258   %add = add nsw i32 %conv, 1
    259   %conv1 = trunc i32 %add to i8
    260   store i8 %conv1, i8* %arrayidx, align 1
    261   %inc = add nsw i32 %i.04, 8
    262   %cmp = icmp slt i32 %inc, 22403
    263   br i1 %cmp, label %for.body, label %for.end
    264 
    265 for.end:                                          ; preds = %for.body, %entry
    266   ret void
    267 }
    268 
    269 
    270 
    271 ; CHECK: test_pos16_ri_slt
    272 ; CHECK: bdnz
    273 ; a < b
    274 define void @test_pos16_ri_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    275 entry:
    276   %cmp3 = icmp slt i32 %a, 21715
    277   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    278 
    279 for.body.lr.ph:                                   ; preds = %entry
    280   br label %for.body
    281 
    282 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    283   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    284   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    285   %0 = load i8, i8* %arrayidx, align 1
    286   %conv = zext i8 %0 to i32
    287   %add = add nsw i32 %conv, 1
    288   %conv1 = trunc i32 %add to i8
    289   store i8 %conv1, i8* %arrayidx, align 1
    290   %inc = add nsw i32 %i.04, 16
    291   %cmp = icmp slt i32 %inc, 21715
    292   br i1 %cmp, label %for.body, label %for.end
    293 
    294 for.end:                                          ; preds = %for.body, %entry
    295   ret void
    296 }
    297 
    298 
    299 
    300 ; CHECK: test_pos1_rr_slt
    301 ; CHECK: bdnz
    302 ; a < b
    303 define void @test_pos1_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    304 entry:
    305   %cmp3 = icmp slt i32 %a, %b
    306   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    307 
    308 for.body.lr.ph:                                   ; preds = %entry
    309   br label %for.body
    310 
    311 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    312   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    313   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    314   %0 = load i8, i8* %arrayidx, align 1
    315   %conv = zext i8 %0 to i32
    316   %add = add nsw i32 %conv, 1
    317   %conv1 = trunc i32 %add to i8
    318   store i8 %conv1, i8* %arrayidx, align 1
    319   %inc = add nsw i32 %i.04, 1
    320   %cmp = icmp slt i32 %inc, %b
    321   br i1 %cmp, label %for.body, label %for.end
    322 
    323 for.end:                                          ; preds = %for.body, %entry
    324   ret void
    325 }
    326 
    327 
    328 
    329 ; CHECK: test_pos2_rr_slt
    330 ; CHECK: bdnz
    331 ; a < b
    332 define void @test_pos2_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    333 entry:
    334   %cmp3 = icmp slt 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 slt 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_slt
    359 ; CHECK: bdnz
    360 ; a < b
    361 define void @test_pos4_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    362 entry:
    363   %cmp3 = icmp slt i32 %a, %b
    364   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    365 
    366 for.body.lr.ph:                                   ; preds = %entry
    367   br label %for.body
    368 
    369 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    370   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    371   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    372   %0 = load i8, i8* %arrayidx, align 1
    373   %conv = zext i8 %0 to i32
    374   %add = add nsw i32 %conv, 1
    375   %conv1 = trunc i32 %add to i8
    376   store i8 %conv1, i8* %arrayidx, align 1
    377   %inc = add nsw i32 %i.04, 4
    378   %cmp = icmp slt i32 %inc, %b
    379   br i1 %cmp, label %for.body, label %for.end
    380 
    381 for.end:                                          ; preds = %for.body, %entry
    382   ret void
    383 }
    384 
    385 
    386 
    387 ; CHECK: test_pos8_rr_slt
    388 ; CHECK: bdnz
    389 ; a < b
    390 define void @test_pos8_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    391 entry:
    392   %cmp3 = icmp slt i32 %a, %b
    393   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    394 
    395 for.body.lr.ph:                                   ; preds = %entry
    396   br label %for.body
    397 
    398 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    399   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    400   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    401   %0 = load i8, i8* %arrayidx, align 1
    402   %conv = zext i8 %0 to i32
    403   %add = add nsw i32 %conv, 1
    404   %conv1 = trunc i32 %add to i8
    405   store i8 %conv1, i8* %arrayidx, align 1
    406   %inc = add nsw i32 %i.04, 8
    407   %cmp = icmp slt i32 %inc, %b
    408   br i1 %cmp, label %for.body, label %for.end
    409 
    410 for.end:                                          ; preds = %for.body, %entry
    411   ret void
    412 }
    413 
    414 
    415 
    416 ; CHECK: test_pos16_rr_slt
    417 ; CHECK: bdnz
    418 ; a < b
    419 define void @test_pos16_rr_slt(i8* nocapture %p, i32 %a, i32 %b) nounwind {
    420 entry:
    421   %cmp3 = icmp slt i32 %a, %b
    422   br i1 %cmp3, label %for.body.lr.ph, label %for.end
    423 
    424 for.body.lr.ph:                                   ; preds = %entry
    425   br label %for.body
    426 
    427 for.body:                                         ; preds = %for.body.lr.ph, %for.body
    428   %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ]
    429   %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04
    430   %0 = load i8, i8* %arrayidx, align 1
    431   %conv = zext i8 %0 to i32
    432   %add = add nsw i32 %conv, 1
    433   %conv1 = trunc i32 %add to i8
    434   store i8 %conv1, i8* %arrayidx, align 1
    435   %inc = add nsw i32 %i.04, 16
    436   %cmp = icmp slt i32 %inc, %b
    437   br i1 %cmp, label %for.body, label %for.end
    438 
    439 for.end:                                          ; preds = %for.body, %entry
    440   ret void
    441 }
    442