ir design, transformations, and code generationcs448h.stanford.edu/irs-transforms-codegen.pdf · a...

28
IR Design, Transformations, and Code Generation CS448h Oct. 8, 2015

Upload: others

Post on 15-Aug-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

IR Design,Transformations, and Code GenerationCS448hOct. 8, 2015

Page 2: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A refresher:Regex & NFA ADTs

nfa = NFA ( node list, start : node )

node = Node ( edge list, accepts : bool, id : int )

edge = EpsEdge ( pointsTo : int ) | CharEdge ( token : char, pointsTo : int )

re = Char ( char ) | Seq ( re list ) | Or ( re list ) | Star ( re ) | Maybe ( re )

nodemap = map int → node

Page 3: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

Let’s design an IR!

Page 4: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A simple expression language

Page 5: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A simple expression language

2*4+3

Page 6: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A simple expression language

2*4+3let x = 4 in 2*x+3

Page 7: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A simple expression language

expr = Add ( expr, expr )| Sub ( expr, expr )| Mul ( expr, expr)| Div ( expr, expr )| Val ( float )| Var ( var )| Let ( var, expr, expr )

var = string

expr = BinOp ( op, expr, expr )| Val ( float )| Var ( var )| Let ( var, expr, expr )

op = Add | Sub | Mul | Div

or

Page 8: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

Lowering through IRs

AST: user code

High-level: user intent

Low-level: execution strategy

Instruction-level: machine operations

lowering

Page 9: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

Patterns in lowering

Recursive traversals generate the next IR from current

In Lua: method dispatch on different node types or pattern match on a type tagbinop:lower()let:lower()

ife.kind==‘binop’then…elsife.kind==‘let’then…

Page 10: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

The visitor patternclassLoweringVisitor:IRVisitor{Expr*visit(ValNode*n){…}Expr*visit(BinopNode*n){Expr*lhs=visit(n->lhs);Expr*rhs=visit(n->rhs);//...dosomethingwiththeopreturnresult;}…}

Page 11: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

Let’s generate some code!

Page 12: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A few lessons from experience building compiler transformations

Page 13: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A few lessons from experience building compiler transformations

Use immutable IR nodes generate new trees, instead of updating in place

Page 14: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A few lessons from experience building compiler transformations

Use immutable IR nodes generate new trees, instead of updating in place

Don’t do too much in one pass more, simpler passes (and representation variants) are your friend!

Page 15: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A few lessons from experience (or, “eating your vegetables”)

Track (file:line) origin for every node in your IRs

Make pretty-printers as early as possible

Page 16: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

Our image processing language

in=loadppm(…)

blurH=(in:shift(-1,0)+in+in:shift(1,0))/3

blurV=(blurH:shift(0,-1)+blurH+blurH:shift(0,1))/3

Page 17: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

How should we represent these programs?

Page 18: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A simple image processing language

img = Op ( op, img, img )| Shift ( img, int, int )| Load ( buf )

op = Add | Sub | Mul | Div

Page 19: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

A simple image processing language

img = Op ( op, img, img )| Shift ( img, int, int )| Load ( buf )| Const ( int )

op = Add | Sub | Mul | Div

Page 20: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

How can we generate code for this?

Page 21: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

An image processing loop IR

stmt = Loop ( var, base : int, extent : int, body : stmt )| Store ( buf, idx : expr, body : stmt )| Alloc ( buf, size : int, stmt )

expr = img -- from before| Var ( var )

| Block ( stmt list )

Page 22: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

An image processing loop IR

stmt = Loop ( var, base : int, extent : int, body : stmt )| Store ( buf, idx : expr, body : stmt )| Alloc ( buf, size : int, stmt )

expr = img -- from before| Var ( var )

| Block ( stmt list )

^, kind

Page 23: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

An image processing loop IR

stmt = Loop ( var, base : int, extent : int, body : stmt )| Store ( buf, idx : expr, body : stmt )| Alloc ( buf, size : int, stmt )

expr = img -- from before| Var ( var )

| Block ( stmt list )

kind = Serial| Parallel| Vectorized ( int )

^, kind

Page 24: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

How else might we represent these programs?

Page 25: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

How else might we represent these programs?

blurH blurVin

Page 26: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

How else might we represent these programs?

blurH blurVin[-1,+1] [-W,+W]

Page 27: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

How else might we represent these programs?

blurH blurVin[-1,+1] [-W,+W]

Synchronous dataflow graph[Cf. StreamIt, Darkroom, …]

Page 28: IR Design, Transformations, and Code Generationcs448h.stanford.edu/IRs-transforms-codegen.pdf · A refresher: Regex & NFA ADTs nfa = NFA ( node list, start : node ) node = Node (

Foreshadowing…

Halide

Darkroom

http://halide.io

http://darkroom-lang.org