xref: /llvm-project/llvm/test/CodeGen/AArch64/aarch64-isel-csinc.ll (revision db158c7c830807caeeb0691739c41f1d522029e9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=aarch64-- -o - < %s | FileCheck %s
3
4; Verify that we can fold csneg/csel into csinc instruction.
5
6target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
7target triple = "aarch64-unknown-linux-gnu"
8
9; int csinc1 (int a, int b) { return !a ? b+3 : b+1; }
10define i32 @csinc1(i32 %a, i32 %b) {
11; CHECK-LABEL: csinc1:
12; CHECK:       // %bb.0: // %entry
13; CHECK-NEXT:    cmp w0, #0
14; CHECK-NEXT:    add w8, w1, #3
15; CHECK-NEXT:    csinc w0, w8, w1, eq
16; CHECK-NEXT:    ret
17entry:
18  %tobool.not = icmp eq i32 %a, 0
19  %cond.v = select i1 %tobool.not, i32 3, i32 1
20  %cond = add nsw i32 %cond.v, %b
21  ret i32 %cond
22}
23
24; int csinc2 (int a, int b) { return a ? b+3 : b+1; }
25define i32 @csinc2(i32 %a, i32 %b) {
26; CHECK-LABEL: csinc2:
27; CHECK:       // %bb.0: // %entry
28; CHECK-NEXT:    cmp w0, #0
29; CHECK-NEXT:    add w8, w1, #3
30; CHECK-NEXT:    csinc w0, w8, w1, ne
31; CHECK-NEXT:    ret
32entry:
33  %tobool.not = icmp eq i32 %a, 0
34  %cond.v = select i1 %tobool.not, i32 1, i32 3
35  %cond = add nsw i32 %cond.v, %b
36  ret i32 %cond
37}
38
39; int csinc3 (int a, int b) { return !a ? b+1 : b-3; }
40define i32 @csinc3(i32 %a, i32 %b) {
41; CHECK-LABEL: csinc3:
42; CHECK:       // %bb.0: // %entry
43; CHECK-NEXT:    sub w8, w1, #3
44; CHECK-NEXT:    cmp w0, #0
45; CHECK-NEXT:    csinc w0, w8, w1, ne
46; CHECK-NEXT:    ret
47entry:
48  %tobool.not = icmp eq i32 %a, 0
49  %cond.v = select i1 %tobool.not, i32 1, i32 -3
50  %cond = add nsw i32 %cond.v, %b
51  ret i32 %cond
52}
53
54; int csinc4 (int a, int b) { return a ? b+1 : b-3; }
55define i32 @csinc4(i32 %a, i32 %b) {
56; CHECK-LABEL: csinc4:
57; CHECK:       // %bb.0: // %entry
58; CHECK-NEXT:    sub w8, w1, #3
59; CHECK-NEXT:    cmp w0, #0
60; CHECK-NEXT:    csinc w0, w8, w1, eq
61; CHECK-NEXT:    ret
62entry:
63  %tobool.not = icmp eq i32 %a, 0
64  %cond.v = select i1 %tobool.not, i32 -3, i32 1
65  %cond = add nsw i32 %cond.v, %b
66  ret i32 %cond
67}
68
69; int csinc5 (int a, int b) { return a ? b+1 : b-4095; }
70define i32 @csinc5(i32 %a, i32 %b) {
71; CHECK-LABEL: csinc5:
72; CHECK:       // %bb.0: // %entry
73; CHECK-NEXT:    sub w8, w1, #4095
74; CHECK-NEXT:    cmp w0, #0
75; CHECK-NEXT:    csinc w0, w8, w1, eq
76; CHECK-NEXT:    ret
77entry:
78  %tobool.not = icmp eq i32 %a, 0
79  %cond.v = select i1 %tobool.not, i32 -4095, i32 1
80  %cond = add nsw i32 %cond.v, %b
81  ret i32 %cond
82}
83
84; int csinc6 (int a, int b) { return a ? b+1 : b-4096; }
85define i32 @csinc6(i32 %a, i32 %b) {
86; CHECK-LABEL: csinc6:
87; CHECK:       // %bb.0: // %entry
88; CHECK-NEXT:    sub w8, w1, #1, lsl #12 // =4096
89; CHECK-NEXT:    cmp w0, #0
90; CHECK-NEXT:    csinc w0, w8, w1, eq
91; CHECK-NEXT:    ret
92entry:
93  %tobool.not = icmp eq i32 %a, 0
94  %cond.v = select i1 %tobool.not, i32 -4096, i32 1
95  %cond = add nsw i32 %cond.v, %b
96  ret i32 %cond
97}
98
99; prevent larger constants (the add laid after csinc)
100; int csinc7 (int a, int b) { return a ? b+1 : b-4097; }
101define i32 @csinc7(i32 %a, i32 %b) {
102; CHECK-LABEL: csinc7:
103; CHECK:       // %bb.0: // %entry
104; CHECK-NEXT:    mov w8, #-4097 // =0xffffefff
105; CHECK-NEXT:    cmp w0, #0
106; CHECK-NEXT:    csinc w8, w8, wzr, eq
107; CHECK-NEXT:    add w0, w8, w1
108; CHECK-NEXT:    ret
109entry:
110  %tobool.not = icmp eq i32 %a, 0
111  %cond.v = select i1 %tobool.not, i32 -4097, i32 1
112  %cond = add nsw i32 %cond.v, %b
113  ret i32 %cond
114}
115
116; int csinc8 (int a, int b) { return a ? b-1 : b+1; }
117define i32 @csinc8(i32 %a, i32 %b) {
118; CHECK-LABEL: csinc8:
119; CHECK:       // %bb.0: // %entry
120; CHECK-NEXT:    sub w8, w1, #1
121; CHECK-NEXT:    cmp w0, #0
122; CHECK-NEXT:    csinc w0, w8, w1, ne
123; CHECK-NEXT:    ret
124entry:
125  %tobool.not = icmp eq i32 %a, 0
126  %cond.v = select i1 %tobool.not, i32 1, i32 -1
127  %cond = add nsw i32 %cond.v, %b
128  ret i32 %cond
129}
130
131; int csinc9 (int a, int b) { return a ? b+1 : b-1; }
132define i32 @csinc9(i32 %a, i32 %b) {
133; CHECK-LABEL: csinc9:
134; CHECK:       // %bb.0: // %entry
135; CHECK-NEXT:    sub w8, w1, #1
136; CHECK-NEXT:    cmp w0, #0
137; CHECK-NEXT:    csinc w0, w8, w1, eq
138; CHECK-NEXT:    ret
139entry:
140  %tobool.not = icmp eq i32 %a, 0
141  %cond.v = select i1 %tobool.not, i32 -1, i32 1
142  %cond = add nsw i32 %cond.v, %b
143  ret i32 %cond
144}
145