@@ -451,3 +451,32 @@ define i32 @load_select_with_null_gep(i1 %cond, ptr %p, i64 %off) {
451
451
%res = load i32 , ptr %gep , align 4
452
452
ret i32 %res
453
453
}
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