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