@@ -36,10 +36,9 @@ define <2 x i32> @select_icmp_eq_and_1_0_or_2_vec(<2 x i32> %x, <2 x i32> %y) {
36
36
37
37
define i32 @select_icmp_eq_and_1_0_xor_2 (i32 %x , i32 %y ) {
38
38
; CHECK-LABEL: @select_icmp_eq_and_1_0_xor_2(
39
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1
40
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
41
- ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2
42
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]
39
+ ; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1
40
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2
41
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], [[Y:%.*]]
43
42
; CHECK-NEXT: ret i32 [[SELECT]]
44
43
;
45
44
%and = and i32 %x , 1
@@ -94,10 +93,9 @@ define <2 x i32> @select_icmp_eq_and_32_0_or_8_vec(<2 x i32> %x, <2 x i32> %y) {
94
93
95
94
define i32 @select_icmp_eq_and_32_0_xor_8 (i32 %x , i32 %y ) {
96
95
; CHECK-LABEL: @select_icmp_eq_and_32_0_xor_8(
97
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32
98
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
99
- ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 8
100
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]
96
+ ; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 2
97
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 8
98
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], [[Y:%.*]]
101
99
; CHECK-NEXT: ret i32 [[SELECT]]
102
100
;
103
101
%and = and i32 %x , 32
@@ -153,9 +151,8 @@ define <2 x i32> @select_icmp_ne_0_and_4096_or_4096_vec(<2 x i32> %x, <2 x i32>
153
151
define i32 @select_icmp_ne_0_and_4096_xor_4096 (i32 %x , i32 %y ) {
154
152
; CHECK-LABEL: @select_icmp_ne_0_and_4096_xor_4096(
155
153
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
156
- ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0
157
- ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096
158
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]
154
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], [[Y:%.*]]
155
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], 4096
159
156
; CHECK-NEXT: ret i32 [[SELECT]]
160
157
;
161
158
%and = and i32 %x , 4096
@@ -209,9 +206,7 @@ define <2 x i32> @select_icmp_eq_and_4096_0_or_4096_vec(<2 x i32> %x, <2 x i32>
209
206
define i32 @select_icmp_eq_and_4096_0_xor_4096 (i32 %x , i32 %y ) {
210
207
; CHECK-LABEL: @select_icmp_eq_and_4096_0_xor_4096(
211
208
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
212
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
213
- ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096
214
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]
209
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[AND]], [[Y:%.*]]
215
210
; CHECK-NEXT: ret i32 [[SELECT]]
216
211
;
217
212
%and = and i32 %x , 4096
@@ -267,8 +262,8 @@ define <2 x i32> @select_icmp_eq_0_and_1_or_1_vec(<2 x i64> %x, <2 x i32> %y) {
267
262
define i32 @select_icmp_eq_0_and_1_xor_1 (i64 %x , i32 %y ) {
268
263
; CHECK-LABEL: @select_icmp_eq_0_and_1_xor_1(
269
264
; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[X:%.*]] to i32
270
- ; CHECK-NEXT: [[XOR :%.*]] = and i32 [[TMP1]], 1
271
- ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[XOR ]], [[Y:%.*]]
265
+ ; CHECK-NEXT: [[TMP2 :%.*]] = and i32 [[TMP1]], 1
266
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2 ]], [[Y:%.*]]
272
267
; CHECK-NEXT: ret i32 [[SELECT]]
273
268
;
274
269
%and = and i64 %x , 1
@@ -310,10 +305,10 @@ define i32 @select_icmp_ne_0_and_4096_or_32(i32 %x, i32 %y) {
310
305
311
306
define i32 @select_icmp_ne_0_and_4096_xor_32 (i32 %x , i32 %y ) {
312
307
; CHECK-LABEL: @select_icmp_ne_0_and_4096_xor_32(
313
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
314
- ; CHECK-NEXT: [[CMP_NOT :%.*]] = icmp eq i32 [[AND]], 0
315
- ; CHECK-NEXT: [[XOR :%.*]] = xor i32 [[Y:%.*]], 32
316
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR ]], i32 [[Y]]
308
+ ; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 7
309
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[AND]], 32
310
+ ; CHECK-NEXT: [[TMP2 :%.*]] = xor i32 [[TMP1]], [[ Y:%.*]]
311
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2 ]], 32
317
312
; CHECK-NEXT: ret i32 [[SELECT]]
318
313
;
319
314
%and = and i32 %x , 4096
@@ -370,10 +365,10 @@ define <2 x i32> @select_icmp_ne_0_and_32_or_4096_vec(<2 x i32> %x, <2 x i32> %y
370
365
371
366
define i32 @select_icmp_ne_0_and_32_xor_4096 (i32 %x , i32 %y ) {
372
367
; CHECK-LABEL: @select_icmp_ne_0_and_32_xor_4096(
373
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 32
374
- ; CHECK-NEXT: [[CMP_NOT :%.*]] = icmp eq i32 [[AND]], 0
375
- ; CHECK-NEXT: [[XOR :%.*]] = xor i32 [[Y:%.*]], 4096
376
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR ]], i32 [[Y]]
368
+ ; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 7
369
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[AND]], 4096
370
+ ; CHECK-NEXT: [[TMP2 :%.*]] = xor i32 [[TMP1]], [[ Y:%.*]]
371
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2 ]], 4096
377
372
; CHECK-NEXT: ret i32 [[SELECT]]
378
373
;
379
374
%and = and i32 %x , 32
@@ -532,9 +527,8 @@ define i32 @select_icmp_and_8_eq_0_xor_8(i32 %x) {
532
527
define i64 @select_icmp_x_and_8_eq_0_y_xor_8 (i32 %x , i64 %y ) {
533
528
; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_xor_8(
534
529
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8
535
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
536
- ; CHECK-NEXT: [[XOR:%.*]] = xor i64 [[Y:%.*]], 8
537
- ; CHECK-NEXT: [[Y_XOR:%.*]] = select i1 [[CMP]], i64 [[Y]], i64 [[XOR]]
530
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[AND]] to i64
531
+ ; CHECK-NEXT: [[Y_XOR:%.*]] = xor i64 [[TMP1]], [[Y:%.*]]
538
532
; CHECK-NEXT: ret i64 [[Y_XOR]]
539
533
;
540
534
%and = and i32 %x , 8
@@ -547,9 +541,9 @@ define i64 @select_icmp_x_and_8_eq_0_y_xor_8(i32 %x, i64 %y) {
547
541
define i64 @select_icmp_x_and_8_ne_0_y_xor_8 (i32 %x , i64 %y ) {
548
542
; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_xor_8(
549
543
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 8
550
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq i32 [[AND]], 0
551
- ; CHECK-NEXT: [[XOR :%.*]] = xor i64 [[Y:%.*]], 8
552
- ; CHECK-NEXT: [[XOR_Y:%.*]] = select i1 [[CMP]], i64 [[XOR ]], i64 [[Y]]
544
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[AND]], 8
545
+ ; CHECK-NEXT: [[TMP2 :%.*]] = zext i32 [[TMP1]] to i64
546
+ ; CHECK-NEXT: [[XOR_Y:%.*]] = xor i64 [[TMP2 ]], [[Y:%.* ]]
553
547
; CHECK-NEXT: ret i64 [[XOR_Y]]
554
548
;
555
549
%and = and i32 %x , 8
@@ -670,10 +664,9 @@ define <2 x i32> @test68vec(<2 x i32> %x, <2 x i32> %y) {
670
664
671
665
define i32 @test68_xor (i32 %x , i32 %y ) {
672
666
; CHECK-LABEL: @test68_xor(
673
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 128
674
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
675
- ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2
676
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]
667
+ ; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 6
668
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2
669
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], [[Y:%.*]]
677
670
; CHECK-NEXT: ret i32 [[SELECT]]
678
671
;
679
672
%and = and i32 %x , 128
@@ -730,10 +723,10 @@ define <2 x i32> @test69vec(<2 x i32> %x, <2 x i32> %y) {
730
723
731
724
define i32 @test69_xor (i32 %x , i32 %y ) {
732
725
; CHECK-LABEL: @test69_xor(
733
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 128
734
- ; CHECK-NEXT: [[CMP_NOT :%.*]] = icmp eq i32 [[AND]], 0
735
- ; CHECK-NEXT: [[XOR :%.*]] = xor i32 [[Y:%.*]], 2
736
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR ]], i32 [[Y]]
726
+ ; CHECK-NEXT: [[AND:%.*]] = lshr i32 [[X:%.*]], 6
727
+ ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[AND]], 2
728
+ ; CHECK-NEXT: [[TMP2 :%.*]] = xor i32 [[TMP1]], [[ Y:%.*]]
729
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP2 ]], 2
737
730
; CHECK-NEXT: ret i32 [[SELECT]]
738
731
;
739
732
%and = and i32 %x , 128
@@ -805,10 +798,10 @@ define i32 @shift_no_xor_multiuse_or(i32 %x, i32 %y) {
805
798
806
799
define i32 @shift_no_xor_multiuse_xor (i32 %x , i32 %y ) {
807
800
; CHECK-LABEL: @shift_no_xor_multiuse_xor(
808
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1
809
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
810
801
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 2
811
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]
802
+ ; CHECK-NEXT: [[AND:%.*]] = shl i32 [[X:%.*]], 1
803
+ ; CHECK-NEXT: [[TMP1:%.*]] = and i32 [[AND]], 2
804
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], [[Y]]
812
805
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]
813
806
; CHECK-NEXT: ret i32 [[RES]]
814
807
;
@@ -856,9 +849,8 @@ define i32 @no_shift_no_xor_multiuse_or(i32 %x, i32 %y) {
856
849
define i32 @no_shift_no_xor_multiuse_xor (i32 %x , i32 %y ) {
857
850
; CHECK-LABEL: @no_shift_no_xor_multiuse_xor(
858
851
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
859
- ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
860
852
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096
861
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y ]], i32 [[XOR ]]
853
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[AND ]], [[Y ]]
862
854
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]
863
855
; CHECK-NEXT: ret i32 [[RES]]
864
856
;
@@ -907,9 +899,9 @@ define i32 @no_shift_xor_multiuse_or(i32 %x, i32 %y) {
907
899
define i32 @no_shift_xor_multiuse_xor (i32 %x , i32 %y ) {
908
900
; CHECK-LABEL: @no_shift_xor_multiuse_xor(
909
901
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
910
- ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0
911
902
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096
912
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR]], i32 [[Y]]
903
+ ; CHECK-NEXT: [[TMP1:%.*]] = xor i32 [[AND]], [[Y]]
904
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1]], 4096
913
905
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[XOR]]
914
906
; CHECK-NEXT: ret i32 [[RES]]
915
907
;
@@ -1012,8 +1004,8 @@ define i32 @shift_no_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) {
1012
1004
; CHECK-LABEL: @shift_no_xor_multiuse_cmp_with_xor(
1013
1005
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 1
1014
1006
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
1015
- ; CHECK-NEXT: [[XOR :%.*]] = xor i32 [[Y:%.* ]], 2
1016
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y ]], i32 [[XOR ]]
1007
+ ; CHECK-NEXT: [[TMP1 :%.*]] = shl nuw nsw i32 [[AND ]], 1
1008
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1 ]], [[Y:%.* ]]
1017
1009
; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]
1018
1010
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]
1019
1011
; CHECK-NEXT: ret i32 [[RES]]
@@ -1068,8 +1060,7 @@ define i32 @no_shift_no_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w
1068
1060
; CHECK-LABEL: @no_shift_no_xor_multiuse_cmp_with_xor(
1069
1061
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
1070
1062
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
1071
- ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096
1072
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y]], i32 [[XOR]]
1063
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[AND]], [[Y:%.*]]
1073
1064
; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]
1074
1065
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]
1075
1066
; CHECK-NEXT: ret i32 [[RES]]
@@ -1125,8 +1116,8 @@ define i32 @no_shift_xor_multiuse_cmp_with_xor(i32 %x, i32 %y, i32 %z, i32 %w) {
1125
1116
; CHECK-LABEL: @no_shift_xor_multiuse_cmp_with_xor(
1126
1117
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
1127
1118
; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[AND]], 0
1128
- ; CHECK-NEXT: [[XOR :%.*]] = xor i32 [[Y:%.*]], 4096
1129
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP_NOT]], i32 [[XOR ]], i32 [[Y]]
1119
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[AND]], [[ Y:%.*]]
1120
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[TMP1 ]], 4096
1130
1121
; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP_NOT]], i32 [[W:%.*]], i32 [[Z:%.*]]
1131
1122
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]
1132
1123
; CHECK-NEXT: ret i32 [[RES]]
@@ -1305,7 +1296,7 @@ define i32 @no_shift_no_xor_multiuse_cmp_xor(i32 %x, i32 %y, i32 %z, i32 %w) {
1305
1296
; CHECK-NEXT: [[AND:%.*]] = and i32 [[X:%.*]], 4096
1306
1297
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[AND]], 0
1307
1298
; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[Y:%.*]], 4096
1308
- ; CHECK-NEXT: [[SELECT:%.*]] = select i1 [[CMP]], i32 [[Y ]], i32 [[XOR ]]
1299
+ ; CHECK-NEXT: [[SELECT:%.*]] = xor i32 [[AND ]], [[Y ]]
1309
1300
; CHECK-NEXT: [[SELECT2:%.*]] = select i1 [[CMP]], i32 [[Z:%.*]], i32 [[W:%.*]]
1310
1301
; CHECK-NEXT: [[RES:%.*]] = mul i32 [[SELECT]], [[SELECT2]]
1311
1302
; CHECK-NEXT: [[RES2:%.*]] = mul i32 [[RES]], [[XOR]]
@@ -1606,10 +1597,9 @@ define i64 @xor_i8_to_i64_shl_save_and_eq(i8 %x, i64 %y) {
1606
1597
1607
1598
define i64 @xor_i8_to_i64_shl_save_and_ne (i8 %x , i64 %y ) {
1608
1599
; CHECK-LABEL: @xor_i8_to_i64_shl_save_and_ne(
1609
- ; CHECK-NEXT: [[XX:%.*]] = and i8 [[X:%.*]], 1
1610
- ; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i8 [[XX]], 0
1611
- ; CHECK-NEXT: [[Z:%.*]] = xor i64 [[Y:%.*]], -9223372036854775808
1612
- ; CHECK-NEXT: [[R:%.*]] = select i1 [[CMP_NOT]], i64 [[Y]], i64 [[Z]]
1600
+ ; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[X:%.*]] to i64
1601
+ ; CHECK-NEXT: [[TMP2:%.*]] = shl i64 [[TMP1]], 63
1602
+ ; CHECK-NEXT: [[R:%.*]] = xor i64 [[TMP2]], [[Y:%.*]]
1613
1603
; CHECK-NEXT: ret i64 [[R]]
1614
1604
;
1615
1605
%xx = and i8 %x , 1
0 commit comments