Home | History | Annotate | Download | only in SystemZ
      1 ; Test 32-bit comparisons in which the second operand is zero-extended
      2 ; from a PC-relative i16.
      3 ;
      4 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      5 
      6 @g = global i16 1
      7 @h = global i16 1, align 1, section "foo"
      8 
      9 ; Check unsigned comparison.
     10 define i32 @f1(i32 %src1) {
     11 ; CHECK-LABEL: f1:
     12 ; CHECK: clhrl %r2, g
     13 ; CHECK-NEXT: jl
     14 ; CHECK: br %r14
     15 entry:
     16   %val = load i16 , i16 *@g
     17   %src2 = zext i16 %val to i32
     18   %cond = icmp ult i32 %src1, %src2
     19   br i1 %cond, label %exit, label %mulb
     20 mulb:
     21   %mul = mul i32 %src1, %src1
     22   br label %exit
     23 exit:
     24   %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
     25   %res = add i32 %tmp, 1
     26   ret i32 %res
     27 }
     28 
     29 ; Check signed comparison.
     30 define i32 @f2(i32 %src1) {
     31 ; CHECK-LABEL: f2:
     32 ; CHECK-NOT: clhrl
     33 ; CHECK: br %r14
     34 entry:
     35   %val = load i16 , i16 *@g
     36   %src2 = zext i16 %val to i32
     37   %cond = icmp slt i32 %src1, %src2
     38   br i1 %cond, label %exit, label %mulb
     39 mulb:
     40   %mul = mul i32 %src1, %src1
     41   br label %exit
     42 exit:
     43   %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
     44   %res = add i32 %tmp, 1
     45   ret i32 %res
     46 }
     47 
     48 ; Check equality.
     49 define i32 @f3(i32 %src1) {
     50 ; CHECK-LABEL: f3:
     51 ; CHECK: clhrl %r2, g
     52 ; CHECK-NEXT: je
     53 ; CHECK: br %r14
     54 entry:
     55   %val = load i16 , i16 *@g
     56   %src2 = zext i16 %val to i32
     57   %cond = icmp eq i32 %src1, %src2
     58   br i1 %cond, label %exit, label %mulb
     59 mulb:
     60   %mul = mul i32 %src1, %src1
     61   br label %exit
     62 exit:
     63   %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
     64   %res = add i32 %tmp, 1
     65   ret i32 %res
     66 }
     67 
     68 ; Check inequality.
     69 define i32 @f4(i32 %src1) {
     70 ; CHECK-LABEL: f4:
     71 ; CHECK: clhrl %r2, g
     72 ; CHECK-NEXT: jlh
     73 ; CHECK: br %r14
     74 entry:
     75   %val = load i16 , i16 *@g
     76   %src2 = zext i16 %val to i32
     77   %cond = icmp ne i32 %src1, %src2
     78   br i1 %cond, label %exit, label %mulb
     79 mulb:
     80   %mul = mul i32 %src1, %src1
     81   br label %exit
     82 exit:
     83   %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
     84   %res = add i32 %tmp, 1
     85   ret i32 %res
     86 }
     87 
     88 ; Repeat f1 with an unaligned address.
     89 define i32 @f5(i32 %src1) {
     90 ; CHECK-LABEL: f5:
     91 ; CHECK: lgrl [[REG:%r[0-5]]], h@GOT
     92 ; CHECK: llh [[VAL:%r[0-5]]], 0([[REG]])
     93 ; CHECK: clrjl %r2, [[VAL]],
     94 ; CHECK: br %r14
     95 entry:
     96   %val = load i16 , i16 *@h, align 1
     97   %src2 = zext i16 %val to i32
     98   %cond = icmp ult i32 %src1, %src2
     99   br i1 %cond, label %exit, label %mulb
    100 mulb:
    101   %mul = mul i32 %src1, %src1
    102   br label %exit
    103 exit:
    104   %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ]
    105   %res = add i32 %tmp, 1
    106   ret i32 %res
    107 }
    108 
    109 ; Check the comparison can be reversed if that allows CLHRL to be used.
    110 define i32 @f6(i32 %src2) {
    111 ; CHECK-LABEL: f6:
    112 ; CHECK: clhrl %r2, g
    113 ; CHECK-NEXT: jh {{\.L.*}}
    114 ; CHECK: br %r14
    115 entry:
    116   %val = load i16 , i16 *@g
    117   %src1 = zext i16 %val to i32
    118   %cond = icmp ult i32 %src1, %src2
    119   br i1 %cond, label %exit, label %mulb
    120 mulb:
    121   %mul = mul i32 %src2, %src2
    122   br label %exit
    123 exit:
    124   %tmp = phi i32 [ %src2, %entry ], [ %mul, %mulb ]
    125   %res = add i32 %tmp, 1
    126   ret i32 %res
    127 }
    128