@@ -2822,3 +2822,180 @@ for.cond: ; preds = %for.cond, %entry
28222822exit: ; preds = %for.cond
28232823 ret i64 0
28242824}
2825+
2826+ define i1 @test_zext_icmp_eq_0 (i1 %a , i1 %b , i32 %c ) {
2827+ ; CHECK-LABEL: @test_zext_icmp_eq_0(
2828+ ; CHECK-NEXT: entry:
2829+ ; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2830+ ; CHECK: if:
2831+ ; CHECK-NEXT: [[B_EXT:%.*]] = zext i1 [[B:%.*]] to i32
2832+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2833+ ; CHECK: else:
2834+ ; CHECK-NEXT: br label [[JOIN]]
2835+ ; CHECK: join:
2836+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[B_EXT]], [[IF]] ], [ [[C:%.*]], [[ELSE]] ]
2837+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI]], 0
2838+ ; CHECK-NEXT: ret i1 [[CMP]]
2839+ ;
2840+ entry:
2841+ br i1 %a , label %if , label %else
2842+
2843+ if:
2844+ %b.ext = zext i1 %b to i32
2845+ br label %join
2846+
2847+ else:
2848+ br label %join
2849+
2850+ join:
2851+ %phi = phi i32 [ %b.ext , %if ], [ %c , %else ]
2852+ %cmp = icmp eq i32 %phi , 0
2853+ ret i1 %cmp
2854+ }
2855+
2856+ define i1 @test_zext_icmp_ne_0 (i1 %a , i1 %b , i32 %c ) {
2857+ ; CHECK-LABEL: @test_zext_icmp_ne_0(
2858+ ; CHECK-NEXT: entry:
2859+ ; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2860+ ; CHECK: if:
2861+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2862+ ; CHECK: else:
2863+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp ne i32 [[C:%.*]], 0
2864+ ; CHECK-NEXT: br label [[JOIN]]
2865+ ; CHECK: join:
2866+ ; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[B:%.*]], [[IF]] ], [ [[TMP0]], [[ELSE]] ]
2867+ ; CHECK-NEXT: ret i1 [[PHI]]
2868+ ;
2869+ entry:
2870+ br i1 %a , label %if , label %else
2871+
2872+ if:
2873+ %b.ext = zext i1 %b to i32
2874+ br label %join
2875+
2876+ else:
2877+ br label %join
2878+
2879+ join:
2880+ %phi = phi i32 [ %b.ext , %if ], [ %c , %else ]
2881+ %cmp = icmp ne i32 %phi , 0
2882+ ret i1 %cmp
2883+ }
2884+
2885+ define i1 @test_zext_icmp_eq_1 (i1 %a , i1 %b , i32 %c ) {
2886+ ; CHECK-LABEL: @test_zext_icmp_eq_1(
2887+ ; CHECK-NEXT: entry:
2888+ ; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2889+ ; CHECK: if:
2890+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2891+ ; CHECK: else:
2892+ ; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i32 [[C:%.*]], 1
2893+ ; CHECK-NEXT: br label [[JOIN]]
2894+ ; CHECK: join:
2895+ ; CHECK-NEXT: [[PHI:%.*]] = phi i1 [ [[B:%.*]], [[IF]] ], [ [[TMP0]], [[ELSE]] ]
2896+ ; CHECK-NEXT: ret i1 [[PHI]]
2897+ ;
2898+ entry:
2899+ br i1 %a , label %if , label %else
2900+
2901+ if:
2902+ %b.ext = zext i1 %b to i32
2903+ br label %join
2904+
2905+ else:
2906+ br label %join
2907+
2908+ join:
2909+ %phi = phi i32 [ %b.ext , %if ], [ %c , %else ]
2910+ %cmp = icmp eq i32 %phi , 1
2911+ ret i1 %cmp
2912+ }
2913+
2914+ define i1 @test_zext_icmp_eq_0_loop (i1 %c , i1 %b ) {
2915+ ; CHECK-LABEL: @test_zext_icmp_eq_0_loop(
2916+ ; CHECK-NEXT: entry:
2917+ ; CHECK-NEXT: br label [[LOOP:%.*]]
2918+ ; CHECK: loop:
2919+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[EXT:%.*]], [[LOOP]] ]
2920+ ; CHECK-NEXT: [[X:%.*]] = icmp eq i32 [[PHI]], 0
2921+ ; CHECK-NEXT: [[Y:%.*]] = and i1 [[X]], [[B:%.*]]
2922+ ; CHECK-NEXT: [[EXT]] = zext i1 [[Y]] to i32
2923+ ; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP]], label [[EXIT:%.*]]
2924+ ; CHECK: exit:
2925+ ; CHECK-NEXT: ret i1 [[X]]
2926+ ;
2927+ entry:
2928+ br label %loop
2929+
2930+ loop:
2931+ %phi = phi i32 [ 1 , %entry ], [ %ext , %loop ]
2932+ %x = icmp eq i32 %phi , 0
2933+ %y = and i1 %x , %b
2934+ %ext = zext i1 %y to i32
2935+ br i1 %c , label %loop , label %exit
2936+
2937+ exit:
2938+ ret i1 %x
2939+ }
2940+
2941+ define i1 @test_zext_icmp_eq_0_multi_use (i1 %a , i1 %b , i32 %c ) {
2942+ ; CHECK-LABEL: @test_zext_icmp_eq_0_multi_use(
2943+ ; CHECK-NEXT: entry:
2944+ ; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2945+ ; CHECK: if:
2946+ ; CHECK-NEXT: [[B_EXT:%.*]] = zext i1 [[B:%.*]] to i32
2947+ ; CHECK-NEXT: call void @use(i32 [[B_EXT]])
2948+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2949+ ; CHECK: else:
2950+ ; CHECK-NEXT: br label [[JOIN]]
2951+ ; CHECK: join:
2952+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[B_EXT]], [[IF]] ], [ [[C:%.*]], [[ELSE]] ]
2953+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI]], 0
2954+ ; CHECK-NEXT: ret i1 [[CMP]]
2955+ ;
2956+ entry:
2957+ br i1 %a , label %if , label %else
2958+
2959+ if:
2960+ %b.ext = zext i1 %b to i32
2961+ call void @use (i32 %b.ext )
2962+ br label %join
2963+
2964+ else:
2965+ br label %join
2966+
2967+ join:
2968+ %phi = phi i32 [ %b.ext , %if ], [ %c , %else ]
2969+ %cmp = icmp eq i32 %phi , 0
2970+ ret i1 %cmp
2971+ }
2972+
2973+ define i1 @test_zext_icmp_eq_0_not_bool (i1 %a , i2 %b , i32 %c ) {
2974+ ; CHECK-LABEL: @test_zext_icmp_eq_0_not_bool(
2975+ ; CHECK-NEXT: entry:
2976+ ; CHECK-NEXT: br i1 [[A:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
2977+ ; CHECK: if:
2978+ ; CHECK-NEXT: [[B_EXT:%.*]] = zext i2 [[B:%.*]] to i32
2979+ ; CHECK-NEXT: br label [[JOIN:%.*]]
2980+ ; CHECK: else:
2981+ ; CHECK-NEXT: br label [[JOIN]]
2982+ ; CHECK: join:
2983+ ; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[B_EXT]], [[IF]] ], [ [[C:%.*]], [[ELSE]] ]
2984+ ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[PHI]], 0
2985+ ; CHECK-NEXT: ret i1 [[CMP]]
2986+ ;
2987+ entry:
2988+ br i1 %a , label %if , label %else
2989+
2990+ if:
2991+ %b.ext = zext i2 %b to i32
2992+ br label %join
2993+
2994+ else:
2995+ br label %join
2996+
2997+ join:
2998+ %phi = phi i32 [ %b.ext , %if ], [ %c , %else ]
2999+ %cmp = icmp eq i32 %phi , 0
3000+ ret i1 %cmp
3001+ }
0 commit comments