93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| .NH 2
 | |
| Loop detection
 | |
| .PP
 | |
| Loops are detected by using the loop construction
 | |
| algorithm of.
 | |
| .[~[
 | |
| aho compiler design
 | |
| .], section 13.1.]
 | |
| This algorithm uses \fIback edges\fR.
 | |
| A back edge is an edge from B to C in the CFG,
 | |
| whose head (C) dominates its tail (B).
 | |
| The loop associated with this back edge
 | |
| consists of C plus all nodes in the CFG
 | |
| that can reach B without going through C.
 | |
| .PP
 | |
| As an example of how the algorithm works,
 | |
| consider the piece of program of Fig. 4.1.
 | |
| First just look at the program and try to
 | |
| see what part of the code constitutes the loop.
 | |
| .DS
 | |
| loop
 | |
|    if cond then                       1
 | |
|       -- lots of simple
 | |
|       -- assignment
 | |
|       -- statements              2          3
 | |
|       exit; -- exit loop
 | |
|    else
 | |
|       S; -- one statement
 | |
|    end if;
 | |
| end loop;
 | |
| 
 | |
| Fig. 4.1 A misleading loop
 | |
| .DE
 | |
| Although a human being may be easily deceived
 | |
| by the brackets "loop" and "end loop",
 | |
| the loop detection algorithm will correctly
 | |
| reply that only the test for "cond" and
 | |
| the single statement in the false-part
 | |
| of the if statement are part of the loop!
 | |
| The statements in the true-part only get
 | |
| executed once, so there really is no reason at all
 | |
| to say they're part of the loop too.
 | |
| The CFG contains one back edge, "3->1".
 | |
| As node 3 cannot be reached from node 2,
 | |
| the latter node is not part of the loop.
 | |
| .PP
 | |
| A source of problems with the algorithm is the fact
 | |
| that different back edges may result in
 | |
| the same loop.
 | |
| Such an ill-structured loop is
 | |
| called a \fImessy\fR loop.
 | |
| After a loop has been constructed, it is checked
 | |
| if it is really a new loop.
 | |
| .PP
 | |
| Loops can partly overlap, without one being nested
 | |
| inside the other.
 | |
| This is the case in the program of Fig. 4.2.
 | |
| .DS
 | |
| 1:                              1
 | |
|    S1;
 | |
| 2:
 | |
|    S2;                          2
 | |
|    if cond then
 | |
|       goto 4;
 | |
|    S3;                     3         4
 | |
|    goto 1;
 | |
| 4:
 | |
|    S4;
 | |
|    goto 1;
 | |
| 
 | |
| Fig. 4.2 Partly overlapping loops
 | |
| .DE
 | |
| There are two back edges "3->1" and "4->1",
 | |
| resulting in the loops {1,2,3} and {1,2,4}.
 | |
| With every basic block we associate a set of
 | |
| all loops it is part of.
 | |
| It is not sufficient just to record its
 | |
| most enclosing loop.
 | |
| .PP
 | |
| After all loops of a procedure are detected, we determine
 | |
| the nesting level of every loop.
 | |
| Finally, we find all strong and firm blocks of the loop.
 | |
| If the loop has only one back edge (i.e. it is not messy),
 | |
| the set of firm blocks consists of the
 | |
| head of this back edge and its dominators
 | |
| in the loop (including the loop entry block).
 | |
| A firm block is also strong if it is not a
 | |
| successor of a block that may exit the loop;
 | |
| a block may exit a loop if it has an (immediate) successor
 | |
| that is not part of the loop.
 | |
| For messy loops we do not determine the strong
 | |
| and firm blocks. These loops are expected
 | |
| to occur very rarely.
 |