1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -O3 | FileCheck %s
2;
3; Check that CodeGenPrepare transforms these functions to use
4; uadd.with.overflow / usub.with.overflow intrinsics so that the compare
5; instruction is eliminated.
6
7define i32 @uaddo_32(i32 %arg)  {
8; CHECK-LABEL: uaddo_32:
9; CHECK: alhsik	 %r0, %r2, -1
10; CHECK: locrnle %r2, %r0
11; CHECK: br      %r14
12
13bb:
14  %tmp10 = icmp ne i32 %arg, 0
15  %tmp11 = add nsw i32 %arg, -1
16  %tmp12 = select i1 %tmp10, i32 %tmp11, i32 %arg
17  ret i32 %tmp12
18}
19
20define i64 @uaddo_64(i64 %arg)  {
21; CHECK-LABEL: uaddo_64:
22; CHECK: alghsik  %r0, %r2, -1
23; CHECK: locgrnle %r2, %r0
24; CHECK: br       %r14
25bb:
26  %tmp10 = icmp ne i64 %arg, 0
27  %tmp11 = add nsw i64 %arg, -1
28  %tmp12 = select i1 %tmp10, i64 %tmp11, i64 %arg
29  ret i64 %tmp12
30}
31
32define i32 @usubo_32(i32 %arg)  {
33; CHECK-LABEL: usubo_32:
34; CHECK: alhsik %r0, %r2, -1
35; CHECK: locrle %r2, %r0
36; CHECK: br     %r14
37bb:
38  %tmp10 = icmp eq i32 %arg, 0
39  %tmp11 = sub nsw i32 %arg, 1
40  %tmp12 = select i1 %tmp10, i32 %tmp11, i32 %arg
41  ret i32 %tmp12
42}
43
44define i64 @usubo_64(i64 %arg)  {
45; CHECK-LABEL: usubo_64:
46; CHECK: alghsik %r0, %r2, -1
47; CHECK: locgrle %r2, %r0
48; CHECK: br      %r14
49bb:
50  %tmp10 = icmp eq i64 %arg, 0
51  %tmp11 = sub nsw i64 %arg, 1
52  %tmp12 = select i1 %tmp10, i64 %tmp11, i64 %arg
53  ret i64 %tmp12
54}
55