1
1
; 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
3
4
4
5
; Verify that we can fold csneg/csel into csinc instruction.
5
6
@@ -8,12 +9,20 @@ target triple = "aarch64-unknown-linux-gnu"
8
9
9
10
; char csinc1 (char a, char b) { return !a ? b+1 : b+3; }
10
11
define 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
17
26
entry:
18
27
%tobool.not = icmp eq i8 %a , 0
19
28
%cond.v = select i1 %tobool.not , i8 1 , i8 3
@@ -23,12 +32,20 @@ entry:
23
32
24
33
; short csinc2 (short a, short b) { return !a ? b+1 : b+3; }
25
34
define 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
32
49
entry:
33
50
%tobool.not = icmp eq i16 %a , 0
34
51
%cond.v = select i1 %tobool.not , i16 1 , i16 3
@@ -38,12 +55,20 @@ entry:
38
55
39
56
; int csinc3 (int a, int b) { return !a ? b+1 : b+3; }
40
57
define 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
47
72
entry:
48
73
%tobool.not = icmp eq i32 %a , 0
49
74
%cond.v = select i1 %tobool.not , i32 1 , i32 3
@@ -53,12 +78,20 @@ entry:
53
78
54
79
; long long csinc4 (long long a, long long b) { return !a ? b+1 : b+3; }
55
80
define 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
62
95
entry:
63
96
%tobool.not = icmp eq i64 %a , 0
64
97
%cond.v = select i1 %tobool.not , i64 1 , i64 3
@@ -68,12 +101,21 @@ entry:
68
101
69
102
; long long csinc8 (long long a, long long b) { return a ? b-1 : b+1; }
70
103
define 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
77
119
entry:
78
120
%tobool.not = icmp eq i64 %a , 0
79
121
%cond.v = select i1 %tobool.not , i64 1 , i64 -1
@@ -83,15 +125,26 @@ entry:
83
125
84
126
; long long csinc9 (long long a, long long b) { return a ? b+1 : b-1; }
85
127
define 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
92
143
entry:
93
144
%tobool.not = icmp eq i64 %a , 0
94
145
%cond.v = select i1 %tobool.not , i64 -1 , i64 1
95
146
%cond = add nsw i64 %cond.v , %b
96
147
ret i64 %cond
97
148
}
149
+ ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
150
+ ; CHECK: {{.*}}
0 commit comments