eecs 583 – class 4 if-conversion

Post on 03-Feb-2016

37 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

EECS 583 – Class 4 If-conversion. University of Michigan September 19, 2011. Announcements & Reading Material. Reminder – HW 1 due Friday Talk to Daya this week if you are having troubles with LLVM Today’s class - PowerPoint PPT Presentation

TRANSCRIPT

EECS 583 – Class 4If-conversion

University of Michigan

September 19, 2011

- 2 -

Announcements & Reading Material

Reminder – HW 1 due Friday» Talk to Daya this week if you are having troubles with LLVM

Today’s class» “The Program Dependence Graph and Its Use in Optimization”,

J. Ferrante, K. Ottenstein, and J. Warren, ACM TOPLAS, 1987 This is a long paper – the part we care about is the control

dependence stuff. The PDG is interesting and you should skim it over, but we will not talk about it now

» “On Predicated Execution”, Park and Schlansker, HPL Technical Report, 1991.

Material for Wednesday» "Effective Compiler Support for Predicated Execution using the

Hyperblock", S. Mahlke et al., MICRO-25, 1992.

» "Control CPR: A Branch Height Reduction Optimization for EPIC Processors", M. Schlansker et al., PLDI-99, 1999.

- 3 -

From Last Time: Predicated Execution

BB1

BB2

BB4

BB3

a = b + cif (a > 0) e = f + gelse e = f / gh = i - j

add a, b, cbgt a, 0, L1div e, f, gjump L2L1: add e, f, gL2: sub h, i, j

BB1BB1BB3BB3BB2BB4

Traditional branching code

BB1BB2BB3BB4

add a, b, c if Tp2 = a > 0 if Tp3 = a <= 0 if Tdiv e, f, g if p3add e, f, g if p2sub h, i, j if T

BB1BB1BB1BB3BB2BB4

Predicated code

p2 BB2p3 BB3

- 4 -

From Last Time: Class Problem

if (a > 0) { if (b > 0) r = t + s else u = v + 1 y = x + 1}

a. Draw the CFGb. Predicate the code removing all branches

u = v + 1r = t + s

y = x + 1

b > 0 b <= 0

a > 0a <= 0

p1 = cmpp.UN(a > 0) if Tp2, p3 = cmpp.UNUC(b > 0) if p1r = t + s if p2u = v + 1 if p3y = x + 1 if p1

- 5 -

If-conversion

Algorithm for generating predicated code» Automate what we’ve been doing by hand» Handle arbitrary complex graphs

But, acyclic subgraph only!! Need a branch to get you back to the top of a loop

» Efficient Roots are from Vector computer days

» Vectorize a loop with an if-statement in the body 4 steps

» 1. Loop backedge coalescing» 2. Control dependence analysis» 3. Control flow substitution» 4. CMPP compaction

My version of Park & Schlansker

- 6 -

Running Example – Initial State

BB2

BB4

BB7

BB6

do { b = load(a) if (b < 0) { if ((c > 0) && (b > 13)) b = b + 1 else c = c + 1 d = d + 1 } else { e = e + 1 if (c > 25) continue } a = a + 1} while (e < 34)

BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25c > 25

e < 34e >= 34

d++

a++

e++

b++ c++

- 7 -

Step 1: Backedge Coalescing

Recall – Loop backedge is branch from inside the loop back to the loop header

This step only applicable for a loop body» If not a loop body skip this step

Process» Create a new basic block

New BB contains an unconditional branch to the loop header

» Adjust all other backedges to go to new BB rather than header Why do this?

» Heuristic step – Not essential for correctness If-conversion cannot remove backedges (only forward edges) But this allows the control logic to figure out which backedge you

take to be eliminated

» Generally this is a good thing to do

- 8 -

Running Example – Backedge Coalescing

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

e >= 34

d++

a++

e++

b++ c++

BB9

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25c > 25

e < 34e >= 34

d++

a++

e++

b++ c++

- 9 -

Step 2: Control Dependence Analysis (CD)

Control flow – Execution transfer from 1 BB to another via a taken branch or fallthrough path

Dependence – Ordering constraint between 2 operations» Must execute in proper order to achieve the correct result» O1: a = b + c» O2: d = a – e» O2 dependent on O1

Control dependence – One operation controls the execution of another» O1: blt a, 0, SKIP» O2: b = c + d» SKIP:» O2 control dependent on O1

Control dependence analysis derives these dependences

- 10 -

Control Dependences

Recall» Post dominator – BBX is post dominated by BBY if every path

from BBX to EXIT contains BBY

» Immediate post dominator – First breadth first successor of a block that is a post dominator

Control dependence – BBY is control dependent on BBX iff» 1. There exists a directed path P from BBX to BBY with any

BBZ in P (excluding BBX and BBY) post dominated by BBY

» 2. BBX is not post dominated by BBY

In English,» A BB is control dependent on the closest BB(s) that determine(s)

its execution

» Its actually not a BB, it’s a control flow edge coming out of a BB

- 11 -

Control Dependence Example

BB2

BB4

BB6

BB5

BB1

BB3

BB7

Control dependencesBB1:BB2:BB3:BB4:BB5:BB6:BB7:

T F

T F

Notation positive BB number = fallthru directionnegative BB number = taken direction

- 12 -

Running Example – CDs

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

Control deps (left is taken)BB1:BB2:BB3:BB4:BB5:BB6:BB7:BB8:BB9:

Entry

Exit

First, nuke backedge(s)Second, nuke exit edgesThen, Add pseudo entry/exit nodes - Entry nodes with no predecessors - Exit nodes with no successors

- 13 -

Algorithm for Control Dependence Analysis

for each basic block x in region for each outgoing control flow edge e of x y = destination basic block of e if (y not in pdom(x)) then lub = ipdom(x) if (e corresponds to a taken branch) then x_id = -x.id else x_id = x.id endif t = y while (t != lub) do cd(t) += x_id; t = ipdom(t) endwhile endif endforendfor

Notes

Compute cd(x) which contains thoseBBs which x is control dependent on

Iterate on per edge basis, addingedge to each cd set it is a member of

- 14 -

Running Example – Post Dominators

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

pdom ipdomBB1: 1, 9, ex 9BB2: 2, 7, 8, 9, ex 7BB3: 3, 9, ex 9BB4: 4, 7, 8, 9, ex 7BB5: 5, 7, 8, 9, ex 7BB6: 6, 7, 8, 9, ex 7BB7: 7, 8, 9, ex 8BB8: 8, 9, ex 9BB9: 9, ex ex

Entry

Exit

- 15 -

Running Example – CDs Via Algorithm

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

Entry

Exit

x = 1e = taken edge 1 2y = 2y not in pdom(x)lub = 9x_id = -1t = 22 != 9cd(2) += -1t = 77 != 9cd(7) += -1t = 88 != 9cd(8) += -1t = 99 == 9

1 2 edge (aka –1)

- 16 -

Running Example – CDs Via Algorithm (2)

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

Entry

Exit

x = 3e = taken edge 3 8y = 8y not in pdom(x)lub = 9x_id = -3t = 88 != 9cd(8) += -3t = 99 == 9

3 8 edge (aka -3)

Class Problem: 1 3 edge (aka 1)

- 17 -

Running Example – CDs Via Algorithm (3)

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

Entry

Exit

Control deps (left is taken)BB1: noneBB2: -1BB3: 1BB4: -2BB5: -4BB6: 2, 4BB7: -1BB8: -1, -3BB9: none

- 18 -

Step 3: Control Flow Substitution

Go from branching code sequential predicated code 5 baby steps

» 1. Create predicates

» 2. CMPP insertion

» 3. Guard operations

» 4. Remove branches

» 5. Initialize predicates

- 19 -

Predicate Creation

R/K calculation – Mapping predicates to blocks» Paper more complicated than it really is

» K = unique sets of control dependences

» Create a new predicate for each element of K

» R(bb) = predicate that represents CD set for bb, ie the bb’s assigned predicate (all ops in that bb guarded by R(bb))

K = {{-1}, {1}, {-2}, {-4}, {2,4}, {-1,-3}}predicates = p1, p2, p3, p4, p5, p6

bb = 1, 2, 3, 4, 5, 6, 7, 8, 9CD(bb) = {{none}, {-1}, {1}, {-2}, {-4}, {2,4}, {-1}, {-1,-3}, {none}R(bb) = T p1 p2 p3 p4 p5 p1 p6 T

- 20 -

CMPP Creation/Insertion

For each control dependence set» For each edge in the control dependence set

Identify branch condition that causes edge to be traversed Create CMPP to compute corresponding branch condition

OR-type – handles worst case guard = True destination = predicate assigned to that CD set Insert at end of BB that is the source of the edge

K = {{-1}, {1}, {-2}, {-4}, {2,4}, {-1,-3}}predicates = p1, p2, p3, p4, p5, p6

p1 = cmpp.ON (b < 0) if T BB1

- 21 -

Running Example – CMPP Creation

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

Entry

Exit

K = {{-1}, {1}, {-2}, {-4}, {2,4}, {-1,-3}}p’s = p1, p2, p3, p4, p5, p6

p1 = cmpp.ON (b < 0) if T BB1p2 = cmpp.ON (b >= 0) if T BB1p3 = cmpp.ON (c > 0) if T BB2p4 = cmpp.ON (b > 13) if T BB4p5 = cmpp.ON (c <= 0) if T BB2p5 = cmpp.ON (b <= 13) if T BB4p6 = cmpp.ON (b < 0) if T BB1p6 = cmpp.ON (c <= 25) if T BB3

- 22 -

Control Flow Substitution – The Rest

Guard all operations in each bb by R(bb)» Including the newly inserted CMPPs

Nuke all the branches» Except exit edges and backedges

Initialize each predicate to 0 in first BB

bb = 1, 2, 3, 4, 5, 6, 7, 8, 9CD(bb) = {{none}, {-1}, {1}, {-2}, {-4}, {2,4}, {-1}, {-1,-3}, {none}R(bb) = T p1 p2 p3 p4 p5 p1 p6 T

- 23 -

Running Example – Control Flow Substitution

BB2

BB4

BB7

BB6BB5

BB1

BB3

BB8

b < 0 b >= 0

c <= 0c > 0

b > 13b <= 13

c <= 25 c > 25

e < 34

d++

a++

e++

b++ c++

BB9

Loop: p1 = p2 = p3 = p4 = p5 = p6 = 0 b = load(a) if T p1 = cmpp.ON (b < 0) if T p2 = cmpp.ON (b >= 0) if T p6 = cmpp.ON (b < 0) if T p3 = cmpp.ON (c > 0) if p1 p5 = cmpp.ON (c <= 0) if p1 p4 = cmpp.ON (b > 13) if p3 p5 = cmpp.ON (b <= 13) if p3 b = b + 1 if p4 c = c + 1 if p5 d = d + 1 if p1 p6 = cmpp.ON (c <= 25) if p2 e = e + 1 if p2 a = a + 1 if p6 bge e, 34, Done if p6 jump Loop if TDone:

e >= 34

- 24 -

Step 4: CMPP Compaction

Convert ON CMPPs to UN» All singly defined predicates don’t need to be OR-type

» OR of 1 condition Just compute it !!!

» Remove initialization (Unconditional don’t require init)

Reduce number of CMPPs» Utilize 2nd destination slot

» Combine any 2 CMPPs with: Same source operands Same guarding predicate Same or opposite compare conditions

- 25 -

Running Example - CMPP CompactionLoop: p1 = p2 = p3 = p4 = p5 = p6 = 0 b = load(a) if T p1 = cmpp.ON (b < 0) if T p2 = cmpp.ON (b >= 0) if T p6 = cmpp.ON (b < 0) if T p3 = cmpp.ON (c > 0) if p1 p5 = cmpp.ON (c <= 0) if p1 p4 = cmpp.ON (b > 13) if p3 p5 = cmpp.ON (b <= 13) if p3 b = b + 1 if p4 c = c + 1 if p5 d = d + 1 if p1 p6 = cmpp.ON (c <= 25) if p2 e = e + 1 if p2 a = a + 1 if p6 bge e, 34, Done if p6 jump Loop if TDone:

Loop: p5 = p6 = 0 b = load(a) if T p1,p2 = cmpp.UN.UC (b < 0) if T p6 = cmpp.ON (b < 0) if T p3,p5 = cmpp.UN.OC (c > 0) if p1 p4,p5 = cmpp.UN.OC (b > 13) if p3 b = b + 1 if p4 c = c + 1 if p5 d = d + 1 if p1 p6 = cmpp.ON (c <= 25) if p2 e = e + 1 if p2 a = a + 1 if p6 bge e, 34, Done if p6 jump Loop if TDone:

- 26 -

Class Problem

if (a > 0) { r = t + s if (b > 0 || c > 0) u = v + 1 else if (d > 0) x = y + 1 else z = z + 1}

a. Draw the CFGb. Compute CDc. If-convert the code

Next Time – When to If-convert, When to use Branches

top related