@@ -481,3 +481,32 @@ define i16 @load_select_with_null_gep3(i1 %cond, ptr %p, i64 %x, i64 %y) {
481481 %res = load i16 , ptr %gep2 , align 2
482482 ret i16 %res
483483}
484+
485+ define i32 @test_load_phi_with_select (ptr %p , i1 %cond1 ) {
486+ ; CHECK-LABEL: @test_load_phi_with_select(
487+ ; CHECK-NEXT: entry:
488+ ; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
489+ ; CHECK: loop.body:
490+ ; CHECK-NEXT: [[BASE:%.*]] = phi ptr [ [[P1:%.*]], [[ENTRY:%.*]] ], [ [[P:%.*]], [[LOOP_BODY]] ]
491+ ; CHECK-NEXT: [[TARGET:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 24
492+ ; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[TARGET]], align 4
493+ ; CHECK-NEXT: [[P]] = select i1 [[COND1:%.*]], ptr null, ptr [[P1]]
494+ ; CHECK-NEXT: [[COND21:%.*]] = icmp eq i32 [[LOAD]], 0
495+ ; CHECK-NEXT: br i1 [[COND21]], label [[LOOP_BODY]], label [[EXIT:%.*]]
496+ ; CHECK: exit:
497+ ; CHECK-NEXT: ret i32 [[LOAD]]
498+ ;
499+ entry:
500+ br label %loop.body
501+
502+ loop.body:
503+ %base = phi ptr [ %p , %entry ], [ %sel , %loop.body ]
504+ %target = getelementptr inbounds i8 , ptr %base , i64 24
505+ %load = load i32 , ptr %target , align 4
506+ %sel = select i1 %cond1 , ptr null , ptr %p
507+ %cond2 = icmp eq i32 %load , 0
508+ br i1 %cond2 , label %loop.body , label %exit
509+
510+ exit:
511+ ret i32 %load
512+ }
0 commit comments