Home | History | Annotate | Download | only in SystemZ
      1 ; Test conditional sibling calls.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      4 
      5 declare void @fun_a()
      6 declare void @fun_b()
      7 declare void @fun_c(i32)
      8 
      9 @var = global i32 1;
     10 
     11 ; Check a conditional sibling call.
     12 define void @f1(i32 %val1, i32 %val2) {
     13 ; CHECK-LABEL: f1:
     14 ; CHECK: cr %r2, %r3
     15 ; CHECK: jgl fun_a@PLT
     16 ; CHECK: br %r14
     17   %cond = icmp slt i32 %val1, %val2;
     18   br i1 %cond, label %a, label %b;
     19 
     20 a:
     21   tail call void @fun_a()
     22   ret void
     23 
     24 b:
     25   store i32 1, i32 *@var;
     26   ret void
     27 }
     28 
     29 ; Check a conditional sibling call when there are two possibilities.
     30 define void @f2(i32 %val1, i32 %val2) {
     31 ; CHECK-LABEL: f2:
     32 ; CHECK: cr %r2, %r3
     33 ; CHECK: jghe fun_b@PLT
     34 ; CHECK: jg fun_a@PLT
     35   %cond = icmp slt i32 %val1, %val2;
     36   br i1 %cond, label %a, label %b;
     37 
     38 a:
     39   tail call void @fun_a()
     40   ret void
     41 
     42 b:
     43   tail call void @fun_b()
     44   ret void
     45 }
     46 
     47 ; Check a conditional sibling call with an argument - not supported.
     48 define void @f3(i32 %val1, i32 %val2) {
     49 ; CHECK-LABEL: f3:
     50 ; CHECK: crjhe %r2, %r3
     51 ; CHECK: jg fun_c@PLT
     52 ; CHECK: br %r14
     53   %cond = icmp slt i32 %val1, %val2;
     54   br i1 %cond, label %a, label %b;
     55 
     56 a:
     57   tail call void @fun_c(i32 1)
     58   ret void
     59 
     60 b:
     61   store i32 1, i32 *@var;
     62   ret void
     63 }
     64 
     65 ; Check a conditional sibling call - unsigned compare.
     66 define void @f4(i32 %val1, i32 %val2) {
     67 ; CHECK-LABEL: f4:
     68 ; CHECK: clr %r2, %r3
     69 ; CHECK: jgl fun_a@PLT
     70 ; CHECK: br %r14
     71   %cond = icmp ult i32 %val1, %val2;
     72   br i1 %cond, label %a, label %b;
     73 
     74 a:
     75   tail call void @fun_a()
     76   ret void
     77 
     78 b:
     79   store i32 1, i32 *@var;
     80   ret void
     81 }
     82 
     83 ; Check a conditional sibling call - 64-bit compare.
     84 define void @f5(i64 %val1, i64 %val2) {
     85 ; CHECK-LABEL: f5:
     86 ; CHECK: cgr %r2, %r3
     87 ; CHECK: jgl fun_a@PLT
     88 ; CHECK: br %r14
     89   %cond = icmp slt i64 %val1, %val2;
     90   br i1 %cond, label %a, label %b;
     91 
     92 a:
     93   tail call void @fun_a()
     94   ret void
     95 
     96 b:
     97   store i32 1, i32 *@var;
     98   ret void
     99 }
    100 
    101 ; Check a conditional sibling call - unsigned 64-bit compare.
    102 define void @f6(i64 %val1, i64 %val2) {
    103 ; CHECK-LABEL: f6:
    104 ; CHECK: clgr %r2, %r3
    105 ; CHECK: jgl fun_a@PLT
    106 ; CHECK: br %r14
    107   %cond = icmp ult i64 %val1, %val2;
    108   br i1 %cond, label %a, label %b;
    109 
    110 a:
    111   tail call void @fun_a()
    112   ret void
    113 
    114 b:
    115   store i32 1, i32 *@var;
    116   ret void
    117 }
    118 
    119 ; Check a conditional sibling call - less-equal compare.
    120 define void @f7(i32 %val1, i32 %val2) {
    121 ; CHECK-LABEL: f7:
    122 ; CHECK: cr %r2, %r3
    123 ; CHECK: jgle fun_a@PLT
    124 ; CHECK: br %r14
    125   %cond = icmp sle i32 %val1, %val2;
    126   br i1 %cond, label %a, label %b;
    127 
    128 a:
    129   tail call void @fun_a()
    130   ret void
    131 
    132 b:
    133   store i32 1, i32 *@var;
    134   ret void
    135 }
    136 
    137 ; Check a conditional sibling call - high compare.
    138 define void @f8(i32 %val1, i32 %val2) {
    139 ; CHECK-LABEL: f8:
    140 ; CHECK: cr %r2, %r3
    141 ; CHECK: jgh fun_a@PLT
    142 ; CHECK: br %r14
    143   %cond = icmp sgt i32 %val1, %val2;
    144   br i1 %cond, label %a, label %b;
    145 
    146 a:
    147   tail call void @fun_a()
    148   ret void
    149 
    150 b:
    151   store i32 1, i32 *@var;
    152   ret void
    153 }
    154 
    155 ; Check a conditional sibling call - high-equal compare.
    156 define void @f9(i32 %val1, i32 %val2) {
    157 ; CHECK-LABEL: f9:
    158 ; CHECK: cr %r2, %r3
    159 ; CHECK: jghe fun_a@PLT
    160 ; CHECK: br %r14
    161   %cond = icmp sge i32 %val1, %val2;
    162   br i1 %cond, label %a, label %b;
    163 
    164 a:
    165   tail call void @fun_a()
    166   ret void
    167 
    168 b:
    169   store i32 1, i32 *@var;
    170   ret void
    171 }
    172 
    173 ; Check a conditional sibling call - equal compare.
    174 define void @f10(i32 %val1, i32 %val2) {
    175 ; CHECK-LABEL: f10:
    176 ; CHECK: cr %r2, %r3
    177 ; CHECK: jge fun_a@PLT
    178 ; CHECK: br %r14
    179   %cond = icmp eq i32 %val1, %val2;
    180   br i1 %cond, label %a, label %b;
    181 
    182 a:
    183   tail call void @fun_a()
    184   ret void
    185 
    186 b:
    187   store i32 1, i32 *@var;
    188   ret void
    189 }
    190 
    191 ; Check a conditional sibling call - unequal compare.
    192 define void @f11(i32 %val1, i32 %val2) {
    193 ; CHECK-LABEL: f11:
    194 ; CHECK: cr %r2, %r3
    195 ; CHECK: jglh fun_a@PLT
    196 ; CHECK: br %r14
    197   %cond = icmp ne i32 %val1, %val2;
    198   br i1 %cond, label %a, label %b;
    199 
    200 a:
    201   tail call void @fun_a()
    202   ret void
    203 
    204 b:
    205   store i32 1, i32 *@var;
    206   ret void
    207 }
    208 
    209 ; Check a conditional sibling call - immediate slt.
    210 define void @f12(i32 %val1) {
    211 ; CHECK-LABEL: f12:
    212 ; CHECK: chi %r2, 4
    213 ; CHECK: jgle fun_a@PLT
    214 ; CHECK: br %r14
    215   %cond = icmp slt i32 %val1, 5;
    216   br i1 %cond, label %a, label %b;
    217 
    218 a:
    219   tail call void @fun_a()
    220   ret void
    221 
    222 b:
    223   store i32 1, i32 *@var;
    224   ret void
    225 }
    226 
    227 ; Check a conditional sibling call - immediate sle.
    228 define void @f13(i32 %val1) {
    229 ; CHECK-LABEL: f13:
    230 ; CHECK: chi %r2, 5
    231 ; CHECK: jgle fun_a@PLT
    232 ; CHECK: br %r14
    233   %cond = icmp sle i32 %val1, 5;
    234   br i1 %cond, label %a, label %b;
    235 
    236 a:
    237   tail call void @fun_a()
    238   ret void
    239 
    240 b:
    241   store i32 1, i32 *@var;
    242   ret void
    243 }
    244 
    245 ; Check a conditional sibling call - immediate sgt.
    246 define void @f14(i32 %val1) {
    247 ; CHECK-LABEL: f14:
    248 ; CHECK: chi %r2, 6
    249 ; CHECK: jghe fun_a@PLT
    250 ; CHECK: br %r14
    251   %cond = icmp sgt i32 %val1, 5;
    252   br i1 %cond, label %a, label %b;
    253 
    254 a:
    255   tail call void @fun_a()
    256   ret void
    257 
    258 b:
    259   store i32 1, i32 *@var;
    260   ret void
    261 }
    262 
    263 ; Check a conditional sibling call - immediate sge.
    264 define void @f15(i32 %val1) {
    265 ; CHECK-LABEL: f15:
    266 ; CHECK: chi %r2, 5
    267 ; CHECK: jghe fun_a@PLT
    268 ; CHECK: br %r14
    269   %cond = icmp sge i32 %val1, 5;
    270   br i1 %cond, label %a, label %b;
    271 
    272 a:
    273   tail call void @fun_a()
    274   ret void
    275 
    276 b:
    277   store i32 1, i32 *@var;
    278   ret void
    279 }
    280 
    281 ; Check a conditional sibling call - immediate eq.
    282 define void @f16(i32 %val1) {
    283 ; CHECK-LABEL: f16:
    284 ; CHECK: chi %r2, 5
    285 ; CHECK: jge fun_a@PLT
    286 ; CHECK: br %r14
    287   %cond = icmp eq i32 %val1, 5;
    288   br i1 %cond, label %a, label %b;
    289 
    290 a:
    291   tail call void @fun_a()
    292   ret void
    293 
    294 b:
    295   store i32 1, i32 *@var;
    296   ret void
    297 }
    298 
    299 ; Check a conditional sibling call - immediate ne.
    300 define void @f17(i32 %val1) {
    301 ; CHECK-LABEL: f17:
    302 ; CHECK: chi %r2, 5
    303 ; CHECK: jglh fun_a@PLT
    304 ; CHECK: br %r14
    305   %cond = icmp ne i32 %val1, 5;
    306   br i1 %cond, label %a, label %b;
    307 
    308 a:
    309   tail call void @fun_a()
    310   ret void
    311 
    312 b:
    313   store i32 1, i32 *@var;
    314   ret void
    315 }
    316 
    317 ; Check a conditional sibling call - immediate ult.
    318 define void @f18(i32 %val1) {
    319 ; CHECK-LABEL: f18:
    320 ; CHECK: clfi %r2, 4
    321 ; CHECK: jgle fun_a@PLT
    322 ; CHECK: br %r14
    323   %cond = icmp ult i32 %val1, 5;
    324   br i1 %cond, label %a, label %b;
    325 
    326 a:
    327   tail call void @fun_a()
    328   ret void
    329 
    330 b:
    331   store i32 1, i32 *@var;
    332   ret void
    333 }
    334 
    335 ; Check a conditional sibling call - immediate 64-bit slt.
    336 define void @f19(i64 %val1) {
    337 ; CHECK-LABEL: f19:
    338 ; CHECK: cghi %r2, 4
    339 ; CHECK: jgle fun_a@PLT
    340 ; CHECK: br %r14
    341   %cond = icmp slt i64 %val1, 5;
    342   br i1 %cond, label %a, label %b;
    343 
    344 a:
    345   tail call void @fun_a()
    346   ret void
    347 
    348 b:
    349   store i32 1, i32 *@var;
    350   ret void
    351 }
    352 
    353 ; Check a conditional sibling call - immediate 64-bit ult.
    354 define void @f20(i64 %val1) {
    355 ; CHECK-LABEL: f20:
    356 ; CHECK: clgfi %r2, 4
    357 ; CHECK: jgle fun_a@PLT
    358 ; CHECK: br %r14
    359   %cond = icmp ult i64 %val1, 5;
    360   br i1 %cond, label %a, label %b;
    361 
    362 a:
    363   tail call void @fun_a()
    364   ret void
    365 
    366 b:
    367   store i32 1, i32 *@var;
    368   ret void
    369 }
    370