@@ -2313,6 +2313,58 @@ if.else:
23132313 ret i8 %c
23142314}
23152315
2316+ define i8 @test_trunc_cond_and (i8 %x , i1 %c ) {
2317+ ; CHECK-LABEL: @test_trunc_cond_and(
2318+ ; CHECK-NEXT: [[CMP:%.*]] = trunc i8 [[X:%.*]] to i1
2319+ ; CHECK-NEXT: [[COND:%.*]] = and i1 [[C:%.*]], [[CMP]]
2320+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
2321+ ; CHECK: if:
2322+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -2
2323+ ; CHECK-NEXT: ret i8 [[OR1]]
2324+ ; CHECK: exit:
2325+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -2
2326+ ; CHECK-NEXT: ret i8 [[OR2]]
2327+ ;
2328+ %cmp = trunc i8 %x to i1
2329+ %cond = and i1 %cmp , %c
2330+ br i1 %cond , label %if , label %exit
2331+
2332+ if:
2333+ %or1 = or i8 %x , -2
2334+ ret i8 %or1
2335+
2336+ exit:
2337+ %or2 = or i8 %x , -2
2338+ ret i8 %or2
2339+ }
2340+
2341+ define i8 @test_not_trunc_cond_and (i8 %x , i1 %c ) {
2342+ ; CHECK-LABEL: @test_not_trunc_cond_and(
2343+ ; CHECK-NEXT: [[CMP:%.*]] = trunc i8 [[X:%.*]] to i1
2344+ ; CHECK-NEXT: [[NOT:%.*]] = xor i1 [[CMP]], true
2345+ ; CHECK-NEXT: [[COND:%.*]] = and i1 [[C:%.*]], [[NOT]]
2346+ ; CHECK-NEXT: br i1 [[COND]], label [[IF:%.*]], label [[EXIT:%.*]]
2347+ ; CHECK: if:
2348+ ; CHECK-NEXT: [[OR1:%.*]] = or i8 [[X]], -2
2349+ ; CHECK-NEXT: ret i8 [[OR1]]
2350+ ; CHECK: exit:
2351+ ; CHECK-NEXT: [[OR2:%.*]] = or i8 [[X]], -2
2352+ ; CHECK-NEXT: ret i8 [[OR2]]
2353+ ;
2354+ %cmp = trunc i8 %x to i1
2355+ %not = xor i1 %cmp , true
2356+ %cond = and i1 %not , %c
2357+ br i1 %cond , label %if , label %exit
2358+
2359+ if:
2360+ %or1 = or i8 %x , -2
2361+ ret i8 %or1
2362+
2363+ exit:
2364+ %or2 = or i8 %x , -2
2365+ ret i8 %or2
2366+ }
2367+
23162368declare void @dummy ()
23172369declare void @use (i1 )
23182370declare void @sink (i8 )
0 commit comments