[llvm] c077510 - [InstSimplify] Handle unknown function context in pointer icmp fold (PR54615)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue May 10 02:48:51 PDT 2022
Author: Nikita Popov
Date: 2022-05-10T11:48:43+02:00
New Revision: c077510bb195325b33eb28c550ebff4665b0c709
URL: https://github.com/llvm/llvm-project/commit/c077510bb195325b33eb28c550ebff4665b0c709
DIFF: https://github.com/llvm/llvm-project/commit/c077510bb195325b33eb28c550ebff4665b0c709.diff
LOG: [InstSimplify] Handle unknown function context in pointer icmp fold (PR54615)
This issue reproduces in the context of LoopDeletion, because the
bitcast does not get simplified away there. For a plain -inst-simplify
run the bitcast would get folded away first.
Fixes https://github.com/llvm/llvm-project/issues/54615.
Added:
Modified:
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/LoopDeletion/eval_first_iteration.ll
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 0bb433f227c6c..99289721e90f5 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<Instruction>(V))
return I->getFunction();
- return cast<Argument>(V)->getParent();
+ if (auto *A = dyn_cast<Argument>(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 1bdcefc419ce5..af81577ca6b90 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
}
+
+ at 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
+}
More information about the llvm-commits
mailing list