@@ -289,6 +289,87 @@ define i32 @abs_abs_x16(i32 %x) {
289
289
ret i32 %cond18
290
290
}
291
291
292
+ ; abs(abs(-x)) -> abs(-x)
293
+ define i32 @abs_abs_x17 (i32 %x ) {
294
+ ; CHECK-LABEL: @abs_abs_x17(
295
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[X:%.*]]
296
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], 0
297
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[X]]
298
+ ; CHECK-NEXT: ret i32 [[COND]]
299
+ ;
300
+ %sub = sub nsw i32 0 , %x
301
+ %cmp = icmp sgt i32 %sub , -1
302
+ %cond = select i1 %cmp , i32 %sub , i32 %x
303
+ %cmp1 = icmp sgt i32 %cond , -1
304
+ %sub16 = sub nsw i32 0 , %cond
305
+ %cond18 = select i1 %cmp1 , i32 %cond , i32 %sub16
306
+ ret i32 %cond18
307
+ }
308
+
309
+ ; abs(abs(x - y)) -> abs(x - y)
310
+ define i32 @abs_abs_x18 (i32 %x , i32 %y ) {
311
+ ; CHECK-LABEL: @abs_abs_x18(
312
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
313
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw i32 [[Y]], [[X]]
314
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
315
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[A]], i32 [[B]]
316
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[COND]], 0
317
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
318
+ ; CHECK-NEXT: [[COND18:%.*]] = select i1 [[CMP1]], i32 [[SUB16]], i32 [[COND]]
319
+ ; CHECK-NEXT: ret i32 [[COND18]]
320
+ ;
321
+ %a = sub nsw i32 %x , %y
322
+ %b = sub nsw i32 %y , %x
323
+ %cmp = icmp sgt i32 %a , -1
324
+ %cond = select i1 %cmp , i32 %a , i32 %b
325
+ %cmp1 = icmp sgt i32 %cond , -1
326
+ %sub16 = sub nsw i32 0 , %cond
327
+ %cond18 = select i1 %cmp1 , i32 %cond , i32 %sub16
328
+ ret i32 %cond18
329
+ }
330
+
331
+ ; abs(abs(-x)) -> abs(-x)
332
+ define <2 x i32 > @abs_abs_x02_vec (<2 x i32 > %x ) {
333
+ ; CHECK-LABEL: @abs_abs_x02_vec(
334
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]]
335
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SUB]], <i32 -1, i32 -1>
336
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[SUB]], <2 x i32> [[X]]
337
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
338
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
339
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[SUB16]], <2 x i32> [[COND]]
340
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
341
+ ;
342
+ %sub = sub nsw <2 x i32 > zeroinitializer , %x
343
+ %cmp = icmp sgt <2 x i32 > %sub , <i32 -1 , i32 -1 >
344
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %sub , <2 x i32 > %x
345
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
346
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
347
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %cond , <2 x i32 > %sub16
348
+ ret <2 x i32 > %cond18
349
+ }
350
+
351
+ ; abs(abs(x - y)) -> abs(x - y)
352
+ define <2 x i32 > @abs_abs_x03_vec (<2 x i32 > %x , <2 x i32 > %y ) {
353
+ ; CHECK-LABEL: @abs_abs_x03_vec(
354
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
355
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw <2 x i32> [[Y:%.*]], [[X:%.*]]
356
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[A]], <i32 -1, i32 -1>
357
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[A]], <2 x i32> [[B]]
358
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
359
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
360
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[SUB16]], <2 x i32> [[COND]]
361
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
362
+ ;
363
+ %a = sub nsw <2 x i32 > %x , %y
364
+ %b = sub nsw <2 x i32 > %y , %x
365
+ %cmp = icmp sgt <2 x i32 > %a , <i32 -1 , i32 -1 >
366
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %a , <2 x i32 > %b
367
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
368
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
369
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %cond , <2 x i32 > %sub16
370
+ ret <2 x i32 > %cond18
371
+ }
372
+
292
373
define i32 @nabs_nabs_x01 (i32 %x ) {
293
374
; CHECK-LABEL: @nabs_nabs_x01(
294
375
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
@@ -545,6 +626,89 @@ define i32 @nabs_nabs_x16(i32 %x) {
545
626
ret i32 %cond18
546
627
}
547
628
629
+ ; nabs(nabs(-x)) -> nabs(-x)
630
+ define i32 @nabs_nabs_x17 (i32 %x ) {
631
+ ; CHECK-LABEL: @nabs_nabs_x17(
632
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[X:%.*]]
633
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], 0
634
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[X]], i32 [[SUB]]
635
+ ; CHECK-NEXT: ret i32 [[COND]]
636
+ ;
637
+ %sub = sub nsw i32 0 , %x
638
+ %cmp = icmp sgt i32 %sub , -1
639
+ %cond = select i1 %cmp , i32 %x , i32 %sub
640
+ %cmp1 = icmp sgt i32 %cond , -1
641
+ %sub16 = sub nsw i32 0 , %cond
642
+ %cond18 = select i1 %cmp1 , i32 %sub16 , i32 %cond
643
+ ret i32 %cond18
644
+ }
645
+
646
+ ; nabs(nabs(x - y)) -> nabs(x - y)
647
+ define i32 @nabs_nabs_x18 (i32 %x , i32 %y ) {
648
+ ; CHECK-LABEL: @nabs_nabs_x18(
649
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
650
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw i32 [[Y]], [[X]]
651
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
652
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[B]], i32 [[A]]
653
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[COND]], 0
654
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
655
+ ; CHECK-NEXT: [[COND18:%.*]] = select i1 [[CMP1]], i32 [[COND]], i32 [[SUB16]]
656
+ ; CHECK-NEXT: ret i32 [[COND18]]
657
+ ;
658
+ %a = sub nsw i32 %x , %y
659
+ %b = sub nsw i32 %y , %x
660
+ %cmp = icmp sgt i32 %a , -1
661
+ %cond = select i1 %cmp , i32 %b , i32 %a
662
+ %cmp1 = icmp sgt i32 %cond , -1
663
+ %sub16 = sub nsw i32 0 , %cond
664
+ %cond18 = select i1 %cmp1 , i32 %sub16 , i32 %cond
665
+ ret i32 %cond18
666
+ }
667
+
668
+ ; nabs(nabs(-x)) -> nabs(-x)
669
+ define <2 x i32 > @nabs_nabs_x01_vec (<2 x i32 > %x ) {
670
+ ; CHECK-LABEL: @nabs_nabs_x01_vec(
671
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]]
672
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SUB]], <i32 -1, i32 -1>
673
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[X]], <2 x i32> [[SUB]]
674
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
675
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
676
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[COND]], <2 x i32> [[SUB16]]
677
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
678
+ ;
679
+
680
+ ;
681
+ %sub = sub nsw <2 x i32 > zeroinitializer , %x
682
+ %cmp = icmp sgt <2 x i32 > %sub , <i32 -1 , i32 -1 >
683
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %x , <2 x i32 > %sub
684
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
685
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
686
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %sub16 , <2 x i32 > %cond
687
+ ret <2 x i32 > %cond18
688
+ }
689
+
690
+ ; nabs(nabs(x - y)) -> nabs(x - y)
691
+ define <2 x i32 > @nabs_nabs_x02_vec (<2 x i32 > %x , <2 x i32 > %y ) {
692
+ ; CHECK-LABEL: @nabs_nabs_x02_vec(
693
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
694
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw <2 x i32> [[Y:%.*]], [[X:%.*]]
695
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[A]], <i32 -1, i32 -1>
696
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[B]], <2 x i32> [[A]]
697
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
698
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
699
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[COND]], <2 x i32> [[SUB16]]
700
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
701
+ ;
702
+ %a = sub nsw <2 x i32 > %x , %y
703
+ %b = sub nsw <2 x i32 > %y , %x
704
+ %cmp = icmp sgt <2 x i32 > %a , <i32 -1 , i32 -1 >
705
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %b , <2 x i32 > %a
706
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
707
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
708
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %sub16 , <2 x i32 > %cond
709
+ ret <2 x i32 > %cond18
710
+ }
711
+
548
712
define i32 @abs_nabs_x01 (i32 %x ) {
549
713
; CHECK-LABEL: @abs_nabs_x01(
550
714
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
@@ -801,6 +965,87 @@ define i32 @abs_nabs_x16(i32 %x) {
801
965
ret i32 %cond18
802
966
}
803
967
968
+ ; abs(nabs(-x)) -> abs(-x)
969
+ define i32 @abs_nabs_x17 (i32 %x ) {
970
+ ; CHECK-LABEL: @abs_nabs_x17(
971
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[X:%.*]]
972
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], 0
973
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[SUB]], i32 [[X]]
974
+ ; CHECK-NEXT: ret i32 [[COND1]]
975
+ ;
976
+ %sub = sub nsw i32 0 , %x
977
+ %cmp = icmp sgt i32 %sub , -1
978
+ %cond = select i1 %cmp , i32 %x , i32 %sub
979
+ %cmp1 = icmp sgt i32 %cond , -1
980
+ %sub16 = sub nsw i32 0 , %cond
981
+ %cond18 = select i1 %cmp1 , i32 %cond , i32 %sub16
982
+ ret i32 %cond18
983
+ }
984
+
985
+ ; abs(nabs(x - y)) -> abs(x - y)
986
+ define i32 @abs_nabs_x18 (i32 %x , i32 %y ) {
987
+ ; CHECK-LABEL: @abs_nabs_x18(
988
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
989
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw i32 [[Y]], [[X]]
990
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
991
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[B]], i32 [[A]]
992
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[COND]], 0
993
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
994
+ ; CHECK-NEXT: [[COND18:%.*]] = select i1 [[CMP1]], i32 [[SUB16]], i32 [[COND]]
995
+ ; CHECK-NEXT: ret i32 [[COND18]]
996
+ ;
997
+ %a = sub nsw i32 %x , %y
998
+ %b = sub nsw i32 %y , %x
999
+ %cmp = icmp sgt i32 %a , -1
1000
+ %cond = select i1 %cmp , i32 %b , i32 %a
1001
+ %cmp1 = icmp sgt i32 %cond , -1
1002
+ %sub16 = sub nsw i32 0 , %cond
1003
+ %cond18 = select i1 %cmp1 , i32 %cond , i32 %sub16
1004
+ ret i32 %cond18
1005
+ }
1006
+
1007
+ ; abs(nabs(-x)) -> abs(-x)
1008
+ define <2 x i32 > @abs_nabs_x01_vec (<2 x i32 > %x ) {
1009
+ ; CHECK-LABEL: @abs_nabs_x01_vec(
1010
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]]
1011
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SUB]], <i32 -1, i32 -1>
1012
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[X]], <2 x i32> [[SUB]]
1013
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
1014
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
1015
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[SUB16]], <2 x i32> [[COND]]
1016
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
1017
+ ;
1018
+ %sub = sub nsw <2 x i32 > zeroinitializer , %x
1019
+ %cmp = icmp sgt <2 x i32 > %sub , <i32 -1 , i32 -1 >
1020
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %x , <2 x i32 > %sub
1021
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
1022
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
1023
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %cond , <2 x i32 > %sub16
1024
+ ret <2 x i32 > %cond18
1025
+ }
1026
+
1027
+ ; abs(nabs(x - y)) -> abs(x - y)
1028
+ define <2 x i32 > @abs_nabs_x02_vec (<2 x i32 > %x , <2 x i32 > %y ) {
1029
+ ; CHECK-LABEL: @abs_nabs_x02_vec(
1030
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
1031
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw <2 x i32> [[Y:%.*]], [[X:%.*]]
1032
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[A]], <i32 -1, i32 -1>
1033
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[B]], <2 x i32> [[A]]
1034
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
1035
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
1036
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[SUB16]], <2 x i32> [[COND]]
1037
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
1038
+ ;
1039
+ %a = sub nsw <2 x i32 > %x , %y
1040
+ %b = sub nsw <2 x i32 > %y , %x
1041
+ %cmp = icmp sgt <2 x i32 > %a , <i32 -1 , i32 -1 >
1042
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %b , <2 x i32 > %a
1043
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
1044
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
1045
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %cond , <2 x i32 > %sub16
1046
+ ret <2 x i32 > %cond18
1047
+ }
1048
+
804
1049
define i32 @nabs_abs_x01 (i32 %x ) {
805
1050
; CHECK-LABEL: @nabs_abs_x01(
806
1051
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 0
@@ -1057,3 +1302,84 @@ define i32 @nabs_abs_x16(i32 %x) {
1057
1302
ret i32 %cond18
1058
1303
}
1059
1304
1305
+ ; nabs(abs(-x)) -> nabs(-x)
1306
+ define i32 @nabs_abs_x17 (i32 %x ) {
1307
+ ; CHECK-LABEL: @nabs_abs_x17(
1308
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 0, [[X:%.*]]
1309
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[X]], 0
1310
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[X]], i32 [[SUB]]
1311
+ ; CHECK-NEXT: ret i32 [[COND1]]
1312
+ ;
1313
+ %sub = sub nsw i32 0 , %x
1314
+ %cmp = icmp sgt i32 %sub , -1
1315
+ %cond = select i1 %cmp , i32 %sub , i32 %x
1316
+ %cmp1 = icmp sgt i32 %cond , -1
1317
+ %sub16 = sub nsw i32 0 , %cond
1318
+ %cond18 = select i1 %cmp1 , i32 %sub16 , i32 %cond
1319
+ ret i32 %cond18
1320
+ }
1321
+
1322
+ ; nabs(abs(x - y)) -> nabs(x - y)
1323
+ define i32 @nabs_abs_x18 (i32 %x , i32 %y ) {
1324
+ ; CHECK-LABEL: @nabs_abs_x18(
1325
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw i32 [[X:%.*]], [[Y:%.*]]
1326
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw i32 [[Y]], [[X]]
1327
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[A]], -1
1328
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], i32 [[A]], i32 [[B]]
1329
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[COND]], 0
1330
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw i32 0, [[COND]]
1331
+ ; CHECK-NEXT: [[COND18:%.*]] = select i1 [[CMP1]], i32 [[COND]], i32 [[SUB16]]
1332
+ ; CHECK-NEXT: ret i32 [[COND18]]
1333
+ ;
1334
+ %a = sub nsw i32 %x , %y
1335
+ %b = sub nsw i32 %y , %x
1336
+ %cmp = icmp sgt i32 %a , -1
1337
+ %cond = select i1 %cmp , i32 %a , i32 %b
1338
+ %cmp1 = icmp sgt i32 %cond , -1
1339
+ %sub16 = sub nsw i32 0 , %cond
1340
+ %cond18 = select i1 %cmp1 , i32 %sub16 , i32 %cond
1341
+ ret i32 %cond18
1342
+ }
1343
+
1344
+ ; nabs(abs(-x)) -> nabs(-x)
1345
+ define <2 x i32 > @nabs_abs_x01_vec (<2 x i32 > %x ) {
1346
+ ; CHECK-LABEL: @nabs_abs_x01_vec(
1347
+ ; CHECK-NEXT: [[SUB:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]]
1348
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[SUB]], <i32 -1, i32 -1>
1349
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[SUB]], <2 x i32> [[X]]
1350
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
1351
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
1352
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[COND]], <2 x i32> [[SUB16]]
1353
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
1354
+ ;
1355
+ ;
1356
+ %sub = sub nsw <2 x i32 > zeroinitializer , %x
1357
+ %cmp = icmp sgt <2 x i32 > %sub , <i32 -1 , i32 -1 >
1358
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %sub , <2 x i32 > %x
1359
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
1360
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
1361
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %sub16 , <2 x i32 > %cond
1362
+ ret <2 x i32 > %cond18
1363
+ }
1364
+
1365
+ ; nabs(abs(x - y)) -> nabs(x - y)
1366
+ define <2 x i32 > @nabs_abs_x02_vec (<2 x i32 > %x , <2 x i32 > %y ) {
1367
+ ; CHECK-LABEL: @nabs_abs_x02_vec(
1368
+ ; CHECK-NEXT: [[A:%.*]] = sub nsw <2 x i32> [[X:%.*]], [[Y:%.*]]
1369
+ ; CHECK-NEXT: [[B:%.*]] = sub nsw <2 x i32> [[Y:%.*]], [[X:%.*]]
1370
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt <2 x i32> [[A]], <i32 -1, i32 -1>
1371
+ ; CHECK-NEXT: [[COND:%.*]] = select <2 x i1> [[CMP]], <2 x i32> [[A]], <2 x i32> [[B]]
1372
+ ; CHECK-NEXT: [[CMP1:%.*]] = icmp slt <2 x i32> [[COND]], zeroinitializer
1373
+ ; CHECK-NEXT: [[SUB16:%.*]] = sub nsw <2 x i32> zeroinitializer, [[COND]]
1374
+ ; CHECK-NEXT: [[COND18:%.*]] = select <2 x i1> [[CMP1]], <2 x i32> [[COND]], <2 x i32> [[SUB16]]
1375
+ ; CHECK-NEXT: ret <2 x i32> [[COND18]]
1376
+ ;
1377
+ %a = sub nsw <2 x i32 > %x , %y
1378
+ %b = sub nsw <2 x i32 > %y , %x
1379
+ %cmp = icmp sgt <2 x i32 > %a , <i32 -1 , i32 -1 >
1380
+ %cond = select <2 x i1 > %cmp , <2 x i32 > %a , <2 x i32 > %b
1381
+ %cmp1 = icmp sgt <2 x i32 > %cond , <i32 -1 , i32 -1 >
1382
+ %sub16 = sub nsw <2 x i32 > zeroinitializer , %cond
1383
+ %cond18 = select <2 x i1 > %cmp1 , <2 x i32 > %sub16 , <2 x i32 > %cond
1384
+ ret <2 x i32 > %cond18
1385
+ }
0 commit comments