136 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| .bp
 | |
| .NH 1
 | |
| Cross jumping
 | |
| .NH 2
 | |
| Introduction
 | |
| .PP
 | |
| The "Cross Jumping" optimization technique (CJ)
 | |
| .[
 | |
| wulf design optimizing compiler
 | |
| .]
 | |
| is basically a space optimization technique. It looks for pairs of
 | |
| basic blocks (B1,B2), for which:
 | |
| .DS
 | |
| SUCC(B1) = SUCC(B2) = {S}
 | |
| .DE
 | |
| (So B1 and B2 both have one and the same successor).
 | |
| If the last few non-branch instructions are the same for B1 and B2,
 | |
| one such sequence can be eliminated.
 | |
| .DS
 | |
| Pascal:
 | |
| 
 | |
| if cond then
 | |
|     S1
 | |
|     S3
 | |
| else
 | |
|     S2
 | |
|     S3
 | |
| 
 | |
| (pseudo) EM:
 | |
| 
 | |
| TEST COND		TEST COND
 | |
| BNE *1			BNE *1
 | |
| S1			S1
 | |
| S3	   --->		BRA *2
 | |
| BRA *2			1:
 | |
| 1:			S2
 | |
| S2			2:
 | |
| S3			S3
 | |
| 2:
 | |
| 
 | |
| Fig. 9.1 An example of Cross Jumping
 | |
| .DE
 | |
| As the basic blocks have the same successor,
 | |
| at least one of them ends in an unconditional branch instruction (BRA).
 | |
| Hence no extra branch instruction is ever needed, just the target
 | |
| of an existing branch needs to be changed; neither the program size
 | |
| nor the execution time will ever increase.
 | |
| In general, the execution time will remain the same, unless
 | |
| further optimizations can be applied because of this optimization.
 | |
| .PP
 | |
| This optimization is particularly effective,
 | |
| because it cannot always be done by the programmer at the source level,
 | |
| as demonstrated by the Fig. 8.2.
 | |
| .DS
 | |
| 	Pascal:
 | |
| 
 | |
| 	if cond then
 | |
| 	   x := f(4)
 | |
| 	else
 | |
| 	   x := g(5)
 | |
| 
 | |
| 
 | |
| 	EM:
 | |
| 
 | |
| 	...                     ...
 | |
| 	LOC 4			LOC 5
 | |
| 	CAL F			CAL G
 | |
| 	ASP 2			ASP 2
 | |
| 	LFR 2			LFR 2
 | |
| 	STL X			STL X
 | |
| 
 | |
| Fig. 9.2 Effectiveness of Cross Jumping
 | |
| .DE
 | |
| At the source level there is no common tail,
 | |
| but at the EM level there is a common tail.
 | |
| .NH 2
 | |
| Implementation
 | |
| .PP
 | |
| The implementation of cross jumping is rather straightforward.
 | |
| The technique is applied to one procedure at a time.
 | |
| The control flow graph of the procedure 
 | |
| is scanned for pairs of basic blocks
 | |
| with the same (single) successor and with common tails.
 | |
| Note that there may be more than two such blocks (e.g. as the result
 | |
| of a case statement).
 | |
| This is dealt with by repeating the entire process until no
 | |
| further optimizations can de done for the current procedure.
 | |
| .sp
 | |
| If a suitable pair of basic blocks has been found, the control flow
 | |
| graph must be altered. One of the basic
 | |
| blocks must be split into two.
 | |
| The control flow graphs before and after the optimization are shown
 | |
| in Fig. 9.3 and Fig. 9.4.
 | |
| .DS
 | |
| 
 | |
| 	--------				--------
 | |
| 	|      |				|      |
 | |
| 	| S1   |			        | S2   |
 | |
| 	| S3   |   				| S3   |
 | |
| 	|      |				|      |
 | |
| 	--------				--------
 | |
| 	   |					   |
 | |
| 	   |------------------|--------------------|
 | |
| 			      |
 | |
| 			      v
 | |
| 
 | |
| Fig. 9.3 CFG before optimization
 | |
| .DE
 | |
| .DS
 | |
| 
 | |
| 	--------				--------
 | |
| 	|      |				|      |
 | |
| 	| S1   |			        | S2   |
 | |
| 	|      |				|      |
 | |
| 	--------				--------
 | |
| 	   |					   |
 | |
| 	   |--------------------<------------------|
 | |
| 	   v
 | |
| 	--------
 | |
| 	|      |
 | |
| 	| S3   |
 | |
| 	|      |
 | |
| 	--------
 | |
| 	   |
 | |
| 	   v
 | |
| 
 | |
| Fig. 9.4 CFG after optimization
 | |
| .DE
 | |
| Some attributes of the three resulting blocks (such as immediate dominator)
 | |
| are updated.
 | |
| .PP
 | |
| In some cases, cross jumping might split the computation of an expression
 | |
| into two, by inserting a branch somewhere in the middle.
 | |
| Most code generators will generate very poor assembly code when
 | |
| presented with such EM code. 
 | |
| Therefor, cross jumping is not performed in these cases.
 |