[PATCH] D71617: [WIP][NFC][Attributor] noalias attribute deduction fixme

pankaj gode via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 26 23:11:58 PST 2019


pgode added inline comments.


================
Comment at: llvm/lib/Transforms/IPO/Attributor.cpp:2328
+      }
     }
 
----------------
jdoerfert wrote:
> pgode wrote:
> > jdoerfert wrote:
> > > Minor:
> > > You can asssume V has pointer type so you don't need to check it.
> > > To get the `CallSiteI` directly you can call `getCtxI()`.
> > > I think you should even pass `CallSiteI->getNextNode()` to `checkForAllUses` because we don't want to see the uses in the call site.
> > Thanks for the review comments.  I didn't understand the part:
> > >> I think you should even pass CallSiteI->getNextNode() to checkForAllUses because we don't want to see the uses in the call site.
> > 
> > I thought that, if we don't have any uses of instruction/value passed to CallSite, before the callsite instruction then we can propagate.  CallSiteI->getNextNode() gives me next node after the callsite instruction. Not sure about the reason why we should also have additional call to checkForAllUses.
> > 
> > Should we have something like below.
> > ```
> > if (!A.checkForAllUses(UsePred, *this, V, getCtxI())  && !A.checkForAllUses(UsePred, *this, V, getCtxI()->getNextNode()) {
> > .. 
> > }
> > ```
> > 
> First, I got confused myself in the last comment. I'll explain what my thinking was and then why it was not want we want anyway:
> I thought:
>   We have a call `call @foo(%v)` and we want to know if `%v` is used *after* the call.
>   To do that we would look at used reachable from the instruction after the call because we do not want to see the use of `%v` in the call.
>   That is however not what we actually want to do.
> 
> What we want to do is:
>   Check if there is any use
>      - which is not marked `nocapture`, 
>      - which is not the call instruction, and
>      - from which we can reach the call instruction.
>   If such a use exists, the value might have been captured already.
>   If not, it might only be captured by the call instruction or later.
>   In the former case we need to give up, in the latter we don't.
> 
> To achieve this we need to perform the reachability query in the callback (`UsePred` above). If the User (= `U.getUser()`) is an instruction that might cause the value to escape, it is not the call instruction (= `getCtxI()`), and from the user the call instruction is reachable, we give up. Otherwise we continue scanning.
> 
> 
Thanks a lot for clarifying. That make perfect sense to me. 
I am working on it and will soon submit the next version. 



================
Comment at: llvm/lib/Transforms/IPO/Attributor.cpp:5071
+      }
+    }
+
----------------
jdoerfert wrote:
> You need to check both `ReachableFromI` and `ReachabilityAA` for `null` in the outer conditional.
> If it is *not* reachable we should skip the user, thus `continue`, otherwise we fall through and call the predicate below.
> 
> We should also split the change to `checkForAllUses` from the rest and make it a separate review.
I agree for the null checks and continue. I missed them both.
Can I keep this and create separate review after this ? 
As of now, ReachableFromI not equal nullptr value is passed for noalias deduction only. 


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

https://reviews.llvm.org/D71617





More information about the llvm-commits mailing list