[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / SystemZ / int-uadd-04.ll
blobab686636368a8769cdd85a088fadaf5280f7e5d3
1 ; Test 32-bit addition in which the second operand is constant.
3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5 declare i32 @foo()
7 ; Check addition of 1.
8 define zeroext i1 @f1(i32 %dummy, i32 %a, i32 *%res) {
9 ; CHECK-LABEL: f1:
10 ; CHECK: alfi %r3, 1
11 ; CHECK-DAG: st %r3, 0(%r4)
12 ; CHECK-DAG: ipm [[REG:%r[0-5]]]
13 ; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 35
14 ; CHECK: br %r14
15   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 1)
16   %val = extractvalue {i32, i1} %t, 0
17   %obit = extractvalue {i32, i1} %t, 1
18   store i32 %val, i32 *%res
19   ret i1 %obit
22 ; Check the high end of the ALFI range.
23 define zeroext i1 @f2(i32 %dummy, i32 %a, i32 *%res) {
24 ; CHECK-LABEL: f2:
25 ; CHECK: alfi %r3, 4294967295
26 ; CHECK-DAG: st %r3, 0(%r4)
27 ; CHECK-DAG: ipm [[REG:%r[0-5]]]
28 ; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 35
29 ; CHECK: br %r14
30   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 4294967295)
31   %val = extractvalue {i32, i1} %t, 0
32   %obit = extractvalue {i32, i1} %t, 1
33   store i32 %val, i32 *%res
34   ret i1 %obit
37 ; Check that negative values are treated as unsigned
38 define zeroext i1 @f3(i32 %dummy, i32 %a, i32 *%res) {
39 ; CHECK-LABEL: f3:
40 ; CHECK: alfi %r3, 4294967295
41 ; CHECK-DAG: st %r3, 0(%r4)
42 ; CHECK-DAG: ipm [[REG:%r[0-5]]]
43 ; CHECK-DAG: risbg %r2, [[REG]], 63, 191, 35
44 ; CHECK: br %r14
45   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 -1)
46   %val = extractvalue {i32, i1} %t, 0
47   %obit = extractvalue {i32, i1} %t, 1
48   store i32 %val, i32 *%res
49   ret i1 %obit
52 ; Check using the overflow result for a branch.
53 define void @f4(i32 %dummy, i32 %a, i32 *%res) {
54 ; CHECK-LABEL: f4:
55 ; CHECK: alfi %r3, 1
56 ; CHECK: st %r3, 0(%r4)
57 ; CHECK: jgnle foo@PLT
58 ; CHECK: br %r14
59   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 1)
60   %val = extractvalue {i32, i1} %t, 0
61   %obit = extractvalue {i32, i1} %t, 1
62   store i32 %val, i32 *%res
63   br i1 %obit, label %call, label %exit
65 call:
66   tail call i32 @foo()
67   br label %exit
69 exit:
70   ret void
73 ; ... and the same with the inverted direction.
74 define void @f5(i32 %dummy, i32 %a, i32 *%res) {
75 ; CHECK-LABEL: f5:
76 ; CHECK: alfi %r3, 1
77 ; CHECK: st %r3, 0(%r4)
78 ; CHECK: jgle foo@PLT
79 ; CHECK: br %r14
80   %t = call {i32, i1} @llvm.uadd.with.overflow.i32(i32 %a, i32 1)
81   %val = extractvalue {i32, i1} %t, 0
82   %obit = extractvalue {i32, i1} %t, 1
83   store i32 %val, i32 *%res
84   br i1 %obit, label %exit, label %call
86 call:
87   tail call i32 @foo()
88   br label %exit
90 exit:
91   ret void
94 declare {i32, i1} @llvm.uadd.with.overflow.i32(i32, i32) nounwind readnone