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. 10define i32 @f1(i32 %src1) { 11; CHECK-LABEL: f1: 12; CHECK: clhrl %r2, g 13; CHECK-NEXT: jl 14; CHECK: br %r14 15entry: 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 20mulb: 21 %mul = mul i32 %src1, %src1 22 br label %exit 23exit: 24 %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 25 %res = add i32 %tmp, 1 26 ret i32 %res 27} 28 29; Check signed comparison. 30define i32 @f2(i32 %src1) { 31; CHECK-LABEL: f2: 32; CHECK-NOT: clhrl 33; CHECK: br %r14 34entry: 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 39mulb: 40 %mul = mul i32 %src1, %src1 41 br label %exit 42exit: 43 %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 44 %res = add i32 %tmp, 1 45 ret i32 %res 46} 47 48; Check equality. 49define i32 @f3(i32 %src1) { 50; CHECK-LABEL: f3: 51; CHECK: clhrl %r2, g 52; CHECK-NEXT: je 53; CHECK: br %r14 54entry: 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 59mulb: 60 %mul = mul i32 %src1, %src1 61 br label %exit 62exit: 63 %tmp = phi i32 [ %src1, %entry ], [ %mul, %mulb ] 64 %res = add i32 %tmp, 1 65 ret i32 %res 66} 67 68; Check inequality. 69define i32 @f4(i32 %src1) { 70; CHECK-LABEL: f4: 71; CHECK: clhrl %r2, g 72; CHECK-NEXT: jlh 73; CHECK: br %r14 74entry: 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 79mulb: 80 %mul = mul i32 %src1, %src1 81 br label %exit 82exit: 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. 89define 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 95entry: 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 100mulb: 101 %mul = mul i32 %src1, %src1 102 br label %exit 103exit: 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. 110define i32 @f6(i32 %src2) { 111; CHECK-LABEL: f6: 112; CHECK: clhrl %r2, g 113; CHECK-NEXT: jh {{\.L.*}} 114; CHECK: br %r14 115entry: 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 120mulb: 121 %mul = mul i32 %src2, %src2 122 br label %exit 123exit: 124 %tmp = phi i32 [ %src2, %entry ], [ %mul, %mulb ] 125 %res = add i32 %tmp, 1 126 ret i32 %res 127} 128