86 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| .NH 2
 | |
| Specification of the Common Subexpression Elimination phase
 | |
| .PP
 | |
| In this section we will describe
 | |
| the window
 | |
| through which CS examines the code,
 | |
| the expressions recognized by CS,
 | |
| and finally the changes made to the code.
 | |
| .NH 3
 | |
| The working window
 | |
| .PP
 | |
| The CS algorithm is applied to the
 | |
| largest sequence of textually adjacent basic blocks
 | |
| B1,..,Bn, for which
 | |
| .DS
 | |
| PRED(Bj) = {Bj-1},  j = 2,..,n.
 | |
| .DE
 | |
| Intuitively, this window consists of straight line code,
 | |
| with only one entry point (at the beginning); it may
 | |
| contain jumps, which should all have their targets outside the window.
 | |
| This is illustrated in Fig. 7.2.
 | |
| .DS
 | |
| x := a * b;	(1)
 | |
| if x < 10 then	(2)
 | |
|     y := a * b;	(3)
 | |
| 
 | |
| Fig. 7.2 The working window of CS
 | |
| .DE
 | |
| Line (2) can only be executed after line (1).
 | |
| Likewise, line (3) can only be executed after
 | |
| line (2).
 | |
| Both a and b have the same values at line (1) and at line (3).
 | |
| .PP
 | |
| Larger windows were avoided.
 | |
| In Fig. 7.3, the value of a at line (4) may have been obtained
 | |
| at more than one point.
 | |
| .DS
 | |
| x := a * b;	(1)
 | |
| if x < 10 then	(2)
 | |
|     a := 100;	(3)
 | |
| y := a * b;	(4)
 | |
| 
 | |
| Fig. 7.3 Several working windows
 | |
| .DE
 | |
| .NH 3
 | |
| Recognized expressions.
 | |
| .PP
 | |
| The computations eliminated by CS need not be normal expressions
 | |
| (like "a * b"),
 | |
| but can even consist of a single operand that is expensive to access,
 | |
| such as an array element or a record field.
 | |
| If an array element is used,
 | |
| its address is computed implicitly.
 | |
| CS is able to eliminate either the element itself or its
 | |
| address, whichever one is most profitable.
 | |
| A variable of a textually enclosing procedure may also be
 | |
| expensive to access, depending on the lexical level difference.
 | |
| .NH 3
 | |
| Transformations
 | |
| .PP
 | |
| CS creates a new temporary local variable (TMP)
 | |
| for every eliminated expression,
 | |
| unless it is able to use an existing local variable.
 | |
| It emits code to initialize this variable with the
 | |
| result of the expression.
 | |
| Most recurrences of the expression
 | |
| can simply be replaced by a reference to TMP.
 | |
| If the address of an array element is recognized as
 | |
| a common subexpression,
 | |
| references to the element itself are replaced by
 | |
| indirect references through TMP (see Fig. 7.4).
 | |
| .DS
 | |
| .TS
 | |
| l l l.
 | |
| x := A[i];		TMP := &A[i];
 | |
|   . . .	-->	x := *TMP;
 | |
| A[i] := y;		   . . .
 | |
| 			*TMP := y;
 | |
| .TE
 | |
| 
 | |
| Fig. 7.4 Elimination of an array address computation
 | |
| .DE
 | |
| Here, '&' is the 'address of' operator,
 | |
| and unary '*' is the indirection operator.
 | |
| (Note that EM actually has different instructions to do
 | |
| a use-indirect or an assign-indirect.)
 |