[PATCH] D63243: [WIP] Adjust the users of dereferenceable wrt. dereferenceable_globally

Johannes Doerfert via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 18 01:18:11 PDT 2019


jdoerfert marked 2 inline comments as done.
jdoerfert added inline comments.


================
Comment at: llvm/include/llvm/IR/Value.h:583
+  uint64_t
+  getPointerDereferenceableBytes(const DataLayout &DL, bool &CanBeNull,
+                                 const Instruction *CtxI = nullptr) const;
----------------
reames wrote:
> jdoerfert wrote:
> > reames wrote:
> > > An API suggestion.  Instead of adding a context pointer here, add a boolean OnlyAtDef out param.  Then introduce a helper function in ValueTracking which does the inference over the IR.  (i.e. leave this as returning basic facts about the value, and move the analysis into an analysis.) 
> > > 
> > > Or if you want, call the param AssumeNoFree, or whatever..
> > I like it, done. Though, I do need the location of the definition, so I made it an `Instruction *&` not a `bool &`, what do you think?
> > 
> > 
> I'd prefer the boolean given there's only two options: 1) on def, and 2) globally.  I'm willing to defer to you on this if you feel strongly though.  
My problem is that for option 1) "on def", the information that is returned would not be sufficient for most users. In the "on def" case you also need the "definition" to query `maybeFreedInBetween`. If I would return a boolean, I would need to implement a second traversal that does the same just to find the definition. Does this make sense?


================
Comment at: llvm/lib/Transforms/Scalar/MergeICmps.cpp:165
   const auto &DL = GEP->getModule()->getDataLayout();
-  if (!isDereferenceablePointer(GEP, DL)) {
+  if (!isDereferenceablePointer(GEP, DL, const_cast<LoadInst *>(LoadI))) {
     LLVM_DEBUG(dbgs() << "not dereferenceable\n");
----------------
courbet wrote:
> I don't see where in the patch (or the rest of the stack of changes) the signature of `isDereferenceablePointer` is changed to non-const Instruction.
True, I remove the `const_cast`. That was my bad.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63243/new/

https://reviews.llvm.org/D63243





More information about the llvm-commits mailing list