[PATCH] D41104: Set the NoRecurse attribute for the dbg intrinsics.
Hal Finkel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 21 09:55:17 PST 2017
hfinkel added a comment.
In https://reviews.llvm.org/D41104#958640, @efriedma wrote:
> This isn't what LangRef says, and it would be kind of hard to nail down a definition which actually works like this. I mean, I guess you could try to define it in terms of the callgraph, but that would have unusual implications. (What happens if your program contains a call which is dynamically dead, and incorrectly marked norecurse?)
I agree. We shouldn't define this based only on the static call graph. It should be a dynamic property (like, essentially, everything else in order to avoid the dead-code-changing-semantics issue). It seems like we screwed this up a bit because the inference logic in FunctionAttrs won't clearly do the right thing in such cases (and it can't, because norecurse doesn't really have the right semantic information).
> We probably want a new attribute to express the relevant property, which is essentially that most intrinsics don't call any function defined in your program.
> I guess...? I don't like proposing new attributes, but I don't see an alternative. (Granted, it could get a little tricky to define precisely what the attribute means given that our runtime functions are written in C.)
I think that we'd do this in a similar way to how we define our inaccessiblememonly attribute. You'd say that calling the function will not, directly or indirectly, call any function in the module being compiled.
> If you just want to fix the debuginfo issue, you could just check specifically for debuginfo intrinsics in the FunctionAttrs pass; we treat them specially in many passes.
I think that we can easily do better by calling TTI->isLoweredToCall(F), and ignoring everything for which this is false (which will be for the debug intrinsics, and also for a bunch of other things).
More information about the llvm-commits