@@ -468,7 +468,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_logical(i32 %k, i32 %c
468
468
; CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
469
469
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
470
470
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
471
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
471
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
472
472
; CHECK-NEXT: ret i1 [[OR]]
473
473
;
474
474
%t0 = shl i32 1 , %c1
@@ -506,7 +506,7 @@ define i1 @foo1_or_signbit_lshr_without_shifting_signbit_logical(i32 %k, i32 %c1
506
506
; CHECK-NEXT: [[T2:%.*]] = icmp ne i32 [[T1]], 0
507
507
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
508
508
; CHECK-NEXT: [[T4:%.*]] = icmp slt i32 [[T3]], 0
509
- ; CHECK-NEXT: [[OR:%.*]] = and i1 [[T2]], [[T4]]
509
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 [[T4]], i1 false
510
510
; CHECK-NEXT: ret i1 [[OR]]
511
511
;
512
512
%t0 = shl i32 1 , %c1
@@ -535,13 +535,15 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_both_sides(i32 %k, i32
535
535
ret i1 %or
536
536
}
537
537
538
+ ; %t2 can be poison where as %t0 isn't; merging these two is unsafe.
538
539
define i1 @foo1_and_signbit_lshr_without_shifting_signbit_both_sides_logical (i32 %k , i32 %c1 , i32 %c2 ) {
539
540
; CHECK-LABEL: @foo1_and_signbit_lshr_without_shifting_signbit_both_sides_logical(
540
541
; CHECK-NEXT: [[T0:%.*]] = shl i32 [[K:%.*]], [[C1:%.*]]
542
+ ; CHECK-NEXT: [[T1:%.*]] = icmp sgt i32 [[T0]], -1
541
543
; CHECK-NEXT: [[T2:%.*]] = shl i32 [[K]], [[C2:%.*]]
542
- ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[T0 ]], [[T2]]
543
- ; CHECK-NEXT: [[TMP2 :%.*]] = icmp sgt i32 [[TMP1 ]], -1
544
- ; CHECK-NEXT: ret i1 [[TMP2 ]]
544
+ ; CHECK-NEXT: [[T3 :%.*]] = icmp sgt i32 [[T2 ]], -1
545
+ ; CHECK-NEXT: [[OR :%.*]] = select i1 [[T1 ]], i1 true, i1 [[T3]]
546
+ ; CHECK-NEXT: ret i1 [[OR ]]
545
547
;
546
548
%t0 = shl i32 %k , %c1
547
549
%t1 = icmp sgt i32 %t0 , -1
@@ -567,13 +569,15 @@ define i1 @foo1_or_signbit_lshr_without_shifting_signbit_both_sides(i32 %k, i32
567
569
ret i1 %or
568
570
}
569
571
572
+ ; %t2 can be poison where as %t0 isn't; merging these two is unsafe.
570
573
define i1 @foo1_or_signbit_lshr_without_shifting_signbit_both_sides_logical (i32 %k , i32 %c1 , i32 %c2 ) {
571
574
; CHECK-LABEL: @foo1_or_signbit_lshr_without_shifting_signbit_both_sides_logical(
572
575
; CHECK-NEXT: [[T0:%.*]] = shl i32 [[K:%.*]], [[C1:%.*]]
576
+ ; CHECK-NEXT: [[T1:%.*]] = icmp slt i32 [[T0]], 0
573
577
; CHECK-NEXT: [[T2:%.*]] = shl i32 [[K]], [[C2:%.*]]
574
- ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[T0 ]], [[T2]]
575
- ; CHECK-NEXT: [[TMP2 :%.*]] = icmp slt i32 [[TMP1 ]], 0
576
- ; CHECK-NEXT: ret i1 [[TMP2 ]]
578
+ ; CHECK-NEXT: [[T3 :%.*]] = icmp slt i32 [[T2 ]], 0
579
+ ; CHECK-NEXT: [[OR :%.*]] = select i1 [[T1]], i1 [[T3 ]], i1 false
580
+ ; CHECK-NEXT: ret i1 [[OR ]]
577
581
;
578
582
%t0 = shl i32 %k , %c1
579
583
%t1 = icmp slt i32 %t0 , 0
@@ -886,7 +890,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_extra_use_shl1_logical
886
890
; CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
887
891
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
888
892
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
889
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
893
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
890
894
; CHECK-NEXT: ret i1 [[OR]]
891
895
;
892
896
%t0 = shl i32 1 , %c1
@@ -929,7 +933,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_extra_use_and_logical(
929
933
; CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
930
934
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
931
935
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
932
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
936
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
933
937
; CHECK-NEXT: ret i1 [[OR]]
934
938
;
935
939
%t0 = shl i32 1 , %c1
@@ -972,7 +976,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_extra_use_cmp1_logical
972
976
; CHECK-NEXT: store i1 [[T2]], i1* [[P:%.*]], align 1
973
977
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
974
978
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
975
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
979
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
976
980
; CHECK-NEXT: ret i1 [[OR]]
977
981
;
978
982
%t0 = shl i32 1 , %c1
@@ -1015,7 +1019,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_extra_use_shl2_logical
1015
1019
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
1016
1020
; CHECK-NEXT: store i32 [[T3]], i32* [[P:%.*]], align 4
1017
1021
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
1018
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
1022
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
1019
1023
; CHECK-NEXT: ret i1 [[OR]]
1020
1024
;
1021
1025
%t0 = shl i32 1 , %c1
@@ -1058,7 +1062,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_extra_use_cmp2_logical
1058
1062
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
1059
1063
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
1060
1064
; CHECK-NEXT: store i1 [[T4]], i1* [[P:%.*]], align 1
1061
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
1065
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
1062
1066
; CHECK-NEXT: ret i1 [[OR]]
1063
1067
;
1064
1068
%t0 = shl i32 1 , %c1
@@ -1100,7 +1104,7 @@ define i1 @foo1_and_signbit_lshr_without_shifting_signbit_not_pwr2_logical(i32 %
1100
1104
; CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
1101
1105
; CHECK-NEXT: [[T3:%.*]] = shl i32 [[K]], [[C2:%.*]]
1102
1106
; CHECK-NEXT: [[T4:%.*]] = icmp sgt i32 [[T3]], -1
1103
- ; CHECK-NEXT: [[OR:%.*]] = or i1 [[T2]], [[T4]]
1107
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[T2]], i1 true, i1 [[T4]]
1104
1108
; CHECK-NEXT: ret i1 [[OR]]
1105
1109
;
1106
1110
%t0 = shl i32 3 , %c1
0 commit comments