Skip to content

Commit 37374fb

Browse files
authored
1 parent 60b44d3 commit 37374fb

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,21 @@ Value *InstCombinerImpl::simplifyNonNullOperand(Value *V,
10111011
}
10121012
}
10131013

1014+
if (auto *PHI = dyn_cast<PHINode>(V)) {
1015+
bool Changed = false;
1016+
for (Use &U : PHI->incoming_values()) {
1017+
// We set Depth to RecursionLimit to avoid expensive recursion.
1018+
if (auto *Res = simplifyNonNullOperand(U.get(), HasDereferenceable,
1019+
RecursionLimit)) {
1020+
replaceUse(U, Res);
1021+
Changed = true;
1022+
}
1023+
}
1024+
if (Changed)
1025+
addToWorklist(PHI);
1026+
return nullptr;
1027+
}
1028+
10141029
return nullptr;
10151030
}
10161031

llvm/test/Transforms/InstCombine/load.ll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,3 +481,30 @@ 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: [[TARGET:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE:%.*]], i64 24
491+
; CHECK-NEXT: [[LOAD:%.*]] = load i32, ptr [[TARGET]], align 4
492+
; CHECK-NEXT: [[COND21:%.*]] = icmp eq i32 [[LOAD]], 0
493+
; CHECK-NEXT: br i1 [[COND21]], label [[LOOP_BODY]], label [[EXIT:%.*]]
494+
; CHECK: exit:
495+
; CHECK-NEXT: ret i32 [[LOAD]]
496+
;
497+
entry:
498+
br label %loop.body
499+
500+
loop.body:
501+
%base = phi ptr [ %p, %entry ], [ %sel, %loop.body ]
502+
%target = getelementptr inbounds i8, ptr %base, i64 24
503+
%load = load i32, ptr %target, align 4
504+
%sel = select i1 %cond1, ptr null, ptr %p
505+
%cond2 = icmp eq i32 %load, 0
506+
br i1 %cond2, label %loop.body, label %exit
507+
508+
exit:
509+
ret i32 %load
510+
}

0 commit comments

Comments
 (0)