1; Test 64-bit comparisons in which the second operand is a PC-relative
2; variable.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6@g = global i64 1
7
8; Check signed comparisons.
9define i64 @f1(i64 %src1) {
10; CHECK: f1:
11; CHECK: cgrl %r2, g
12; CHECK-NEXT: jl
13; CHECK: br %r14
14entry:
15  %src2 = load i64 *@g
16  %cond = icmp slt i64 %src1, %src2
17  br i1 %cond, label %exit, label %mulb
18mulb:
19  %mul = mul i64 %src1, %src1
20  br label %exit
21exit:
22  %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
23  ret i64 %res
24}
25
26; Check unsigned comparisons.
27define i64 @f2(i64 %src1) {
28; CHECK: f2:
29; CHECK: clgrl %r2, g
30; CHECK-NEXT: jl
31; CHECK: br %r14
32entry:
33  %src2 = load i64 *@g
34  %cond = icmp ult i64 %src1, %src2
35  br i1 %cond, label %exit, label %mulb
36mulb:
37  %mul = mul i64 %src1, %src1
38  br label %exit
39exit:
40  %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
41  ret i64 %res
42}
43
44; Check equality, which can use CRL or CLRL.
45define i64 @f3(i64 %src1) {
46; CHECK: f3:
47; CHECK: c{{l?}}grl %r2, g
48; CHECK-NEXT: je
49; CHECK: br %r14
50entry:
51  %src2 = load i64 *@g
52  %cond = icmp eq i64 %src1, %src2
53  br i1 %cond, label %exit, label %mulb
54mulb:
55  %mul = mul i64 %src1, %src1
56  br label %exit
57exit:
58  %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
59  ret i64 %res
60}
61
62; ...likewise inequality.
63define i64 @f4(i64 %src1) {
64; CHECK: f4:
65; CHECK: c{{l?}}grl %r2, g
66; CHECK-NEXT: jlh
67; CHECK: br %r14
68entry:
69  %src2 = load i64 *@g
70  %cond = icmp ne i64 %src1, %src2
71  br i1 %cond, label %exit, label %mulb
72mulb:
73  %mul = mul i64 %src1, %src1
74  br label %exit
75exit:
76  %res = phi i64 [ %src1, %entry ], [ %mul, %mulb ]
77  ret i64 %res
78}
79