Home | History | Annotate | Download | only in SystemZ
      1 ; Test LOCHI and LOCGHI.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z13 -verify-machineinstrs | FileCheck %s
      4 
      5 define i32 @f1(i32 %x) {
      6 ; CHECK-LABEL: f1:
      7 ; CHECK: chi %r2, 0
      8 ; CHECK: lhi %r2, 0
      9 ; CHECK: lochilh %r2, 42
     10 ; CHECK: br %r14
     11   %cond = icmp ne i32 %x, 0
     12   %res = select i1 %cond, i32 42, i32 0
     13   ret i32 %res
     14 }
     15 
     16 define i32 @f2(i32 %x, i32 %y) {
     17 ; CHECK-LABEL: f2:
     18 ; CHECK: chi %r2, 0
     19 ; CHECK: lochilh %r3, 42
     20 ; CHECK: br %r14
     21   %cond = icmp ne i32 %x, 0
     22   %res = select i1 %cond, i32 42, i32 %y
     23   ret i32 %res
     24 }
     25 
     26 define i32 @f3(i32 %x, i32 %y) {
     27 ; CHECK-LABEL: f3:
     28 ; CHECK: chi %r2, 0
     29 ; CHECK: lochie %r3, 42
     30 ; CHECK: br %r14
     31   %cond = icmp ne i32 %x, 0
     32   %res = select i1 %cond, i32 %y, i32 42
     33   ret i32 %res
     34 }
     35 
     36 define i64 @f4(i64 %x) {
     37 ; CHECK-LABEL: f4:
     38 ; CHECK: cghi %r2, 0
     39 ; CHECK: lghi %r2, 0
     40 ; CHECK: locghilh %r2, 42
     41 ; CHECK: br %r14
     42   %cond = icmp ne i64 %x, 0
     43   %res = select i1 %cond, i64 42, i64 0
     44   ret i64 %res
     45 }
     46 
     47 define i64 @f5(i64 %x, i64 %y) {
     48 ; CHECK-LABEL: f5:
     49 ; CHECK: cghi %r2, 0
     50 ; CHECK: locghilh %r3, 42
     51 ; CHECK: br %r14
     52   %cond = icmp ne i64 %x, 0
     53   %res = select i1 %cond, i64 42, i64 %y
     54   ret i64 %res
     55 }
     56 
     57 define i64 @f6(i64 %x, i64 %y) {
     58 ; CHECK-LABEL: f6:
     59 ; CHECK: cghi %r2, 0
     60 ; CHECK: locghie %r3, 42
     61 ; CHECK: br %r14
     62   %cond = icmp ne i64 %x, 0
     63   %res = select i1 %cond, i64 %y, i64 42
     64   ret i64 %res
     65 }
     66 
     67 ; Check that we also get LOCHI as a result of early if-conversion.
     68 define i32 @f7(i32 %x, i32 %y) {
     69 ; CHECK-LABEL: f7:
     70 ; CHECK: chi %r2, 0
     71 ; CHECK: lochie %r3, 42
     72 ; CHECK: br %r14
     73 entry:
     74   %cond = icmp ne i32 %x, 0
     75   br i1 %cond, label %if.then, label %return
     76 
     77 if.then:
     78   br label %return
     79 
     80 return:
     81   %res = phi i32 [ %y, %if.then ], [ 42, %entry ]
     82   ret i32 %res
     83 }
     84 
     85 ; ... and the same for LOCGHI.
     86 define i64 @f8(i64 %x, i64 %y) {
     87 ; CHECK-LABEL: f8:
     88 ; CHECK: cghi %r2, 0
     89 ; CHECK: locghie %r3, 42
     90 ; CHECK: br %r14
     91 entry:
     92   %cond = icmp ne i64 %x, 0
     93   br i1 %cond, label %if.then, label %return
     94 
     95 if.then:
     96   br label %return
     97 
     98 return:
     99   %res = phi i64 [ %y, %if.then ], [ 42, %entry ]
    100   ret i64 %res
    101 }
    102 
    103 ; Check that inverting the condition works as well.
    104 define i32 @f9(i32 %x, i32 %y) {
    105 ; CHECK-LABEL: f9:
    106 ; CHECK: chi %r2, 0
    107 ; CHECK: lochilh %r3, 42
    108 ; CHECK: br %r14
    109 entry:
    110   %cond = icmp ne i32 %x, 0
    111   br i1 %cond, label %if.then, label %return
    112 
    113 if.then:
    114   br label %return
    115 
    116 return:
    117   %res = phi i32 [ 42, %if.then ], [ %y, %entry ]
    118   ret i32 %res
    119 }
    120 
    121 ; ... and the same for LOCGHI.
    122 define i64 @f10(i64 %x, i64 %y) {
    123 ; CHECK-LABEL: f10:
    124 ; CHECK: cghi %r2, 0
    125 ; CHECK: locghilh %r3, 42
    126 ; CHECK: br %r14
    127 entry:
    128   %cond = icmp ne i64 %x, 0
    129   br i1 %cond, label %if.then, label %return
    130 
    131 if.then:
    132   br label %return
    133 
    134 return:
    135   %res = phi i64 [ 42, %if.then ], [ %y, %entry ]
    136   ret i64 %res
    137 }
    138 
    139