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.
 |