xref: /llvm-project/llvm/test/CodeGen/SystemZ/int-uadd-05.ll (revision 872276de4b8c5f13f106b79c53a27e4a6ff8ce35)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; Test 64-bit addition in which the second operand is constant.
3;
4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5
6declare i64 @foo()
7
8; Check addition of 1.
9define zeroext i1 @f1(i64 %dummy, i64 %a, ptr %res) {
10; CHECK-LABEL: f1:
11; CHECK:       # %bb.0:
12; CHECK-NEXT:    algfi %r3, 1
13; CHECK-NEXT:    ipm %r0
14; CHECK-NEXT:    risbg %r2, %r0, 63, 191, 35
15; CHECK-NEXT:    stg %r3, 0(%r4)
16; CHECK-NEXT:    br %r14
17  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 1)
18  %val = extractvalue {i64, i1} %t, 0
19  %obit = extractvalue {i64, i1} %t, 1
20  store i64 %val, ptr %res
21  ret i1 %obit
22}
23
24; Check the high end of the ALGFI range.
25define zeroext i1 @f2(i64 %dummy, i64 %a, ptr %res) {
26; CHECK-LABEL: f2:
27; CHECK:       # %bb.0:
28; CHECK-NEXT:    algfi %r3, 4294967295
29; CHECK-NEXT:    ipm %r0
30; CHECK-NEXT:    risbg %r2, %r0, 63, 191, 35
31; CHECK-NEXT:    stg %r3, 0(%r4)
32; CHECK-NEXT:    br %r14
33  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 4294967295)
34  %val = extractvalue {i64, i1} %t, 0
35  %obit = extractvalue {i64, i1} %t, 1
36  store i64 %val, ptr %res
37  ret i1 %obit
38}
39
40; Check the next value up, which must be loaded into a register first.
41define zeroext i1 @f3(i64 %dummy, i64 %a, ptr %res) {
42; CHECK-LABEL: f3:
43; CHECK:       # %bb.0:
44; CHECK-NEXT:    llihl %r0, 1
45; CHECK-NEXT:    algr %r0, %r3
46; CHECK-NEXT:    ipm %r1
47; CHECK-NEXT:    risbg %r2, %r1, 63, 191, 35
48; CHECK-NEXT:    stg %r0, 0(%r4)
49; CHECK-NEXT:    br %r14
50  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 4294967296)
51  %val = extractvalue {i64, i1} %t, 0
52  %obit = extractvalue {i64, i1} %t, 1
53  store i64 %val, ptr %res
54  ret i1 %obit
55}
56
57; Likewise for negative values.
58define zeroext i1 @f4(i64 %dummy, i64 %a, ptr %res) {
59; CHECK-LABEL: f4:
60; CHECK:       # %bb.0:
61; CHECK-NEXT:    lghi %r0, -1
62; CHECK-NEXT:    algr %r0, %r3
63; CHECK-NEXT:    ipm %r1
64; CHECK-NEXT:    risbg %r2, %r1, 63, 191, 35
65; CHECK-NEXT:    stg %r0, 0(%r4)
66; CHECK-NEXT:    br %r14
67  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 -1)
68  %val = extractvalue {i64, i1} %t, 0
69  %obit = extractvalue {i64, i1} %t, 1
70  store i64 %val, ptr %res
71  ret i1 %obit
72}
73
74; Check using the overflow result for a branch.
75define void @f5(i64 %dummy, i64 %a, ptr %res) {
76; CHECK-LABEL: f5:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    algfi %r3, 1
79; CHECK-NEXT:    stg %r3, 0(%r4)
80; CHECK-NEXT:    jgnle foo@PLT
81; CHECK-NEXT:  .LBB4_1: # %exit
82; CHECK-NEXT:    br %r14
83  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 1)
84  %val = extractvalue {i64, i1} %t, 0
85  %obit = extractvalue {i64, i1} %t, 1
86  store i64 %val, ptr %res
87  br i1 %obit, label %call, label %exit
88
89call:
90  tail call i64 @foo()
91  br label %exit
92
93exit:
94  ret void
95}
96
97; ... and the same with the inverted direction.
98define void @f6(i64 %dummy, i64 %a, ptr %res) {
99; CHECK-LABEL: f6:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    algfi %r3, 1
102; CHECK-NEXT:    stg %r3, 0(%r4)
103; CHECK-NEXT:    jgle foo@PLT
104; CHECK-NEXT:  .LBB5_1: # %exit
105; CHECK-NEXT:    br %r14
106  %t = call {i64, i1} @llvm.uadd.with.overflow.i64(i64 %a, i64 1)
107  %val = extractvalue {i64, i1} %t, 0
108  %obit = extractvalue {i64, i1} %t, 1
109  store i64 %val, ptr %res
110  br i1 %obit, label %exit, label %call
111
112call:
113  tail call i64 @foo()
114  br label %exit
115
116exit:
117  ret void
118}
119
120declare {i64, i1} @llvm.uadd.with.overflow.i64(i64, i64) nounwind readnone
121
122