[llvm-dev] Understanding Chains

Krzysztof Parzyszek via llvm-dev llvm-dev at lists.llvm.org
Thu Jun 29 10:30:46 PDT 2017


On 6/29/2017 12:16 PM, Dilan Manatunga via llvm-dev wrote:>
> I am working on writing a backend in LLVM and I am having a little 
> trouble completely understanding chains. As far as I can tell, chains 
> are used to represent dependencies that can't be expressed by the 
> typical def-use dependency. But I am uncertain where and how I should be 
> using chains.

The edges in the selection DAG generally represent def/use relationship, 
that is, a producer of a value will have an edge connecting it to a user 
of that value. Dependencies based on side-effects are not representable 
that way, because the side-effects are not represented as values. For 
example, a store to a memory location has a side effect of placing some 
value in there, and a subsequent load from that location will depend on 
it. The problem is that the value in memory is not directly represented 
in the DAG, and so there wouldn't be any edge between the store and the 
load in the graph. They both depend on the address, but both of them are 
_users_ of the address, so again, that does not introduce a value-based 
dependency. Chains are used to represent the dependence on factors not 
included in the DAG, such as accessing the same memory location.


> In theCode Generator 
> <http://releases.llvm.org/4.0.0/docs/CodeGenerator.html> documentation, 
> they describe that chains should be used with instructions that have 
> side effects loads, stores, calls, etc. I guess I am confused to as why 
> those instructions need chains. For example, won't loads have a 
> dependency on address to ensure they are only scheduled after address 
> generation. 

Yes.


> And stores will have dependencies and addresses and results 
> to ensure they only occur after those values are created.

Yes.


> Is it because 
> of memory disambiguation causing us to be conservative and needing to 
> ensure that certain store/loads aren't re-ordered respect to each other?

Yes.


> I guess the real question is when I include chains for operations and 
> when I want to return chains from operations (especially intrinsics). 
> For example, with the backend, when I am inserting Loads from the 
> stacks,  I don't want to chain them all together for performance, right, 
> since it doesn't matter when the loads are scheduled (as long as it is 
> before the use). But I should chain them to the incoming chain from 
> LowerFormalArguments parameter.

The general answer is, if there are dependencies that cannot be 
preserved by looking only at the def/use (or producer/user) relationships.


> On somewhat related note, take this example DAG 
> https://i.stack.imgur.com/RQRpq.gif, why does copyfromreg need a chain 
> input?

CopyFromReg usually reads something from a physical register, and 
physical registers are treated like memory, i.e. their contents are not 
tracked.


-Krzysztof

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, 
hosted by The Linux Foundation


More information about the llvm-dev mailing list