----+++ Canonicalization Implement the [[IRCanonicalize]] component that transforms IntermediateRepresentation expressions into canonical form. The component can be found in directory =ir/= of the TigerTrans package. The component can be invoked using the =%.cir= target in the make-rules. ---+++ Lifting Functions During translation nested function declarations where left in place and translated to the =LET= construct. Since addition of [[static links]] to functions makes functions independent of their static position, their declarations can be lifted to top-level. Lifting can be done nicely using =collect-split=. See module =collect= in the [[Stratego.StrategoStandardLibrary][Stratego standard library]]. ---+++ Linearize Expressions Extend module [[IRCanonicalize]] with transformation rules for linearizing an IntermediateRepresentation expression and define a strategy to apply the linearization rules. The result of linearization is a flat list of statements. Beware for non-termination of =CALL= lifting. What is a good strategy? By first simplifying expressions using simple constant folding rules, better results can sometimes be obtained. Be aware that no side effects should be removed or reordered by simplification. ---+++ Basic Blocks Divide the list of statements of a =PROC= into a list of [[basic blocks]]. * Transform.BasicBlockPositioning ----+++ Traces Reorder the basic blocks into traces. Make sure that each conditional jump (=CJUMP=) is followed by its false label. If necessary rephrase the condition such that this is the case. ----+++ Call Space After canonicalization compute the call space, i.e., the maximum number of arguments of any function called (directly) within the body of a function. This number is needed to compute the size of the [[stack frame]]. The number should be stored in the =CALL= parameter of the =PROC= fragment of the function. (Use collect ----+++ Format Checker In order to check the result of canonicalization, define a Stratego.FormatChecker (using Stratego.RecursivePattern) that describes [[intermediate representation]] expressions in canonical form in module [[CIRFormat]].