4
4
define i64 @add_select_zext (i1 %c ) {
5
5
; CHECK-LABEL: define i64 @add_select_zext
6
6
; CHECK-SAME: (i1 [[C:%.*]]) {
7
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
8
- ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
9
- ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
7
+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 65, i64 1
10
8
; CHECK-NEXT: ret i64 [[ADD]]
11
9
;
12
10
%sel = select i1 %c , i64 64 , i64 1
@@ -18,9 +16,7 @@ define i64 @add_select_zext(i1 %c) {
18
16
define i64 @add_select_sext (i1 %c ) {
19
17
; CHECK-LABEL: define i64 @add_select_sext
20
18
; CHECK-SAME: (i1 [[C:%.*]]) {
21
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
22
- ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i64
23
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT]]
19
+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 63, i64 1
24
20
; CHECK-NEXT: ret i64 [[ADD]]
25
21
;
26
22
%sel = select i1 %c , i64 64 , i64 1
@@ -32,10 +28,7 @@ define i64 @add_select_sext(i1 %c) {
32
28
define i64 @add_select_not_zext (i1 %c ) {
33
29
; CHECK-LABEL: define i64 @add_select_not_zext
34
30
; CHECK-SAME: (i1 [[C:%.*]]) {
35
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
36
- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
37
- ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[NOT_C]] to i64
38
- ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
31
+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 64, i64 2
39
32
; CHECK-NEXT: ret i64 [[ADD]]
40
33
;
41
34
%sel = select i1 %c , i64 64 , i64 1
@@ -48,10 +41,7 @@ define i64 @add_select_not_zext(i1 %c) {
48
41
define i64 @add_select_not_sext (i1 %c ) {
49
42
; CHECK-LABEL: define i64 @add_select_not_sext
50
43
; CHECK-SAME: (i1 [[C:%.*]]) {
51
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
52
- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
53
- ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[NOT_C]] to i64
54
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT]]
44
+ ; CHECK-NEXT: [[ADD:%.*]] = select i1 [[C]], i64 64, i64 0
55
45
; CHECK-NEXT: ret i64 [[ADD]]
56
46
;
57
47
%sel = select i1 %c , i64 64 , i64 1
@@ -64,9 +54,7 @@ define i64 @add_select_not_sext(i1 %c) {
64
54
define i64 @sub_select_sext (i1 %c , i64 %arg ) {
65
55
; CHECK-LABEL: define i64 @sub_select_sext
66
56
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
67
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 [[ARG]]
68
- ; CHECK-NEXT: [[EXT_NEG:%.*]] = zext i1 [[C]] to i64
69
- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
57
+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 65, i64 [[ARG]]
70
58
; CHECK-NEXT: ret i64 [[SUB]]
71
59
;
72
60
%sel = select i1 %c , i64 64 , i64 %arg
@@ -78,10 +66,7 @@ define i64 @sub_select_sext(i1 %c, i64 %arg) {
78
66
define i64 @sub_select_not_zext (i1 %c , i64 %arg ) {
79
67
; CHECK-LABEL: define i64 @sub_select_not_zext
80
68
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
81
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 64
82
- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
83
- ; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[NOT_C]] to i64
84
- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
69
+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 [[ARG]], i64 63
85
70
; CHECK-NEXT: ret i64 [[SUB]]
86
71
;
87
72
%sel = select i1 %c , i64 %arg , i64 64
@@ -94,10 +79,7 @@ define i64 @sub_select_not_zext(i1 %c, i64 %arg) {
94
79
define i64 @sub_select_not_sext (i1 %c , i64 %arg ) {
95
80
; CHECK-LABEL: define i64 @sub_select_not_sext
96
81
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG:%.*]]) {
97
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG]], i64 64
98
- ; CHECK-NEXT: [[NOT_C:%.*]] = xor i1 [[C]], true
99
- ; CHECK-NEXT: [[EXT_NEG:%.*]] = zext i1 [[NOT_C]] to i64
100
- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
82
+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 [[ARG]], i64 65
101
83
; CHECK-NEXT: ret i64 [[SUB]]
102
84
;
103
85
%sel = select i1 %c , i64 %arg , i64 64
@@ -122,9 +104,7 @@ define i64 @mul_select_zext(i1 %c, i64 %arg) {
122
104
define i64 @mul_select_sext (i1 %c ) {
123
105
; CHECK-LABEL: define i64 @mul_select_sext
124
106
; CHECK-SAME: (i1 [[C:%.*]]) {
125
- ; CHECK-NEXT: [[EXT:%.*]] = sext i1 [[C]] to i64
126
- ; CHECK-NEXT: [[TMP1:%.*]] = select i1 [[C]], i64 6, i64 0
127
- ; CHECK-NEXT: [[MUL:%.*]] = shl i64 [[EXT]], [[TMP1]]
107
+ ; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C]], i64 -64, i64 0
128
108
; CHECK-NEXT: ret i64 [[MUL]]
129
109
;
130
110
%sel = select i1 %c , i64 64 , i64 1
@@ -168,10 +148,7 @@ define <2 x i64> @vector_test(i1 %c) {
168
148
define i64 @multiuse_add (i1 %c ) {
169
149
; CHECK-LABEL: define i64 @multiuse_add
170
150
; CHECK-SAME: (i1 [[C:%.*]]) {
171
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 1
172
- ; CHECK-NEXT: [[EXT:%.*]] = zext i1 [[C]] to i64
173
- ; CHECK-NEXT: [[ADD:%.*]] = add nuw nsw i64 [[SEL]], [[EXT]]
174
- ; CHECK-NEXT: [[ADD2:%.*]] = add nuw nsw i64 [[ADD]], 1
151
+ ; CHECK-NEXT: [[ADD2:%.*]] = select i1 [[C]], i64 66, i64 2
175
152
; CHECK-NEXT: ret i64 [[ADD2]]
176
153
;
177
154
%sel = select i1 %c , i64 64 , i64 1
@@ -184,10 +161,7 @@ define i64 @multiuse_add(i1 %c) {
184
161
define i64 @multiuse_select (i1 %c ) {
185
162
; CHECK-LABEL: define i64 @multiuse_select
186
163
; CHECK-SAME: (i1 [[C:%.*]]) {
187
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 64, i64 0
188
- ; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[C]] to i64
189
- ; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[SEL]], [[EXT_NEG]]
190
- ; CHECK-NEXT: [[MUL:%.*]] = mul nsw i64 [[SEL]], [[ADD]]
164
+ ; CHECK-NEXT: [[MUL:%.*]] = select i1 [[C]], i64 4032, i64 0
191
165
; CHECK-NEXT: ret i64 [[MUL]]
192
166
;
193
167
%sel = select i1 %c , i64 64 , i64 0
@@ -200,9 +174,8 @@ define i64 @multiuse_select(i1 %c) {
200
174
define i64 @select_non_const_sides (i1 %c , i64 %arg1 , i64 %arg2 ) {
201
175
; CHECK-LABEL: define i64 @select_non_const_sides
202
176
; CHECK-SAME: (i1 [[C:%.*]], i64 [[ARG1:%.*]], i64 [[ARG2:%.*]]) {
203
- ; CHECK-NEXT: [[EXT_NEG:%.*]] = sext i1 [[C]] to i64
204
- ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C]], i64 [[ARG1]], i64 [[ARG2]]
205
- ; CHECK-NEXT: [[SUB:%.*]] = add i64 [[SEL]], [[EXT_NEG]]
177
+ ; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[ARG1]], -1
178
+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i64 [[TMP1]], i64 [[ARG2]]
206
179
; CHECK-NEXT: ret i64 [[SUB]]
207
180
;
208
181
%ext = zext i1 %c to i64
@@ -214,9 +187,9 @@ define i64 @select_non_const_sides(i1 %c, i64 %arg1, i64 %arg2) {
214
187
define i6 @sub_select_sext_op_swapped_non_const_args (i1 %c , i6 %argT , i6 %argF ) {
215
188
; CHECK-LABEL: define i6 @sub_select_sext_op_swapped_non_const_args
216
189
; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
217
- ; CHECK-NEXT : [[SEL :%.*]] = select i1 [[C]], i6 [[ARGT]], i6 [[ARGF]]
218
- ; CHECK-NEXT : [[EXT :%.*]] = sext i1 [[C]] to i6
219
- ; CHECK-NEXT: [[SUB:%.*]] = sub i6 [[EXT ]], [[SEL ]]
190
+ ; CHECK-DAG : [[TMP1 :%.*]] = xor i6 [[ARGT]], -1
191
+ ; CHECK-DAG : [[TMP2 :%.*]] = sub i6 0, [[ARGF]]
192
+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1 ]], i6 [[TMP2 ]]
220
193
; CHECK-NEXT: ret i6 [[SUB]]
221
194
;
222
195
%sel = select i1 %c , i6 %argT , i6 %argF
@@ -228,9 +201,9 @@ define i6 @sub_select_sext_op_swapped_non_const_args(i1 %c, i6 %argT, i6 %argF)
228
201
define i6 @sub_select_zext_op_swapped_non_const_args (i1 %c , i6 %argT , i6 %argF ) {
229
202
; CHECK-LABEL: define i6 @sub_select_zext_op_swapped_non_const_args
230
203
; CHECK-SAME: (i1 [[C:%.*]], i6 [[ARGT:%.*]], i6 [[ARGF:%.*]]) {
231
- ; CHECK-NEXT : [[SEL :%.*]] = select i1 [[C]], i6 [[ARGT]], i6 [[ARGF ]]
232
- ; CHECK-NEXT : [[EXT :%.*]] = zext i1 [[C]] to i6
233
- ; CHECK-NEXT: [[SUB:%.*]] = sub i6 [[EXT ]], [[SEL ]]
204
+ ; CHECK-DAG : [[TMP1 :%.*]] = sub i6 1, [[ARGT ]]
205
+ ; CHECK-DAG : [[TMP2 :%.*]] = sub i6 0, [[ARGF]]
206
+ ; CHECK-NEXT: [[SUB:%.*]] = select i1 [[C]], i6 [[TMP1 ]], i6 [[TMP2 ]]
234
207
; CHECK-NEXT: ret i6 [[SUB]]
235
208
;
236
209
%sel = select i1 %c , i6 %argT , i6 %argF
0 commit comments