This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
dev:crosscompiler:backend:register_allocator [2018/01/04 15:39] – [Register Usage] ursgraf | dev:crosscompiler:backend:register_allocator [2018/02/28 14:42] – [Resolving of Phi-Functions] ursgraf | ||
---|---|---|---|
Line 5: | Line 5: | ||
Registers can be classified as // | Registers can be classified as // | ||
- | [[dev: | + | * [[dev: |
- | [[dev: | + | |
===== Resolving of Phi-Functions ===== | ===== Resolving of Phi-Functions ===== | ||
The operands of a phi-function must all get the same register as the result of the phi-function. For this purpose all these operands have a field //join//. \\ | The operands of a phi-function must all get the same register as the result of the phi-function. For this purpose all these operands have a field //join//. \\ | ||
Before the phi-functions can be resolved, loops need special treatment. Let's consider the folowing case: | Before the phi-functions can be resolved, loops need special treatment. Let's consider the folowing case: | ||
[{{ .: | [{{ .: | ||
+ | {{: | ||
The SSAValue of //a// is used in the loop. The live range of //a// extends to the instruction for //b = 2 * a//. However, this would be wrong, because the register for //a// would be released at this point and might be used otherwise. It must stay reserved until the end of the loop. At the beginning of node 2 a phi-function is created for //a//. This function will be deleted because //a// is set in node 1 and only read in node 2. For all phi-functions in loops (whether deleted or not) the field //last// is set to the last instruction of this loop.\\ | The SSAValue of //a// is used in the loop. The live range of //a// extends to the instruction for //b = 2 * a//. However, this would be wrong, because the register for //a// would be released at this point and might be used otherwise. It must stay reserved until the end of the loop. At the beginning of node 2 a phi-function is created for //a//. This function will be deleted because //a// is set in node 1 and only read in node 2. For all phi-functions in loops (whether deleted or not) the field //last// is set to the last instruction of this loop.\\ |