[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