Skip to content

Commit d68ea31

Browse files
committed
[InstCombine] Add additional tests for icmp of phi of zext (NFC)
1 parent b79d3b9 commit d68ea31

File tree

1 file changed

+177
-0
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+177
-0
lines changed

llvm/test/Transforms/InstCombine/phi.ll

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2822,3 +2822,180 @@ for.cond: ; preds = %for.cond, %entry
28222822
exit: ; 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

Comments
 (0)