diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 0bb433f227c6c8..99289721e90f5d 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -2723,12 +2723,14 @@ computePointerICmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, uint64_t LHSSize, RHSSize; ObjectSizeOpts Opts; Opts.EvalMode = ObjectSizeOpts::Mode::Min; - auto *F = [](Value *V) { + auto *F = [](Value *V) -> Function * { if (auto *I = dyn_cast(V)) return I->getFunction(); - return cast(V)->getParent(); + if (auto *A = dyn_cast(V)) + return A->getParent(); + return nullptr; }(LHS); - Opts.NullIsUnknownSize = NullPointerIsDefined(F); + Opts.NullIsUnknownSize = F ? NullPointerIsDefined(F) : true; if (getObjectSize(LHS, LHSSize, DL, TLI, Opts) && getObjectSize(RHS, RHSSize, DL, TLI, Opts) && !LHSOffset.isNegative() && !RHSOffset.isNegative() && diff --git a/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll b/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll index 1bdcefc419ce51..af81577ca6b90e 100644 --- a/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll +++ b/llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll @@ -1214,3 +1214,26 @@ done: ; preds = %backedge %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] ret i32 %sum.next.lcssa } + +@g = external global i32 + +define void @ptr54615(i32* byval(i32) %arg) { +; CHECK-LABEL: @ptr54615( +; CHECK-NEXT: br label [[FOR_COND:%.*]] +; CHECK: for.cond: +; CHECK-NEXT: [[CAST:%.*]] = bitcast i32* @g to i32* +; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32* [[CAST]], [[ARG:%.*]] +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_END:%.*]], label [[FOR_COND]] +; CHECK: for.end: +; CHECK-NEXT: ret void +; + br label %for.cond + +for.cond: + %cast = bitcast i32* @g to i32* + %cmp = icmp eq i32* %cast, %arg + br i1 %cmp, label %for.end, label %for.cond + +for.end: + ret void +}