tiger ir details

25
Tiger IR Details CS 471 November 5, 2007

Upload: lev

Post on 18-Jan-2016

30 views

Category:

Documents


2 download

DESCRIPTION

Tiger IR Details. CS 471 November 5, 2007. Translation. Intermediate code gen is tree translation Abstract syntax tree IR tree Each subtree of AST translated to subtree in IR tree Translation process described by translation function T [ E, A ]. if. boolean. int. ==. =. ;. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Tiger IR Details

Tiger IR Details

CS 471November 5, 2007

Page 2: Tiger IR Details

2 CS 471 – Fall 2007

Translation

Intermediate code gen is tree translation

Abstract syntax tree IR tree

Each subtree of AST translated to subtree in IR tree

Translation process described by translation function T [ E, A ]

Page 3: Tiger IR Details

3 CS 471 – Fall 2007

Translation Example

if

==

int b int 0

=

int a

int b

boolean int;

CJUMP

MEM

fp

8

+MOVE

CONST 0

MEM MEM

fp 4 fp 8

+ +

if (b==0) a = b;

SEQ

== L1 L2

SEQ SEQ

LABEL(L1)

LABEL(L2)

Page 4: Tiger IR Details

4 CS 471 – Fall 2007

Translating control structure

If, while, return statements cause transfer of control within program

Idea: Manage flow of control by introducing labels for statements, use CJUMP and JUMP statements to transfer control to the labels

Page 5: Tiger IR Details

5 CS 471 – Fall 2007

Translating if

CJUMP

T[E ] NAME(t) NAME(f)

SEQ

SEQ

SEQLABEL(t)

LABEL(f)T[ S ]

= SEQ(CJUMP(T[E],NAME(t),NAME(f)), SEQ(LABEL(t), SEQ(T[S], LABEL(f))(if t, f )

T [ if (E) S ] = CJUMP(T[E], t, f)t: T[S]f:

Page 6: Tiger IR Details

6 CS 471 – Fall 2007

Translating while

while (E) S

loop: CJUMP (T[ E ], t, f)

t: T[ S ]

JUMP loop

f:SEQ

LABEL(loop) SEQ

CJUMP SEQ

T[ E ] NAME(t) NAME(f) LABEL(t) SEQT[ S ] SEQ

JUMP(NAME(loop)) LABEL(f)

= SEQ(LABEL(loop), CJUMP, LABEL(t), T[S], JUMP(NAME(loop)), LABEL(f))

Page 7: Tiger IR Details

7 CS 471 – Fall 2007

DEMO

How is this done in x86?

[ifStm.s and whileStm.s]

Page 8: Tiger IR Details

8 CS 471 – Fall 2007

Where we are

abstract syntax tree

intermediate code

canonical intermediate code

assembly code

translation functions

canonicalization

code generation

Page 9: Tiger IR Details

9 CS 471 – Fall 2007

Why canonical form?

Intermediate code has general tree form• easy to generate from AST, but...

Hard to translate directly to assembly• assembly code is a sequence of statements• Intermediate code has nodes corresponding to

assembly statements deep in expression treesCanonical form: all statements brought up to top level of tree -- can generate assembly directly

Page 10: Tiger IR Details

10 CS 471 – Fall 2007

Mismatches: Trees vs. Code

• CJUMP can jump to two labels (real code “falls through”)

• ESEQ nodes within expressions are inconvenient (order of evaluation matters)

• CALL nodes within expressions also depend on order (have side effects)

• CALL nodes within call nodes cause problems

• Transform IR to eliminate above cases

Page 11: Tiger IR Details

11 CS 471 – Fall 2007

Canonical form

In canonical form, all SEQ nodes go down right chain:

Function is just one big SEQ containing all statements: SEQ(s1,s2,s3,s4,s5,…)

Can translate to assembly more directly

SEQ

SEQSEQ

SEQSEQ

s2s1

s3

s5

s4

...

Page 12: Tiger IR Details

12 CS 471 – Fall 2007

Helper Routines

Linearize – removes ESEQs and moves CALLs to top level

BasicBlocks – groups statements into sequences of straight-line code

TraceSchedule – orders BBs so that every CJUMP is followed by its false label

(All found in the canon.c file)

Page 13: Tiger IR Details

13 CS 471 – Fall 2007

Introducing Temporaries

If e1 does not commute with s1• i.e., {s1; e1; e2} {e1; s1; e2}

Must save value of e1 in temporary

OP

e1 ESEQ

s1 e2

ESEQ

SEQ

MOVE

e1 TEMP(t)

s1

OP

TEMP(t) e2

Page 14: Tiger IR Details

14 CS 471 – Fall 2007

General case

When we move all ESEQ nodes to top, arbitrary expression node looks like:

ESEQ

exprSEQ

SEQ

SEQs1

s2

s3 ...

• ESEQ transformation takes arbitrary expression node, returns list of sub-statements to be executed plus final expression.

• ESEQ node built as shown

Page 15: Tiger IR Details

15 CS 471 – Fall 2007

Function Calls, Returns

Tree language permits CALL nodes as subexpressions, e.g.

BINOP(PLUS, CALL(…), CALL(…))

but … second CALL will overwrite RV

Solution:

CALL(fun,args) -> ESEQ(MOVE(TEMP t, CALL(fun,args)), TEMP t)

Then resume ESEQ elimination

Page 16: Tiger IR Details

16 CS 471 – Fall 2007

Canonicalization

SEQ SEQ SEQ SEQ SEQ SEQ

MOVE JUMP LABEL

SEQ

+SEQSEQSEQ

ESEQ

SEQ

SEQ CALL

MOVE

LABEL

EXP

CALLCALL ...

... ...

Page 17: Tiger IR Details

17 CS 471 – Fall 2007

Flattening SEQ nodes

All SEQ nodes now top level or children only of SEQ nodes

No ESEQ nodes -- all statement nodes are children of SEQ nodes

All CALL nodes children of EXP nodes or MOVE nodes at top level

Final step: linearize SEQ nodes: in-order

SEQ

SEQ SEQs1 s2 s3 s4

SEQ SEQ SEQ

s1 s2 s3 s4

SEQ ...

Page 18: Tiger IR Details

18 CS 471 – Fall 2007

Conditional Jumps

IR is now just a linear list of statements

Still contains CJUMP nodes : two-way branches

Real machines : fall-through branches (e.g. JZ, JNZ)

CJUMP e, t, f...LABEL(t)if-true codeLABEL(f)

evaluate e JZ f if-true codef:

Page 19: Tiger IR Details

19 CS 471 – Fall 2007

Basic Blocks

A basic block is a sequence of statements that is always entered at its start and always exits at the end:• starts with a LABEL(n) statement• ends with a JUMP or CJUMP statement• contains no other JUMP or CJUMP statement• contains no interior LABEL that is used as the target

for a JUMP or CJUMP from elsewhere

(Learned algorithm for splitting into basic blocks last time…)

Page 20: Tiger IR Details

20 CS 471 – Fall 2007

Fixing Conditional Jumps

Reorder basic blocks so that (if possible)• the “false” direction of two-way jumps goes to the

very next block• JUMPs go to the next block

What if not satisfied?• For CJUMP add another JUMP immediately after to

go to the right basic block

How to find such an ordering of the basic blocks?

Page 21: Tiger IR Details

21 CS 471 – Fall 2007

Traces

Idea: order blocks according to a possible trace: a sequence of blocks that might (naively) be executed in sequence, never visiting a block more than once

Algorithm:• pick an unmarked block (begin w/ start block)• run a trace until no more unmarked blocks can

be visited, marking each block on arrival• repeat until no more unmarked blocks

Page 22: Tiger IR Details

22 CS 471 – Fall 2007

Example

Possible traces?

1

2

3

4 5

Page 23: Tiger IR Details

23 CS 471 – Fall 2007

Arranging by traces

12

3

4 5

1

2

4

5

3

1

3

2

4

5

Advantages?

Page 24: Tiger IR Details

24 CS 471 – Fall 2007

Trace Selection

Trace selection is important for code layout

Code layout is important for performance

Leverages:

•Heuristics

•Profiling information

Impacts performance

•Instruction cache locality

•Prefetching

Page 25: Tiger IR Details

25 CS 471 – Fall 2007

Traces

•IR Trees are not linear

•Code is linear

•One path through a tree is a trace

•Trace selection is a very important optimization (often uses profiling information)

•Read Chapter 8

•Next Time: – Instruction Selection