xref: /llvm-project/llvm/test/CodeGen/SystemZ/codegenprepare-form-OF-ops.ll (revision e77cb4ae63e932aa8d5d825970c9e67c1491edec)
1cdcce3caSJonas Paulsson; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 -O3 | FileCheck %s
2cdcce3caSJonas Paulsson;
3cdcce3caSJonas Paulsson; Check that CodeGenPrepare transforms these functions to use
4cdcce3caSJonas Paulsson; uadd.with.overflow / usub.with.overflow intrinsics so that the compare
5cdcce3caSJonas Paulsson; instruction is eliminated.
6cdcce3caSJonas Paulsson
7cdcce3caSJonas Paulssondefine i32 @uaddo_32(i32 %arg)  {
8cdcce3caSJonas Paulsson; CHECK-LABEL: uaddo_32:
9cdcce3caSJonas Paulsson; CHECK: alhsik	 %r0, %r2, -1
10cdcce3caSJonas Paulsson; CHECK: locrnle %r2, %r0
11cdcce3caSJonas Paulsson; CHECK: br      %r14
12cdcce3caSJonas Paulsson
13cdcce3caSJonas Paulssonbb:
14cdcce3caSJonas Paulsson  %tmp10 = icmp ne i32 %arg, 0
15cdcce3caSJonas Paulsson  %tmp11 = add nsw i32 %arg, -1
16cdcce3caSJonas Paulsson  %tmp12 = select i1 %tmp10, i32 %tmp11, i32 %arg
17cdcce3caSJonas Paulsson  ret i32 %tmp12
18cdcce3caSJonas Paulsson}
19cdcce3caSJonas Paulsson
20cdcce3caSJonas Paulssondefine i64 @uaddo_64(i64 %arg)  {
21cdcce3caSJonas Paulsson; CHECK-LABEL: uaddo_64:
22cdcce3caSJonas Paulsson; CHECK: alghsik  %r0, %r2, -1
23cdcce3caSJonas Paulsson; CHECK: locgrnle %r2, %r0
24cdcce3caSJonas Paulsson; CHECK: br       %r14
25cdcce3caSJonas Paulssonbb:
26cdcce3caSJonas Paulsson  %tmp10 = icmp ne i64 %arg, 0
27cdcce3caSJonas Paulsson  %tmp11 = add nsw i64 %arg, -1
28cdcce3caSJonas Paulsson  %tmp12 = select i1 %tmp10, i64 %tmp11, i64 %arg
29cdcce3caSJonas Paulsson  ret i64 %tmp12
30cdcce3caSJonas Paulsson}
31cdcce3caSJonas Paulsson
32cdcce3caSJonas Paulssondefine i32 @usubo_32(i32 %arg)  {
33cdcce3caSJonas Paulsson; CHECK-LABEL: usubo_32:
34cdcce3caSJonas Paulsson; CHECK: alhsik %r0, %r2, -1
35cdcce3caSJonas Paulsson; CHECK: locrle %r2, %r0
36cdcce3caSJonas Paulsson; CHECK: br     %r14
37cdcce3caSJonas Paulssonbb:
38cdcce3caSJonas Paulsson  %tmp10 = icmp eq i32 %arg, 0
39cdcce3caSJonas Paulsson  %tmp11 = sub nsw i32 %arg, 1
40cdcce3caSJonas Paulsson  %tmp12 = select i1 %tmp10, i32 %tmp11, i32 %arg
41cdcce3caSJonas Paulsson  ret i32 %tmp12
42cdcce3caSJonas Paulsson}
43cdcce3caSJonas Paulsson
44cdcce3caSJonas Paulssondefine i64 @usubo_64(i64 %arg)  {
45cdcce3caSJonas Paulsson; CHECK-LABEL: usubo_64:
46cdcce3caSJonas Paulsson; CHECK: alghsik %r0, %r2, -1
47cdcce3caSJonas Paulsson; CHECK: locgrle %r2, %r0
48cdcce3caSJonas Paulsson; CHECK: br      %r14
49cdcce3caSJonas Paulssonbb:
50cdcce3caSJonas Paulsson  %tmp10 = icmp eq i64 %arg, 0
51cdcce3caSJonas Paulsson  %tmp11 = sub nsw i64 %arg, 1
52cdcce3caSJonas Paulsson  %tmp12 = select i1 %tmp10, i64 %tmp11, i64 %arg
53cdcce3caSJonas Paulsson  ret i64 %tmp12
54cdcce3caSJonas Paulsson}
55*e77cb4aeSJonas Paulsson
56*e77cb4aeSJonas Paulssondefine i32 @optbranch_32(i32 %Arg) {
57*e77cb4aeSJonas Paulsson; CHECK-LABEL: optbranch_32:
58*e77cb4aeSJonas Paulsson; CHECK:        alhsik	%r2, %r2, 1
59*e77cb4aeSJonas Paulsson; CHECK-NEXT:   bler	%r14
60*e77cb4aeSJonas Paulsson; CHECK-NEXT:   .LBB4_1:
61*e77cb4aeSJonas Paulsson; CHECK-NEXT: 	lhi	%r2, -1
62*e77cb4aeSJonas Paulsson; CHECK-NEXT: 	br	%r14
63*e77cb4aeSJonas Paulssonbb:
64*e77cb4aeSJonas Paulsson  %i1 = icmp eq i32 %Arg, -1
65*e77cb4aeSJonas Paulsson  br i1 %i1, label %bb2, label %bb3
66*e77cb4aeSJonas Paulsson
67*e77cb4aeSJonas Paulssonbb2:
68*e77cb4aeSJonas Paulsson  ret i32 -1
69*e77cb4aeSJonas Paulsson
70*e77cb4aeSJonas Paulssonbb3:
71*e77cb4aeSJonas Paulsson  %i4 = add nuw i32 %Arg, 1
72*e77cb4aeSJonas Paulsson  ret i32 %i4
73*e77cb4aeSJonas Paulsson}
74*e77cb4aeSJonas Paulsson
75*e77cb4aeSJonas Paulssondefine i64 @optbranch_64(i64 %Arg) {
76*e77cb4aeSJonas Paulsson; CHECK-LABEL: optbranch_64:
77*e77cb4aeSJonas Paulsson; CHECK:        alghsik	%r2, %r2, 1
78*e77cb4aeSJonas Paulsson; CHECK-NEXT:   bler	%r14
79*e77cb4aeSJonas Paulsson; CHECK-NEXT:   .LBB5_1:
80*e77cb4aeSJonas Paulsson; CHECK-NEXT: 	lghi	%r2, -1
81*e77cb4aeSJonas Paulsson; CHECK-NEXT: 	br	%r14
82*e77cb4aeSJonas Paulssonbb:
83*e77cb4aeSJonas Paulsson  %i1 = icmp eq i64 %Arg, -1
84*e77cb4aeSJonas Paulsson  br i1 %i1, label %bb2, label %bb3
85*e77cb4aeSJonas Paulsson
86*e77cb4aeSJonas Paulssonbb2:
87*e77cb4aeSJonas Paulsson  ret i64 -1
88*e77cb4aeSJonas Paulsson
89*e77cb4aeSJonas Paulssonbb3:
90*e77cb4aeSJonas Paulsson  %i4 = add nuw i64 %Arg, 1
91*e77cb4aeSJonas Paulsson  ret i64 %i4
92*e77cb4aeSJonas Paulsson}
93