128 lines · plain
1; Test 64-bit comparisons in which the second operand is zero-extended2; from a PC-relative i16.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6@g = dso_local global i16 17@h = dso_local global i16 1, align 1, section "foo"8 9; Check unsigned comparison.10define dso_local i64 @f1(i64 %src1) {11; CHECK-LABEL: f1:12; CHECK: clghrl %r2, g13; CHECK-NEXT: jl14; CHECK: br %r1415entry:16 %val = load i16, ptr@g17 %src2 = zext i16 %val to i6418 %cond = icmp ult i64 %src1, %src219 br i1 %cond, label %exit, label %mulb20mulb:21 %mul = mul i64 %src1, %src122 br label %exit23exit:24 %tmp = phi i64 [ %src1, %entry ], [ %mul, %mulb ]25 %res = add i64 %tmp, 126 ret i64 %res27}28 29; Check signed comparison.30define dso_local i64 @f2(i64 %src1) {31; CHECK-LABEL: f2:32; CHECK-NOT: clghrl33; CHECK: br %r1434entry:35 %val = load i16, ptr@g36 %src2 = zext i16 %val to i6437 %cond = icmp slt i64 %src1, %src238 br i1 %cond, label %exit, label %mulb39mulb:40 %mul = mul i64 %src1, %src141 br label %exit42exit:43 %tmp = phi i64 [ %src1, %entry ], [ %mul, %mulb ]44 %res = add i64 %tmp, 145 ret i64 %res46}47 48; Check equality.49define dso_local i64 @f3(i64 %src1) {50; CHECK-LABEL: f3:51; CHECK: clghrl %r2, g52; CHECK-NEXT: je53; CHECK: br %r1454entry:55 %val = load i16, ptr@g56 %src2 = zext i16 %val to i6457 %cond = icmp eq i64 %src1, %src258 br i1 %cond, label %exit, label %mulb59mulb:60 %mul = mul i64 %src1, %src161 br label %exit62exit:63 %tmp = phi i64 [ %src1, %entry ], [ %mul, %mulb ]64 %res = add i64 %tmp, 165 ret i64 %res66}67 68; Check inequality.69define dso_local i64 @f4(i64 %src1) {70; CHECK-LABEL: f4:71; CHECK: clghrl %r2, g72; CHECK-NEXT: jlh73; CHECK: br %r1474entry:75 %val = load i16, ptr@g76 %src2 = zext i16 %val to i6477 %cond = icmp ne i64 %src1, %src278 br i1 %cond, label %exit, label %mulb79mulb:80 %mul = mul i64 %src1, %src181 br label %exit82exit:83 %tmp = phi i64 [ %src1, %entry ], [ %mul, %mulb ]84 %res = add i64 %tmp, 185 ret i64 %res86}87 88; Repeat f1 with an unaligned address.89define dso_local i64 @f5(i64 %src1) {90; CHECK-LABEL: f5:91; CHECK: lgrl [[REG:%r[0-5]]], h@GOT92; CHECK: llgh [[VAL:%r[0-5]]], 0([[REG]])93; CHECK: clgrjl %r2, [[VAL]],94; CHECK: br %r1495entry:96 %val = load i16, ptr@h, align 197 %src2 = zext i16 %val to i6498 %cond = icmp ult i64 %src1, %src299 br i1 %cond, label %exit, label %mulb100mulb:101 %mul = mul i64 %src1, %src1102 br label %exit103exit:104 %tmp = phi i64 [ %src1, %entry ], [ %mul, %mulb ]105 %res = add i64 %tmp, 1106 ret i64 %res107}108 109; Check the comparison can be reversed if that allows CLGHRL to be used.110define dso_local i64 @f6(i64 %src2) {111; CHECK-LABEL: f6:112; CHECK: clghrl %r2, g113; CHECK-NEXT: jh {{\.L.*}}114; CHECK: br %r14115entry:116 %val = load i16, ptr@g117 %src1 = zext i16 %val to i64118 %cond = icmp ult i64 %src1, %src2119 br i1 %cond, label %exit, label %mulb120mulb:121 %mul = mul i64 %src2, %src2122 br label %exit123exit:124 %tmp = phi i64 [ %src2, %entry ], [ %mul, %mulb ]125 %res = add i64 %tmp, 1126 ret i64 %res127}128