@@ -4580,9 +4580,8 @@ define i32 @src_select_xxory_eq0_xorxy_y(i32 %x, i32 %y) {
4580
4580
4581
4581
define i32 @sequence_select_with_same_cond_false (i1 %c1 , i1 %c2 ){
4582
4582
; CHECK-LABEL: @sequence_select_with_same_cond_false(
4583
- ; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1:%.*]], i32 23, i32 45
4584
- ; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 666, i32 [[S1]]
4585
- ; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1]], i32 789, i32 [[S2]]
4583
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 666, i32 45
4584
+ ; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1:%.*]], i32 789, i32 [[S2]]
4586
4585
; CHECK-NEXT: ret i32 [[S3]]
4587
4586
;
4588
4587
%s1 = select i1 %c1 , i32 23 , i32 45
@@ -4593,9 +4592,8 @@ define i32 @sequence_select_with_same_cond_false(i1 %c1, i1 %c2){
4593
4592
4594
4593
define i32 @sequence_select_with_same_cond_true (i1 %c1 , i1 %c2 ){
4595
4594
; CHECK-LABEL: @sequence_select_with_same_cond_true(
4596
- ; CHECK-NEXT: [[S1:%.*]] = select i1 [[C1:%.*]], i32 45, i32 23
4597
- ; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 [[S1]], i32 666
4598
- ; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1]], i32 [[S2]], i32 789
4595
+ ; CHECK-NEXT: [[S2:%.*]] = select i1 [[C2:%.*]], i32 45, i32 666
4596
+ ; CHECK-NEXT: [[S3:%.*]] = select i1 [[C1:%.*]], i32 [[S2]], i32 789
4599
4597
; CHECK-NEXT: ret i32 [[S3]]
4600
4598
;
4601
4599
%s1 = select i1 %c1 , i32 45 , i32 23
@@ -4766,3 +4764,82 @@ define i32 @sel_extractvalue_simplify(i1 %c, { i32, i32 } %agg1, i32 %x, i32 %y)
4766
4764
%res = extractvalue { i32 , i32 } %sel , 1
4767
4765
ret i32 %res
4768
4766
}
4767
+
4768
+ define i1 @replace_select_cond_true (i1 %cond , i32 %v1 , i32 %v2 , i32 %v3 ) {
4769
+ ; CHECK-LABEL: @replace_select_cond_true(
4770
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SEL:%.*]], [[V2:%.*]]
4771
+ ; CHECK-NEXT: [[AND:%.*]] = select i1 [[COND:%.*]], i1 [[CMP]], i1 false
4772
+ ; CHECK-NEXT: ret i1 [[AND]]
4773
+ ;
4774
+ %sel = select i1 %cond , i32 %v1 , i32 %v3
4775
+ %cmp = icmp eq i32 %sel , %v2
4776
+ %and = select i1 %cond , i1 %cmp , i1 false
4777
+ ret i1 %and
4778
+ }
4779
+
4780
+ define i1 @replace_select_cond_false (i1 %cond , i32 %v1 , i32 %v2 , i32 %v3 ) {
4781
+ ; CHECK-LABEL: @replace_select_cond_false(
4782
+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[SEL:%.*]], [[V2:%.*]]
4783
+ ; CHECK-NEXT: [[OR:%.*]] = select i1 [[COND:%.*]], i1 true, i1 [[CMP]]
4784
+ ; CHECK-NEXT: ret i1 [[OR]]
4785
+ ;
4786
+ %sel = select i1 %cond , i32 %v1 , i32 %v3
4787
+ %cmp = icmp eq i32 %sel , %v2
4788
+ %or = select i1 %cond , i1 true , i1 %cmp
4789
+ ret i1 %or
4790
+ }
4791
+
4792
+ define i32 @replace_and_cond (i1 %cond1 , i1 %cond2 ) {
4793
+ ; CHECK-LABEL: @replace_and_cond(
4794
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND:%.*]], i32 3, i32 2
4795
+ ; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1:%.*]], i32 [[SEL]], i32 1
4796
+ ; CHECK-NEXT: ret i32 [[MUX]]
4797
+ ;
4798
+ %and = and i1 %cond1 , %cond2
4799
+ %sel = select i1 %and , i32 3 , i32 2
4800
+ %mux = select i1 %cond1 , i32 %sel , i32 1
4801
+ ret i32 %mux
4802
+ }
4803
+
4804
+ define <2 x i32 > @replace_and_cond_vec (<2 x i1 > %cond1 , <2 x i1 > %cond2 ) {
4805
+ ; CHECK-LABEL: @replace_and_cond_vec(
4806
+ ; CHECK-NEXT: [[SEL:%.*]] = select <2 x i1> [[COND2:%.*]], <2 x i32> splat (i32 3), <2 x i32> splat (i32 2)
4807
+ ; CHECK-NEXT: [[MUX:%.*]] = select <2 x i1> [[COND1:%.*]], <2 x i32> [[SEL]], <2 x i32> splat (i32 1)
4808
+ ; CHECK-NEXT: ret <2 x i32> [[MUX]]
4809
+ ;
4810
+ %and = and <2 x i1 > %cond1 , %cond2
4811
+ %sel = select <2 x i1 > %and , <2 x i32 > splat(i32 3 ), <2 x i32 > splat(i32 2 )
4812
+ %mux = select <2 x i1 > %cond1 , <2 x i32 > %sel , <2 x i32 > splat(i32 1 )
4813
+ ret <2 x i32 > %mux
4814
+ }
4815
+
4816
+ ; TODO: We can still replace the use of %and with %cond2
4817
+ define i32 @replace_and_cond_multiuse1 (i1 %cond1 , i1 %cond2 ) {
4818
+ ; CHECK-LABEL: @replace_and_cond_multiuse1(
4819
+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]]
4820
+ ; CHECK-NEXT: call void @use(i1 [[AND]])
4821
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2
4822
+ ; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1
4823
+ ; CHECK-NEXT: ret i32 [[MUX]]
4824
+ ;
4825
+ %and = and i1 %cond1 , %cond2
4826
+ call void @use (i1 %and )
4827
+ %sel = select i1 %and , i32 3 , i32 2
4828
+ %mux = select i1 %cond1 , i32 %sel , i32 1
4829
+ ret i32 %mux
4830
+ }
4831
+
4832
+ define i32 @replace_and_cond_multiuse2 (i1 %cond1 , i1 %cond2 ) {
4833
+ ; CHECK-LABEL: @replace_and_cond_multiuse2(
4834
+ ; CHECK-NEXT: [[AND:%.*]] = and i1 [[COND1:%.*]], [[COND2:%.*]]
4835
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[AND]], i32 3, i32 2
4836
+ ; CHECK-NEXT: call void @use32(i32 [[SEL]])
4837
+ ; CHECK-NEXT: [[MUX:%.*]] = select i1 [[COND1]], i32 [[SEL]], i32 1
4838
+ ; CHECK-NEXT: ret i32 [[MUX]]
4839
+ ;
4840
+ %and = and i1 %cond1 , %cond2
4841
+ %sel = select i1 %and , i32 3 , i32 2
4842
+ call void @use32 (i32 %sel )
4843
+ %mux = select i1 %cond1 , i32 %sel , i32 1
4844
+ ret i32 %mux
4845
+ }
0 commit comments