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