117 lines · plain
1; Test 64-bit comparisons in which the second operand is a PC-relative2; variable.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6@g = dso_local global i64 17@h = dso_local global i64 1, align 4, section "foo"8 9; Check signed comparisons.10define dso_local i64 @f1(i64 %src1) {11; CHECK-LABEL: f1:12; CHECK: cgrl %r2, g13; CHECK-NEXT: blr %r1414; CHECK: br %r1415entry:16 %src2 = load i64, ptr@g17 %cond = icmp slt i64 %src1, %src218 br i1 %cond, label %exit, label %mulb19mulb:20 %mul = mul i64 %src1, %src121 br label %exit22exit:23 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]24 ret i64 %res25}26 27; Check unsigned comparisons.28define dso_local i64 @f2(i64 %src1) {29; CHECK-LABEL: f2:30; CHECK: clgrl %r2, g31; CHECK-NEXT: blr %r1432; CHECK: br %r1433entry:34 %src2 = load i64, ptr@g35 %cond = icmp ult i64 %src1, %src236 br i1 %cond, label %exit, label %mulb37mulb:38 %mul = mul i64 %src1, %src139 br label %exit40exit:41 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]42 ret i64 %res43}44 45; Check equality, which can use CRL or CLRL.46define dso_local i64 @f3(i64 %src1) {47; CHECK-LABEL: f3:48; CHECK: c{{l?}}grl %r2, g49; CHECK-NEXT: ber %r1450; CHECK: br %r1451entry:52 %src2 = load i64, ptr@g53 %cond = icmp eq i64 %src1, %src254 br i1 %cond, label %exit, label %mulb55mulb:56 %mul = mul i64 %src1, %src157 br label %exit58exit:59 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]60 ret i64 %res61}62 63; ...likewise inequality.64define dso_local i64 @f4(i64 %src1) {65; CHECK-LABEL: f4:66; CHECK: c{{l?}}grl %r2, g67; CHECK-NEXT: blhr %r1468; CHECK: br %r1469entry:70 %src2 = load i64, ptr@g71 %cond = icmp ne i64 %src1, %src272 br i1 %cond, label %exit, label %mulb73mulb:74 %mul = mul i64 %src1, %src175 br label %exit76exit:77 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]78 ret i64 %res79}80 81; Repeat f1 with an unaligned address.82define dso_local i64 @f5(i64 %src1) {83; CHECK-LABEL: f5:84; CHECK: larl [[REG:%r[0-5]]], h85; CHECK: cg %r2, 0([[REG]])86; CHECK-NEXT: blr %r1487; CHECK: br %r1488entry:89 %src2 = load i64, ptr@h, align 490 %cond = icmp slt i64 %src1, %src291 br i1 %cond, label %exit, label %mulb92mulb:93 %mul = mul i64 %src1, %src194 br label %exit95exit:96 %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]97 ret i64 %res98}99 100; Check the comparison can be reversed if that allows CGRL to be used.101define dso_local i64 @f6(i64 %src2) {102; CHECK-LABEL: f6:103; CHECK: cgrl %r2, g104; CHECK-NEXT: bhr %r14105; CHECK: br %r14106entry:107 %src1 = load i64, ptr@g108 %cond = icmp slt i64 %src1, %src2109 br i1 %cond, label %exit, label %mulb110mulb:111 %mul = mul i64 %src2, %src2112 br label %exit113exit:114 %res = phi i64 [ %src2, %entry ], [ %mul, %mulb ]115 ret i64 %res116}117