@@ -2822,3 +2822,180 @@ for.cond: ; preds = %for.cond, %entry
2822
2822
exit: ; preds = %for.cond
2823
2823
ret i64 0
2824
2824
}
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