11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2- ; RUN: llc -mtriple=aarch64-- -o - < %s | FileCheck %s
2+ ; RUN: llc -mtriple=aarch64-- -o - < %s | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+ ; RUN: llc -mtriple=aarch64-- -global-isel -o - < %s | FileCheck %s --check-prefixes=CHECK,CHECK-GI
34
45; Verify that we can fold csneg/csel into csinc instruction.
56
@@ -8,12 +9,20 @@ target triple = "aarch64-unknown-linux-gnu"
89
910; char csinc1 (char a, char b) { return !a ? b+1 : b+3; }
1011define i8 @csinc1 (i8 %a , i8 %b ) local_unnamed_addr #0 {
11- ; CHECK-LABEL: csinc1:
12- ; CHECK: // %bb.0: // %entry
13- ; CHECK-NEXT: tst w0, #0xff
14- ; CHECK-NEXT: add w8, w1, #3
15- ; CHECK-NEXT: csinc w0, w8, w1, ne
16- ; CHECK-NEXT: ret
12+ ; CHECK-SD-LABEL: csinc1:
13+ ; CHECK-SD: // %bb.0: // %entry
14+ ; CHECK-SD-NEXT: tst w0, #0xff
15+ ; CHECK-SD-NEXT: add w8, w1, #3
16+ ; CHECK-SD-NEXT: csinc w0, w8, w1, ne
17+ ; CHECK-SD-NEXT: ret
18+ ;
19+ ; CHECK-GI-LABEL: csinc1:
20+ ; CHECK-GI: // %bb.0: // %entry
21+ ; CHECK-GI-NEXT: mov w8, #3 // =0x3
22+ ; CHECK-GI-NEXT: tst w0, #0xff
23+ ; CHECK-GI-NEXT: csinc w8, w8, wzr, ne
24+ ; CHECK-GI-NEXT: add w0, w8, w1
25+ ; CHECK-GI-NEXT: ret
1726entry:
1827 %tobool.not = icmp eq i8 %a , 0
1928 %cond.v = select i1 %tobool.not , i8 1 , i8 3
@@ -23,12 +32,20 @@ entry:
2332
2433; short csinc2 (short a, short b) { return !a ? b+1 : b+3; }
2534define i16 @csinc2 (i16 %a , i16 %b ) local_unnamed_addr #0 {
26- ; CHECK-LABEL: csinc2:
27- ; CHECK: // %bb.0: // %entry
28- ; CHECK-NEXT: tst w0, #0xffff
29- ; CHECK-NEXT: add w8, w1, #3
30- ; CHECK-NEXT: csinc w0, w8, w1, ne
31- ; CHECK-NEXT: ret
35+ ; CHECK-SD-LABEL: csinc2:
36+ ; CHECK-SD: // %bb.0: // %entry
37+ ; CHECK-SD-NEXT: tst w0, #0xffff
38+ ; CHECK-SD-NEXT: add w8, w1, #3
39+ ; CHECK-SD-NEXT: csinc w0, w8, w1, ne
40+ ; CHECK-SD-NEXT: ret
41+ ;
42+ ; CHECK-GI-LABEL: csinc2:
43+ ; CHECK-GI: // %bb.0: // %entry
44+ ; CHECK-GI-NEXT: mov w8, #3 // =0x3
45+ ; CHECK-GI-NEXT: tst w0, #0xffff
46+ ; CHECK-GI-NEXT: csinc w8, w8, wzr, ne
47+ ; CHECK-GI-NEXT: add w0, w8, w1
48+ ; CHECK-GI-NEXT: ret
3249entry:
3350 %tobool.not = icmp eq i16 %a , 0
3451 %cond.v = select i1 %tobool.not , i16 1 , i16 3
@@ -38,12 +55,20 @@ entry:
3855
3956; int csinc3 (int a, int b) { return !a ? b+1 : b+3; }
4057define i32 @csinc3 (i32 %a , i32 %b ) local_unnamed_addr #0 {
41- ; CHECK-LABEL: csinc3:
42- ; CHECK: // %bb.0: // %entry
43- ; CHECK-NEXT: cmp w0, #0
44- ; CHECK-NEXT: add w8, w1, #3
45- ; CHECK-NEXT: csinc w0, w8, w1, ne
46- ; CHECK-NEXT: ret
58+ ; CHECK-SD-LABEL: csinc3:
59+ ; CHECK-SD: // %bb.0: // %entry
60+ ; CHECK-SD-NEXT: cmp w0, #0
61+ ; CHECK-SD-NEXT: add w8, w1, #3
62+ ; CHECK-SD-NEXT: csinc w0, w8, w1, ne
63+ ; CHECK-SD-NEXT: ret
64+ ;
65+ ; CHECK-GI-LABEL: csinc3:
66+ ; CHECK-GI: // %bb.0: // %entry
67+ ; CHECK-GI-NEXT: mov w8, #3 // =0x3
68+ ; CHECK-GI-NEXT: cmp w0, #0
69+ ; CHECK-GI-NEXT: csinc w8, w8, wzr, ne
70+ ; CHECK-GI-NEXT: add w0, w8, w1
71+ ; CHECK-GI-NEXT: ret
4772entry:
4873 %tobool.not = icmp eq i32 %a , 0
4974 %cond.v = select i1 %tobool.not , i32 1 , i32 3
@@ -53,12 +78,20 @@ entry:
5378
5479; long long csinc4 (long long a, long long b) { return !a ? b+1 : b+3; }
5580define i64 @csinc4 (i64 %a , i64 %b ) local_unnamed_addr #0 {
56- ; CHECK-LABEL: csinc4:
57- ; CHECK: // %bb.0: // %entry
58- ; CHECK-NEXT: cmp x0, #0
59- ; CHECK-NEXT: add x8, x1, #3
60- ; CHECK-NEXT: csinc x0, x8, x1, ne
61- ; CHECK-NEXT: ret
81+ ; CHECK-SD-LABEL: csinc4:
82+ ; CHECK-SD: // %bb.0: // %entry
83+ ; CHECK-SD-NEXT: cmp x0, #0
84+ ; CHECK-SD-NEXT: add x8, x1, #3
85+ ; CHECK-SD-NEXT: csinc x0, x8, x1, ne
86+ ; CHECK-SD-NEXT: ret
87+ ;
88+ ; CHECK-GI-LABEL: csinc4:
89+ ; CHECK-GI: // %bb.0: // %entry
90+ ; CHECK-GI-NEXT: mov w8, #3 // =0x3
91+ ; CHECK-GI-NEXT: cmp x0, #0
92+ ; CHECK-GI-NEXT: csinc x8, x8, xzr, ne
93+ ; CHECK-GI-NEXT: add x0, x8, x1
94+ ; CHECK-GI-NEXT: ret
6295entry:
6396 %tobool.not = icmp eq i64 %a , 0
6497 %cond.v = select i1 %tobool.not , i64 1 , i64 3
@@ -68,12 +101,21 @@ entry:
68101
69102; long long csinc8 (long long a, long long b) { return a ? b-1 : b+1; }
70103define i64 @csinc8 (i64 %a , i64 %b ) {
71- ; CHECK-LABEL: csinc8:
72- ; CHECK: // %bb.0: // %entry
73- ; CHECK-NEXT: sub x8, x1, #1
74- ; CHECK-NEXT: cmp x0, #0
75- ; CHECK-NEXT: csinc x0, x8, x1, ne
76- ; CHECK-NEXT: ret
104+ ; CHECK-SD-LABEL: csinc8:
105+ ; CHECK-SD: // %bb.0: // %entry
106+ ; CHECK-SD-NEXT: sub x8, x1, #1
107+ ; CHECK-SD-NEXT: cmp x0, #0
108+ ; CHECK-SD-NEXT: csinc x0, x8, x1, ne
109+ ; CHECK-SD-NEXT: ret
110+ ;
111+ ; CHECK-GI-LABEL: csinc8:
112+ ; CHECK-GI: // %bb.0: // %entry
113+ ; CHECK-GI-NEXT: cmp x0, #0
114+ ; CHECK-GI-NEXT: cset w8, ne
115+ ; CHECK-GI-NEXT: sbfx x8, x8, #0, #1
116+ ; CHECK-GI-NEXT: orr x8, x8, #0x1
117+ ; CHECK-GI-NEXT: add x0, x8, x1
118+ ; CHECK-GI-NEXT: ret
77119entry:
78120 %tobool.not = icmp eq i64 %a , 0
79121 %cond.v = select i1 %tobool.not , i64 1 , i64 -1
@@ -83,15 +125,26 @@ entry:
83125
84126; long long csinc9 (long long a, long long b) { return a ? b+1 : b-1; }
85127define i64 @csinc9 (i64 %a , i64 %b ) {
86- ; CHECK-LABEL: csinc9:
87- ; CHECK: // %bb.0: // %entry
88- ; CHECK-NEXT: sub x8, x1, #1
89- ; CHECK-NEXT: cmp x0, #0
90- ; CHECK-NEXT: csinc x0, x8, x1, eq
91- ; CHECK-NEXT: ret
128+ ; CHECK-SD-LABEL: csinc9:
129+ ; CHECK-SD: // %bb.0: // %entry
130+ ; CHECK-SD-NEXT: sub x8, x1, #1
131+ ; CHECK-SD-NEXT: cmp x0, #0
132+ ; CHECK-SD-NEXT: csinc x0, x8, x1, eq
133+ ; CHECK-SD-NEXT: ret
134+ ;
135+ ; CHECK-GI-LABEL: csinc9:
136+ ; CHECK-GI: // %bb.0: // %entry
137+ ; CHECK-GI-NEXT: cmp x0, #0
138+ ; CHECK-GI-NEXT: cset w8, eq
139+ ; CHECK-GI-NEXT: sbfx x8, x8, #0, #1
140+ ; CHECK-GI-NEXT: orr x8, x8, #0x1
141+ ; CHECK-GI-NEXT: add x0, x8, x1
142+ ; CHECK-GI-NEXT: ret
92143entry:
93144 %tobool.not = icmp eq i64 %a , 0
94145 %cond.v = select i1 %tobool.not , i64 -1 , i64 1
95146 %cond = add nsw i64 %cond.v , %b
96147 ret i64 %cond
97148}
149+ ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
150+ ; CHECK: {{.*}}
0 commit comments