deep

a Cross Development Platform for Java

User Tools

Site Tools


dev:crosscompiler:backend:register_allocator

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
dev:crosscompiler:backend:register_allocator [2018/02/28 14:42] – [Resolving of Phi-Functions] ursgrafdev:crosscompiler:backend:register_allocator [2018/02/28 14:43] – [Determine Used Parameters] ursgraf
Line 11: Line 11:
 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:
 [{{ .:phifunctionloop1.png?110 |//Phi-Function in a loop//}}] [{{ .:phifunctionloop1.png?110 |//Phi-Function in a loop//}}]
-{{:dev:crosscompiler:backend:phifunctionloop1.png?400|}} 
  
 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.\\
Line 40: Line 39:
  
 ===== Determine Used Parameters ===== ===== Determine Used Parameters =====
-Parameters are passed in volatile registers. Some of them have to be copied to nonvolatile registers. Some parameters might not be used at all in a method. This can be determined in the exit set of the last node. If a value is null in that set the parameter with this index was never loaded and hence no register must be reserved. The following example demonstrates parameter usage.+Parameters are passed in volatile registers. Some of them have to be copied to nonvolatile registers. Some parameters might not be used at all in a method. This can be determined in the exit set of the last node. If a value is null in that set the parameter with this index was never loaded and hence no register must be reserved. The following example demonstrates parameter usage on a ppc platform.
 <code java> <code java>
   float m2(long a, float b, double c, byte[] d, short e, int f, int g) {   float m2(long a, float b, double c, byte[] d, short e, int f, int g) {
dev/crosscompiler/backend/register_allocator.txt · Last modified: 2019/08/29 16:53 by ursgraf