Hi. Regarding the token approach, I’ve read some documentation (review D11861, EH in llvm, and Reid and David’s presentation) but couldn’t answer the following question.
Does the intrinsic or the instruction returning a token type object act as a code motion barrier? In other words, does it prevent other operations from being reordered with it?
If the answer is no, then does it mean the intrinsic has to be marked with the convergent property to achieve the code motion barrier effect?
If yes, can someone explain how is that achieved in llvm?
Greatly appreciated. Thanks.
To clarify, convergent does not form a code-motion barrier. It prevents transformations from adding additional control dependencies. I suspect that the token type does the same (because tokens can’t appear in PHIs). Actual code motion barriers are generally achieved by adding unknown memory dependencies. -Hal
What if the only user of the token is in a branch? It seems to me that you’d be allowed to sink the token producer there, but not if it is marked convergent.
LangRef seems to allow it, there might not be any users of token that would do that though?
I haven’t given much thought about it, I just raw-analyzed your suspected equivalence on this aspect