11.10.1 Unnecessary Loads

11.10.2 Branch (to a) (around a) Branch

11.10.3 Cross Jumping

11.10.4 Recognizing Special Instruction or Modes

11.10.2 Branch (to a) (around a) Branch

Many times compilers produce code that branches to another branch. Consider the following embedded CASE statements and the branches produced by a simple code generator:

 
Line Source Output Code
50 WHILE a DO 50:
51 BEGIN
   ...
61 CASE i OF
62 0: IF b THEN
63 x:=1;
64 ELSE 64: BRANCH 66
65 x:=2;
66 {end case i=0} 66: BRANCH 142
67 l:
   ...
81 4: CASE j OF
   ...
89 2: IF b THEN
90 x:=0;
91 ELSE 91: BRANCH 93
92 x:=1;
93 {end case j=2} 93: BRANCH 121
   ...
120 end; {case j}
121 {end case i=4} 121: BRANCH 142
   ...
141 end; {case i}
142 end; {while a} 142: BRANCH 50

Just looking at the BRANCHes, we see:

    50:

    64: BRANCH 66

    66: BRANCH 142

    91: BRANCH 93

    93: BRANCH 121

    121: BRANCH 142

    142: BRANCH 50

If we fully eliminated the indirect jumps, it would look like this:

    50: 64: BRANCH 50

    66: BRANCH 50

    91: BRANCH 50

    93: BRANCH 50

    121: BRANCH 50

    142: BRANCH 50