@@ -2529,8 +2529,8 @@ define i64 @test_and_or_constexpr_infloop() {
25292529
25302530define i32 @and_zext (i32 %a , i1 %b ) {
25312531; CHECK-LABEL: @and_zext(
2532- ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[A :%.*]], 1
2533- ; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.* ]], i32 [[TMP1]], i32 0
2532+ ; CHECK-NEXT: [[MASK :%.*]] = zext i1 [[B :%.*]] to i32
2533+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[MASK ]], [[A:%.*]]
25342534; CHECK-NEXT: ret i32 [[R]]
25352535;
25362536 %mask = zext i1 %b to i32
@@ -2540,8 +2540,8 @@ define i32 @and_zext(i32 %a, i1 %b) {
25402540
25412541define i32 @and_zext_commuted (i32 %a , i1 %b ) {
25422542; CHECK-LABEL: @and_zext_commuted(
2543- ; CHECK-NEXT: [[TMP1 :%.*]] = and i32 [[A :%.*]], 1
2544- ; CHECK-NEXT: [[R:%.*]] = select i1 [[B:%.* ]], i32 [[TMP1]], i32 0
2543+ ; CHECK-NEXT: [[MASK :%.*]] = zext i1 [[B :%.*]] to i32
2544+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[MASK ]], [[A:%.*]]
25452545; CHECK-NEXT: ret i32 [[R]]
25462546;
25472547 %mask = zext i1 %b to i32
@@ -2564,8 +2564,8 @@ define i32 @and_zext_multiuse(i32 %a, i1 %b) {
25642564
25652565define <2 x i32 > @and_zext_vec (<2 x i32 > %a , <2 x i1 > %b ) {
25662566; CHECK-LABEL: @and_zext_vec(
2567- ; CHECK-NEXT: [[TMP1 :%.*]] = and <2 x i32 > [[A :%.*]], <i32 1, i32 1 >
2568- ; CHECK-NEXT: [[R:%.*]] = select <2 x i1 > [[B:%.* ]], <2 x i32> [[TMP1]], <2 x i32> zeroinitializer
2567+ ; CHECK-NEXT: [[MASK :%.*]] = zext <2 x i1 > [[B :%.*]] to <2 x i32>
2568+ ; CHECK-NEXT: [[R:%.*]] = and <2 x i32 > [[MASK ]], [[A:%.*]]
25692569; CHECK-NEXT: ret <2 x i32> [[R]]
25702570;
25712571 %mask = zext <2 x i1 > %b to <2 x i32 >
@@ -2576,7 +2576,10 @@ define <2 x i32> @and_zext_vec(<2 x i32> %a, <2 x i1> %b) {
25762576; tests from PR66606
25772577define i32 @and_zext_eq_even (i32 %a ) {
25782578; CHECK-LABEL: @and_zext_eq_even(
2579- ; CHECK-NEXT: ret i32 0
2579+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 2
2580+ ; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2581+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
2582+ ; CHECK-NEXT: ret i32 [[R]]
25802583;
25812584 %cond = icmp eq i32 %a , 2
25822585 %not = zext i1 %cond to i32
@@ -2586,7 +2589,10 @@ define i32 @and_zext_eq_even(i32 %a) {
25862589
25872590define i32 @and_zext_eq_even_commuted (i32 %a ) {
25882591; CHECK-LABEL: @and_zext_eq_even_commuted(
2589- ; CHECK-NEXT: ret i32 0
2592+ ; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 2
2593+ ; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2594+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
2595+ ; CHECK-NEXT: ret i32 [[R]]
25902596;
25912597 %cond = icmp eq i32 %a , 2
25922598 %not = zext i1 %cond to i32
@@ -2597,7 +2603,8 @@ define i32 @and_zext_eq_even_commuted(i32 %a) {
25972603define i32 @and_zext_eq_odd (i32 %a ) {
25982604; CHECK-LABEL: @and_zext_eq_odd(
25992605; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 3
2600- ; CHECK-NEXT: [[R:%.*]] = zext i1 [[COND]] to i32
2606+ ; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2607+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
26012608; CHECK-NEXT: ret i32 [[R]]
26022609;
26032610 %cond = icmp eq i32 %a , 3
@@ -2609,7 +2616,8 @@ define i32 @and_zext_eq_odd(i32 %a) {
26092616define i32 @and_zext_eq_odd_commuted (i32 %a ) {
26102617; CHECK-LABEL: @and_zext_eq_odd_commuted(
26112618; CHECK-NEXT: [[COND:%.*]] = icmp eq i32 [[A:%.*]], 3
2612- ; CHECK-NEXT: [[R:%.*]] = zext i1 [[COND]] to i32
2619+ ; CHECK-NEXT: [[NOT:%.*]] = zext i1 [[COND]] to i32
2620+ ; CHECK-NEXT: [[R:%.*]] = and i32 [[NOT]], [[A]]
26132621; CHECK-NEXT: ret i32 [[R]]
26142622;
26152623 %cond = icmp eq i32 %a , 3
@@ -2623,7 +2631,10 @@ define i32 @and_zext_eq_zero(i32 %A, i32 %C) {
26232631; CHECK-LABEL: @and_zext_eq_zero(
26242632; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i32 [[A:%.*]], 0
26252633; CHECK-NEXT: [[TMP2:%.*]] = zext i1 [[TMP1]] to i32
2626- ; CHECK-NEXT: ret i32 [[TMP2]]
2634+ ; CHECK-NEXT: [[TMP3:%.*]] = lshr i32 [[A]], [[C:%.*]]
2635+ ; CHECK-NEXT: [[TMP4:%.*]] = xor i32 [[TMP3]], -1
2636+ ; CHECK-NEXT: [[TMP5:%.*]] = and i32 [[TMP2]], [[TMP4]]
2637+ ; CHECK-NEXT: ret i32 [[TMP5]]
26272638;
26282639 %1 = icmp eq i32 %A , 0
26292640 %2 = zext i1 %1 to i32
0 commit comments