94 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
.bp
 | 
						|
.NH
 | 
						|
The Control Flow Phase
 | 
						|
.PP
 | 
						|
In the previous chapter we described the intermediate
 | 
						|
code of the global optimizer.
 | 
						|
We also specified which part of this code
 | 
						|
was constructed by the IC phase of the optimizer.
 | 
						|
The Control Flow Phase (\fICF\fR) does
 | 
						|
the remainder of the job,
 | 
						|
i.e. it determines:
 | 
						|
.IP -
 | 
						|
the control flow graphs
 | 
						|
.IP -
 | 
						|
the loop tables
 | 
						|
.IP -
 | 
						|
the calling, change and use attributes of
 | 
						|
the procedure table entries
 | 
						|
.LP
 | 
						|
CF operates on one procedure at a time.
 | 
						|
For every procedure it first reads the EM instructions
 | 
						|
from the EM-text file and groups them into basic blocks.
 | 
						|
For every basic block, its successors and
 | 
						|
predecessors are determined,
 | 
						|
resulting in the control flow graph.
 | 
						|
Next, the immediate dominator of every basic block
 | 
						|
is computed.
 | 
						|
Using these dominators, any loop in the
 | 
						|
procedure is detected.
 | 
						|
Finally, interprocedural analysis is done,
 | 
						|
after which we will know the global effects of
 | 
						|
every procedure call on its environment.
 | 
						|
.sp
 | 
						|
CF uses the same internal data structures
 | 
						|
for the procedure table and object table as IC.
 | 
						|
.NH 2
 | 
						|
Partitioning into basic blocks
 | 
						|
.PP
 | 
						|
With regard to flow of control, we distinguish
 | 
						|
three kinds of EM instructions:
 | 
						|
jump instructions, instruction label definitions and
 | 
						|
normal instructions.
 | 
						|
Jump instructions are all conditional or unconditional
 | 
						|
branch instructions,
 | 
						|
the case instructions (CSA/CSB)
 | 
						|
and the RET (return) instruction.
 | 
						|
A procedure call (CAL) is not considered to be a jump.
 | 
						|
A defining occurrence of an instruction label
 | 
						|
is regarded as an EM instruction.
 | 
						|
.PP
 | 
						|
An instruction starts
 | 
						|
a new basic block, in any of the following cases:
 | 
						|
.IP 1.
 | 
						|
It is the first instruction of a procedure
 | 
						|
.IP 2.
 | 
						|
It is the first of a list of instruction label
 | 
						|
defining occurrences
 | 
						|
.IP 3.
 | 
						|
It follows a jump
 | 
						|
.LP
 | 
						|
If there are several consecutive instruction labels
 | 
						|
(which is highly unusual),
 | 
						|
all of them are put in the same basic block.
 | 
						|
Note that several cases may overlap,
 | 
						|
e.g. a label definition at the beginning of a procedure
 | 
						|
or a label following a jump.
 | 
						|
.PP
 | 
						|
A simple Finite State Machine is used to model
 | 
						|
the above rules.
 | 
						|
It also recognizes the end of a procedure,
 | 
						|
marked by an END pseudo.
 | 
						|
The basic blocks are stored internally as a doubly linked
 | 
						|
linear list.
 | 
						|
The blocks are linked in textual order.
 | 
						|
Every node of this list has the attributes described
 | 
						|
in the previous chapter (see syntax rule for
 | 
						|
basic_block).
 | 
						|
Furthermore, every node contains a pointer to its
 | 
						|
EM instructions,
 | 
						|
which are represented internally
 | 
						|
as a linear, doubly linked list,
 | 
						|
just as in the IC phase.
 | 
						|
However, instead of one list per procedure (as in IC)
 | 
						|
there is now one list per basic block.
 | 
						|
.PP
 | 
						|
On the fly, a table is build that maps
 | 
						|
every label identifier to the label definition
 | 
						|
instruction.
 | 
						|
This table is used for computing the control flow.
 | 
						|
The table is stored as a dynamically allocated array.
 | 
						|
The length of the array is the number of labels
 | 
						|
of the current procedure;
 | 
						|
this value can be found in the procedure table,
 | 
						|
where it was stored by IC.
 |