Question? Leave a message!




Program Analysis and Optimization

Program Analysis and Optimization
Spring Spring 2009 2009 Lecture Lecture 9: 9: Introduction Introduction to to Program Analysis and Optimization OptimizationOutline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Prog g ram Analy y sis • Compile-time reasoning about run-time behavior of program – Can discover things that are always true: • “ “ x ii s all ways 1 1 ii n thth e stt att ement t y = x + z” ” • “the pointer p always points into array a” • “the statement return 5 can never execute” – Can infer things that are likely to be true: • “the reference r usually refers to an object of class C” • • “the the statement statement a a=b+c = b + c appears appears t to o e execute xecute more more frequently frequently than the statement x = y + z” – Distinction between data and control-flow properties Saman Amarasinghe 3 6.035 ©MIT Fall 1998 Transformations • Use analysis results to transform program • Overall goal: improve some aspect of program • Traditional goals: – Rd Reduce numbb er off executed d ii nstructiions – Reduce overall code size • • Other Other goals goals emerge emerge as as space space becomes becomes more more complex complex – Reduce number of cycles • Use vector or DSP instructions • Improve instruction or data cache hit rate – Reduce power consumption – Reduce Reduce memory memory usage usage Saman Amarasinghe 4 6.035 ©MIT Fall 1998 Outline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Control Flow Grap ph • Nodes Rep p resent Comp p utation – Each Node is a Basic Block –Ba asic Blo ock is a a Sequ q uence o of Instru uctio ons with • No Branches Out Of Middle of Basic Block • No Branches Into Middle of Basic Block • Basic Blocks should be maximal – Execution of basic block starts with first instruction – Includes all instructions in basic block •Edges Represent Control Flow Saman Amarasinghe 6 6.035 ©MIT Fall 1998 s = 0; Control Flow Grap p h a = 4; i = 0; into add(n, k) k k == 0 0 s = 0; a = 4; i = 0; if (k == 0) b b = 1 1 ; b = 2; b = 1; else b= b = 2; 2; i n while (i n) s = s + ab; ; s = s ++ abb ; i = i + 1; return s; i = i + 1; return s; Saman Amarasinghe 7 6.035 ©MIT Fall 1998 Basic Block Construction • Start with instruction control-flow ggp raph • Visit all edges in graph • • Merge Merge a adjacent djacent nodes nodes if if – Only one edge from first node – Only Only one one edge edge into into second second node node s = 0; s = 0; a = 4; a = 4; Saman Amarasinghe 8 6.035 ©MIT Fall 1998 s = 0; s = 0; a = 4; a = 4; i = 0; k= k==0 =0 b = 2; b = 1; i n s = s + ab; return s; ii i =i+1+1;; Saman Amarasinghe 9 6.035 ©MIT Fall 2006s = 0; s = 0; a = 4; a = 4; i = 0; i = 0; k= k==0 =0 b = 2; b = 1; i n s = s + ab; return s; ii i =i+1+1;; Saman Amarasinghe 10 6.035 ©MIT Fall 2006s = 0; s = 0; a = 4; a = 4; i = 0; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 1; i n s = s + ab; return s; iii =i+1+1;; Saman Amarasinghe 11 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 2; b = 1; i n s = s + ab; return s; iii =i+1+1;; Saman Amarasinghe 12 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 2; b = 1; i n i n s = s + ab; return s; iii =i+1+1;; Saman Amarasinghe 13 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; iii =i+1+1;; Saman Amarasinghe 14 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; i = i + 1; i = i + 1; Saman Amarasinghe 15 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; i = i + 1; iii =i+1+1;; Saman Amarasinghe 16 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; return s; i = i + 1; ii i =i+1+1;; Saman Amarasinghe 17 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 1; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; return s; i = i + 1; ii i =i+1+1;; Saman Amarasinghe 18 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 1; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; return s; i = i + 1; ii i =i+1+1;; Saman Amarasinghe 19 6.035 ©MIT Fall 2006s = 0; s=0 s=0;; a = 4; i = 0; a = 4; k= k==0 =0 i = 0; k= k==0 =0 b = 2; b = 1; b = 2; b = 1; i n i n s = s + ab; s = s + ab; return s; return s; i = i + 1; ii i =i+1+1;; Saman Amarasinghe 20 6.035 ©MIT Fall 2006Program Points, Split and Join Points Points • One program point before and after each statement in program • Split point has multiple successors – conditional branch statements only split points • Merge point has multiple predecessors • Each basic block – Either starts with a merge point or its predecessor ends with a split point – Either ends with a split point or its successor sttt arts wiithth a merge poiint t Saman Amarasinghe 21 6.035 ©MIT Fall 1998 Basic Block Op ptimizations • • Common Common S Sub ub- - • • Copy Copy Propagation Propagation – a=x+y; b=a; c=b+z; Expression Elimination – a=x+y; b=a; c=a+z; –a=(( x+y)y) +z; b=x+yy ; – t=x+y; a=t+z; b=t; • • Dead Dead Code Code Elimination Elimination • Constant Constant P P ropagation opagation – a=x+y; b=a; b=a+z; –x=5; b=x+y; – a=x+y; b=a+z –x=5; ; b=5+y; y; • Strength Reduction • Algebraic Identities – ti t=i4 4 ; – a=x1; – t=i2; –a=x; Saman Amarasinghe 22 6.035 ©MIT Fall 1998 Basic Block Analyy sis Ap ppp roach • Assume normalized basic block - all statements are of the form – var = var op var (where op is a binary operator) – var = op var (where op is a unary operator) – var = var • Simulate a symbolic execution of basic block – Reason about values of variables (or other aspects of computation) – Derive property of interest Saman Amarasinghe 23 6.035 ©MIT Fall 1998 Two Kinds of Variables • Temp p oraries Introduced By y Comp p iler – Transfer values only within basic block –Introdu oduced d a as pa p art o of instru uctio on fla attening g – Introduced by optimizations/transformations – Typically Typically assigned assigned to to only only once once • Program Variables – Declared Declared in in original original program program – May be assigned to multiple times – MM ay tt ransff er val lues bb ett ween bb asii c blbl ockk s Saman Amarasinghe 24 6.035 ©MIT Fall 1998 Outline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Value Numbering • Reason about values of variables and expressions in the program – Simulate Simulate execution execution of of basic basic block block – Assign virtual value to each variable and expression • Discovered Discovered p property: roperty: which which v variables ariables and and e expressions xpressions have the same value • S Stand dard d use: – Common subexpression elimination – Typically Typically combined combined with with transformation transformation that that • Saves computed values in temporaries • Replaces expressions with temporaries when value of f expressiion previiouslly comput ted d Saman Amarasinghe 26 6.035 ©MIT Fall 1998 New Basic Original Basic Block Block a = x+y a = x+y t1 = a b b = az a+z b b= = a+z a+z b = b+y t2 = b c = a+z b = b+y t3 t3 = b b c = t2 Var to Val x x  v1 v1 Exp to Val Exp to Tmp y  v2 a  v3 v1+v2 v1+v2  v3 v3 v1+v2 v1+v2  t1 t1 z  v4 4 v3+v4  v5 v3+v4  t2 b b  v5 v6 v5+v2  t6 v5+v2  v6 c  v5 Saman Amarasinghe 27 6.035 ©MIT Fall 1998 Value Numbering g Summary y • Forward symbolic execution of basic block • Each new value assigned to temporary – a=x+y; becomes a=x+y; t=a; – Temporary Temporary p preserves reserves value value f for or use use llater ater in in program program e even ven if original variable rewritten • a=x+y; a=a+z; b=x+y becomes • a=x+y; t=a; a=a+z; b=t; • Maps – VVt ar to V Vall – specifi ifies symb boli lic vallue f for each h iiabl bl e var – Exp to Val – specifies value of each evaluated expression – Exp Exp to to Tmp Tmp – specifies specifies tmp tmp t that hat h holds olds value value of of each each evaluated expression Saman Amarasinghe 28 6.035 ©MIT Fall 1998 Map p Usag g e •Var to Val – Used to compute symbolic value of y and z when processing statement off f form x = y + z •Exp p to Tmp p – Used to determine which tmp to use if value(y) + value(z) previously computed when processing statement statement o of f f form orm x x = = y y + + z z •Exp to Val – Used d to upd d ate Var to Vall wh hen • processing statement of the form x = y + z, and • • value(y) value(y) + + value(z) value(z) previously previously computed computed Saman Amarasinghe 29 6.035 ©MIT Fall 1998 Interesting g Prop p erties • Finds common subexpressions even if they use diff different t vari iabl bles ii n expressiions – y=a+b; x=b; z=a+x becomes – yy =a a+b; +b;t t=y; y; xx =b; b;z z=t t – Why? Because computes with symbolic values • • Finds Finds c common ommon subexpressions subexpressions even even iif f v variable ariable that originally held the value was overwritten – yya =a+b; +b; y1 y=1; ; za z=a+b +b becomes becomes – y=a+b; t=y; y=1; z=t –Why y ? Because saves values away y in temporaries Saman Amarasinghe 30 6.035 ©MIT Fall 1998 One More Interesting g Prop perty y • Flattening and CSE combine to capture partial and arbitrarily complex common subexpressions w=(a+b)+c; y=(a+x)+c; z=a+b; – After flattening: t1 t1=a+b; a+b; wt w=t1+c; 1+c; xb x=b; ; t2 t2=a+x; a+x; yt y=t2+c; 2+c; z z=a a+b; +b; x=b; – CSE algorithm notices that •t1 1+c and d 2 2+c compute same vallue t • In the statement z = a+b, a+b has already been computed so generated code can reuse the result t1=a+b; w=t1+c; t3=w; x=b; t2=t1; y=t3; z=t1; Saman Amarasinghe 31 6.035 ©MIT Fall 1998 Problems I • Algorithm has a temporary for each new value – a=x+y; t1=a; •Introduces – lots of temporaries – lots of copy statements to temporaries • In many cases, temporaries and copy statements are unnecessary • S S o we ellii mii nat t e th th em with ith copy propagati ti on and d dead code elimination Saman Amarasinghe 32 6.035 ©MIT Fall 1998 Problems II • Expressions have to be identical – a=x+y+z; b=y+z+x; c=x2+y+2z–(x+z) • We use canonicalization • We use algebraic simplification Saman Amarasinghe 33 6.035 ©MIT Fall 1998 Copy py Prop pag g ation • Once again, simulate execution of program • If can, use original variable instead of temporary – a=x+y; b=x+y; – After CSE becomes a=x+y; t=a; b=t; – After CP becomes a=x+y; t=a; b=a; – Aft Aft er D DCE CE b becomes a=x+y; b b=a; • Key idea: – d det t ermi ine wh h en oriigii nall variiabl ble iis NOT NOT overwritt itten between its assignment statement and the use of the computed value – If not overwritten, use original variable Saman Amarasinghe 34 6.035 ©MIT Fall 1998 Outline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Copy py Prop p ag g ation Map p s • Maintain two map ps – tmp to var: tells which variable to use instead of a given temporary variable – var to set: inverse of tmp to var. tells which temps are mapped to a given variable by tmp to var Saman Amarasinghe 36 6.035 ©MIT Fall 1998 Copy py Prop pag gation Examp ple • Original • After CSE and Copy a a = x+y x+y Propagation b = a+z a = x+y c = x+y t1 = a a = b b = a+z • After CSE t2 t2 = = b b a = x+y c = a t1 = a a a = b b b = a+z t2 = b c c = t t11 a = b Saman Amarasinghe 37 6.035 ©MIT Fall 2006 Copy py Prop pag gation Examp ple Basic Block After Basic Block CSE CSE and d C C opy P Prop Aft Aft er C CSE SE a = x+y a = x+y t1 t1 = a t1 t1 = a tmp tmp to to v va ar r va var r t to o s set et t1  a a t1 Saman Amarasinghe 38 6.035 ©MIT Fall 2006 Copy py Prop pag gation Examp ple Basic Block After Basic Block CSE CSE and d C C opy P Prop Af Af ter CSE CSE a = x+y a = x+y t1 t1 = a t1 t1 = a b = a+z b = a+z t2 = b t2 = b tmp tmp to to v va ar r va var r t to o s set et t1  a a t1 t2 t2  b b b b t2 t2 Saman Amarasinghe 39 6.035 ©MIT Fall 2006 Copy py Prop pag gation Examp ple Basic Block After Basic Block CSE CSE and d C C opy P Prop Aft Aft er C CSE SE a = x+y a = x+y t1 t1 = a t1 t1 = a b = a+z b = a+z t2 = b t2 = b c = t1 tmp tmp to to v va ar r va var r t to o s set et t1  a a t1 t2 t2  b b b b t2 t2 Saman Amarasinghe 40 6.035 ©MIT Fall 2006 Copy py Prop pag gation Examp ple Basic Block After Basic Block CSE CSE and d C C opy P Prop Aft Aft er C CSE SE a = x+y a = x+y t1 t1 = a t1 t1 = a b = a+z b = a+z t2 = b t2 = b c = a c = t1 tmp tmp to to v va ar r va var r t to o s set et t1  a a t1 t2 t2  b b b b  t2 t2 Saman Amarasinghe 41 6.035 ©MIT Fall 2006 Copy py Prop pag gation Examp ple Basic Block After Basic Block CSE CSE and d C C opy P Prop Aft Aft er C CSE SE a = x+y a = x+y t1 t1 = a t1 t1 = a b = a+z b = a+z t2 = b t2 = b c = a c = t1 a = b a = b tmp tmp to to v va ar r va var r t to o s set et t1  a a t1 t2 t2  b b b b  t2 t2 Saman Amarasinghe 42 6.035 ©MIT Fall 2006 Copy py Prop pag gation Examp ple Basic Block After Basic Block CSE CSE and d C C opy P Prop Aft Aft er C CSE SE a = x+y a = x+y t1 t1 = a t1 t1 = a b = a+z b = a+z t2 = b t2 = b c = a c = t1 a = b a = b tmp tmp to to v va ar r va var r t to o s set et t1  t1 a  t2 t2  b b b b  t2 t2 Saman Amarasinghe 43 6.035 ©MIT Fall 2006 Outline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Dead Code Elimination •Copy py p p rop p ag g ation keep p s all temp p s around • May be temps that are never read • • Dead Dead Code Code Elimination Elimination removes removes them them Basic Block After Basic Block After CSE CSE a and nd CP CP CSE CSE , CP CP and and DCE DCE a = x+y a = x+y t1 t1 = a a b= b = a+z a+z b = a+z c = a t2 = b a = b c c=a = a a = b Saman Amarasinghe 45 6.035 ©MIT Fall 1998 Dead Code Elimination • Basic Idea – Process Code In Reverse Execution Order –Maaa intain aa set oof vaariabables thaat aare needded d later in computation – If encounter an assig g nment to a temp p orary y that is not needed, remove assignment Saman Amarasinghe 46 6.035 ©MIT Fall 1998 Basic Block After CSE and Copy Prop a = x+y t1 t1 = a b = a+z t2 = b c = a a = b Needed Set b Saman Amarasinghe 47 6.035 ©MIT Fall 2006 Basic Block After CSE and Copy Prop a = x+y t1 t1 = a b = a+z t2 = b c = a a = b Needed Set , a, b Saman Amarasinghe 48 6.035 ©MIT Fall 2006 Basic Block After CSE and Copy Prop a = x+y t1 t1 = a b = a+z t2 = b c = a a = b Needed Set , a, b Saman Amarasinghe 49 6.035 ©MIT Fall 2006 Basic Block After CSE and Copy Prop a = x+y t1 t1 = a b = a+z c = a a = b Needed Set , a, b Saman Amarasinghe 50 6.035 ©MIT Fall 2006 Basic Block After CSE and Copy Prop a = x+y t1 t1 = a b = a+z c = a a = b Needed Set , a, b, , z Saman Amarasinghe 51 6.035 ©MIT Fall 2006 Basic Block After CSE and Copy Prop a = x+y t1 t1 = a b = a+z c = a a = b Needed Set , a, b, , z Saman Amarasinghe 52 6.035 ©MIT Fall 2006 Basic Block After CSE and Copy Prop a = x+y b = a+z c = a a = b Needed Set , a, b, , z Saman Amarasinghe 53 6.035 ©MIT Fall 2006 Basic Block After , CSE Copy Propagation, and Dead Code Elimination a = x+y b = a+z c = a a = b Needed Set , a, b, , z Saman Amarasinghe 54 6.035 ©MIT Fall 2006 Basic Block After , CSE Copy Propagation, and Dead Code Elimination a = x+y b = a+z c = a a = b Needed Set , a, b, , z Saman Amarasinghe 55 6.035 ©MIT Fall 2006 Outline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Alg gebraic Simp p lification • App pply y our knowledg g e from alg gebra,, number theory etc. to simplify expressions Saman Amarasinghe 57 6.035 ©MIT Fall 1998 Alg g ebraic Simp p lification •App pply y our knowledg g e from alg g ebra,, number theory etc. to simplify expressions • Example Example –a + 0  a – a 1  a –a / 1  a – a 0  0 – 0 0 -a  -a – a + (-b)  a - b –-( (-a) a)  a a Saman Amarasinghe 58 6.035 ©MIT Fall 1998 Alg gebraic Simp p lification •App pply y our knowledg g e from alg gebra,, number theory etc. to simplify expressions • Example Example –a  true  a –a  false  false –a  true  true –a  false  a Saman Amarasinghe 59 6.035 ©MIT Fall 1998 Alg gebraic Simp p lification •App pply y our knowledg g e from alg gebra,, number theory etc. to simplify expressions • Example Example –a 2  aa – a 2  a + a – a 8  a 3 Saman Amarasinghe 60 6.035 ©MIT Fall 1998 Opportunities for Algebraic Algebraic Simplification Simplification • • In In the the code code – Programmers are lazy to simplify expressions – P Programs rograms a are rem more orer readable eadablew with ithf full ull e expressions xpressions • After compiler expansion – Example: Array read A812 will get expanded to – (Abase + 4(12 + 8256)) which can be simplified • After other optimizations Saman Amarasinghe 61 6.035 ©MIT Fall 1998 Usefulness of Alg gebraic Simp p lification • RRd educes th th e numbb er of f ii nsttructiti ons • Uses less expensive instructions • Enable other optimizations Saman Amarasinghe 62 6.035 ©MIT Fall 1998 Imp plementation • Not a data-flow op ptimization • Find candidates that matches the simplification simplification rules rules and and simplify simplify the the expression trees • • Candidates Candidates may may n not ot be be obvious obvious Saman Amarasinghe 63 6.035 ©MIT Fall 1998 Imp plementation • Not a data-flow op ptimization • Find candidates that matches the simplification simplification rules rules and and simplify simplify the the expression trees • • Candidates Candidates may may n not ot be be obvious obvious –Example + a+b a + b - a a - a a b Saman Amarasinghe 64 6.035 ©MIT Fall 1998 Use knowledg ge about op p erators • • Commutative Commutative operators operators – a op b = b op a – • Associative operators – ( (a op p b) ) op p c = b op p ( (a op p c) ) Saman Amarasinghe 65 6.035 ©MIT Fall 1998 Canonical Format •Put exp pression trees into a canonical format –Sum of multip plicands – Variables/terms in a canonical order – Example Example (a+3)(a+8)4  4aa+44a+96 – Section 12.3.1 of whale book talks about this Saman Amarasinghe 66 6.035 ©MIT Fall 1998 Effects on the Numerical Stability y • Some alg gebraic simp plifications mayy pp roduce incorrect results Saman Amarasinghe 67 6.035 ©MIT Fall 1998 Effects on the Numerical Stability y • Some alg gebraic simp plifications mayy pp roduce incorrect results • Example Example – (a / b)0 + c Saman Amarasinghe 68 6.035 ©MIT Fall 1998 Effects on the Numerical Stability y • Some alg gebraic simp plifications mayy pp roduce incorrect results • Example Example – (a / b)0 + c – we we can can simplify simplify this this to to c c Saman Amarasinghe 69 6.035 ©MIT Fall 1998 Effects on the Numerical Stability y •Some alg gebraic simp plifications mayy pp roduce incorrect results • Example Example – (a / b)0 + c – we we can can simplify simplify this this to to c c – But what about when b = 0 should should be be a a exception, exception, but but we we’ll ll get get a a result result Saman Amarasinghe 70 6.035 ©MIT Fall 1998 Outline • Introduction Introduction • Basic Blocks • Common Subexpression Elimination • CC opy PP ropagatiti on •Dead ead C Code ode Eliminat atio on • Algebraic Simplification • Summary Interesting g Prop p erties • Analysis and Transformation Algorithms S Symb boli li call lly Si Si mullat te E E xecuti ti on of f P Pro gram – CSE and Copy Propagation go forward – Dead Dead Code Code Elimination Elimination goes goes backwards backwards • Transformations stacked – Group of basic transformations work together – Often, one transformation creates inefficient code that is is cleaned cleaned u up p b by y f following ollowing transformations transformations – Transformations can be useful even if original code may not benefit from transformation Saman Amarasinghe 72 6.035 ©MIT Fall 1998 Other Basic Block Transformations •Constant Propg pagation • Strength Reduction – a2 a2 = = a4 a4; ; a+a+a a+a+a = = 3a 3a;; • Do these in unified transformation framework framework , not not in in earlier earlier or or later later phases phases Saman Amarasinghe 73 6.035 ©MIT Fall 1998 Summary y • Basic block analyses and transformations • S Symb boli licall lly siimullat te executi tion of f program – Forward (CSE, copy prop, constant prop) – Backward (Dead code elimination) • Stacked groups of analyses and transformations that work together – CSE introduces excess temp poraries and copypy statements – Copy propagation often eliminates need to keep temporary variables around – Dead code elimination removes useless code • Similar in spirit to many analyses and transformations that operate across basic blocks Saman Amarasinghe 74 6.035 ©MIT Fall 1998 MIT OpenCourseWare http://ocw.mit.edu 6.035 Computer Language Engineering Spring 2010 For information about citing these materials or our Terms of Use, visit: http://ocw.mit.edu/terms.
Website URL
Comment