@@ -451,3 +451,32 @@ define i32 @load_select_with_null_gep(i1 %cond, ptr %p, i64 %off) {
451451 %res = load i32 , ptr %gep , align 4
452452 ret i32 %res
453453}
454+
455+ define i32 @test_load_phi_with_select (ptr %p , i1 %cond1 ) {
456+ ; CHECK-LABEL: @test_load_phi_with_select(
457+ ; CHECK-NEXT: entry:
458+ ; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
459+ ; CHECK: loop.body:
460+ ; CHECK-NEXT: [[BASE:%.*]] = phi ptr [ [[P1:%.*]], [[ENTRY:%.*]] ], [ [[P:%.*]], [[LOOP_BODY]] ]
461+ ; CHECK-NEXT: [[TARGET:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 24
462+ ; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[TARGET]], align 4
463+ ; CHECK-NEXT: [[P]] = select i1 [[COND1:%.*]], ptr null, ptr [[P1]]
464+ ; CHECK-NEXT: [[COND21:%.*]] = icmp eq i32 [[LOAD]], 0
465+ ; CHECK-NEXT: br i1 [[COND21]], label [[LOOP_BODY]], label [[EXIT:%.*]]
466+ ; CHECK: exit:
467+ ; CHECK-NEXT: ret i32 [[LOAD]]
468+ ;
469+ entry:
470+ br label %loop.body
471+
472+ loop.body:
473+ %base = phi ptr [ %p , %entry ], [ %sel , %loop.body ]
474+ %target = getelementptr inbounds i8 , ptr %base , i64 24
475+ %load = load i32 , ptr %target , align 4
476+ %sel = select i1 %cond1 , ptr null , ptr %p
477+ %cond2 = icmp eq i32 %load , 0
478+ br i1 %cond2 , label %loop.body , label %exit
479+
480+ exit:
481+ ret i32 %load
482+ }
0 commit comments