Vi skal fjerne ESEQ fra venstre siden uden ændre rækkefølgen beregningerne forgår i. Prøve at tegne grafer lignende dem i figur 8.1 og overbevis jer selv om at transformationerne er rigtige.
a) MOVE(TEMP t, ESEQ(s, e)) => SEQ(MOVE(TEMP t), SEQ(s, EXP(e)))
b) MOVE(MEM(ESEQ(s, e1)), e1) => SEQ(s, MOVE(EXP(e1), EXP(e2)))
c) MOVE(MEM(e1), ESEQ(s, e2)) =>SEQ(MOVE(MEM(e1)), SEQ(s, EXP(e2)))
d) EXP(ESEQ(s, e) => SEQ(s, EXP(e))
e) EXP(CALL(ESEQ(s, e), args)) => SEQ(s, EXP(CALL(e, args)))
f) MOVE(TEMP t, CALL (ESEQ(s, e), args)) => SEQ(s, MOVE(TEMP t), CALL(e, args)))
g) EXP(CALL(e1, [e2,ESEQ(s, e3,e4])) => SEQ(MOVE(TEMP t1, e1), SEQ(MOVE(TEMP t2, e2), SEQ(s, EXP(CALL(t1, [t2, e3,e4])))))
Husk for CJUMP hvis betingelsen evaluerer til sandt så hoppes til den label der er angivet. Ellers tages den næste linje i programmet.
|
Vi indsætter først en label i toppen og labels for alle linjer der er gotos til. Yderligere laver laves if'er om til CJUMPs og rene gotos til JUMPS |
|
Vi deler så i basic blocks. Når vi ser en label stops blok omgående og nu begynder. Når vi ser CJUMP eller JUMP tages denne med i eksisterende basic block og en ny startes |
|
Vi indsættes ekstra labels og jumps. |
|
Kristian Torp
torp (at) cs (dot) auc (dot) dk