122 lines · plain
1; Test 64-bit comparisons in which the second operand is sign-extended2; from a PC-relative i32.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6@g = dso_local global i32 17@h = dso_local global i32 1, align 2, section "foo"8 9; Check signed comparison.10define dso_local i64 @f1(i64 %src1) {11; CHECK-LABEL: f1:12; CHECK: cgfrl %r2, g13; CHECK-NEXT: blr %r1414; CHECK: br %r1415entry:16 %val = load i32, ptr@g17 %src2 = sext i32 %val to i6418 %cond = icmp slt i64 %src1, %src219 br i1 %cond, label %exit, label %mulb20mulb:21 %mul = mul i64 %src1, %src122 br label %exit23exit:24 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]25 ret i64 %res26}27 28; Check unsigned comparison, which cannot use CHRL.29define dso_local i64 @f2(i64 %src1) {30; CHECK-LABEL: f2:31; CHECK-NOT: cgfrl32; CHECK: br %r1433entry:34 %val = load i32, ptr@g35 %src2 = sext i32 %val to i6436 %cond = icmp ult i64 %src1, %src237 br i1 %cond, label %exit, label %mulb38mulb:39 %mul = mul i64 %src1, %src140 br label %exit41exit:42 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]43 ret i64 %res44}45 46; Check equality.47define dso_local i64 @f3(i64 %src1) {48; CHECK-LABEL: f3:49; CHECK: cgfrl %r2, g50; CHECK-NEXT: ber %r1451; CHECK: br %r1452entry:53 %val = load i32, ptr@g54 %src2 = sext i32 %val to i6455 %cond = icmp eq i64 %src1, %src256 br i1 %cond, label %exit, label %mulb57mulb:58 %mul = mul i64 %src1, %src159 br label %exit60exit:61 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]62 ret i64 %res63}64 65; Check inequality.66define dso_local i64 @f4(i64 %src1) {67; CHECK-LABEL: f4:68; CHECK: cgfrl %r2, g69; CHECK-NEXT: blhr %r1470; CHECK: br %r1471entry:72 %val = load i32, ptr@g73 %src2 = sext i32 %val to i6474 %cond = icmp ne i64 %src1, %src275 br i1 %cond, label %exit, label %mulb76mulb:77 %mul = mul i64 %src1, %src178 br label %exit79exit:80 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]81 ret i64 %res82}83 84; Repeat f1 with an unaligned address.85define dso_local i64 @f5(i64 %src1) {86; CHECK-LABEL: f5:87; CHECK: larl [[REG:%r[0-5]]], h88; CHECK: cgf %r2, 0([[REG]])89; CHECK-NEXT: blr %r1490; CHECK: br %r1491entry:92 %val = load i32, ptr@h, align 293 %src2 = sext i32 %val to i6494 %cond = icmp slt i64 %src1, %src295 br i1 %cond, label %exit, label %mulb96mulb:97 %mul = mul i64 %src1, %src198 br label %exit99exit:100 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]101 ret i64 %res102}103 104; Check the comparison can be reversed if that allows CGFRL to be used.105define dso_local i64 @f6(i64 %src2) {106; CHECK-LABEL: f6:107; CHECK: cgfrl %r2, g108; CHECK-NEXT: bhr %r14109; CHECK: br %r14110entry:111 %val = load i32, ptr@g112 %src1 = sext i32 %val to i64113 %cond = icmp slt i64 %src1, %src2114 br i1 %cond, label %exit, label %mulb115mulb:116 %mul = mul i64 %src2, %src2117 br label %exit118exit:119 %res = phi i64 [ %src2, %entry ], [ %mul, %mulb ]120 ret i64 %res121}122