Implementing Control Flow Constructs Comp 412

Similar documents
Computing Inside The Parser Syntax-Directed Translation, II. Comp 412 COMP 412 FALL Chapter 4 in EaC2e. source code. IR IR target.

Runtime Support for Algol-Like Languages Comp 412

Compiler Design. Code Shaping. Hwansoo Han

Handling Assignment Comp 412

(just another operator) Ambiguous scalars or aggregates go into memory

Instruction Selection: Preliminaries. Comp 412

Intermediate Representations

Generating Code for Assignment Statements back to work. Comp 412 COMP 412 FALL Chapters 4, 6 & 7 in EaC2e. source code. IR IR target.

Code Shape Comp 412 COMP 412 FALL Chapters 4, 5, 6 & 7 in EaC2e. source code. IR IR target. code. Front End Optimizer Back End

Computing Inside The Parser Syntax-Directed Translation, II. Comp 412

Building a Parser Part III

Lab 3, Tutorial 1 Comp 412

Intermediate Representations

Compiling Techniques

Local Register Allocation (critical content for Lab 2) Comp 412

Parsing II Top-down parsing. Comp 412

CS 406/534 Compiler Construction Instruction Scheduling beyond Basic Block and Code Generation

Syntax Analysis, V Bottom-up Parsing & The Magic of Handles Comp 412

Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice University have explicit

CS415 Compilers. Intermediate Represeation & Code Generation

Computing Inside The Parser Syntax-Directed Translation. Comp 412 COMP 412 FALL Chapter 4 in EaC2e. source code. IR IR target.

Code Shape II Expressions & Assignment

The Software Stack: From Assembly Language to Machine Code

Instruction Selection: Peephole Matching. Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved.

Naming in OOLs and Storage Layout Comp 412

Procedure and Function Calls, Part II. Comp 412 COMP 412 FALL Chapter 6 in EaC2e. target code. source code Front End Optimizer Back End

Intermediate Code Generation (ICG)

Alternatives for semantic processing

Parsing. Note by Baris Aktemur: Our slides are adapted from Cooper and Torczon s slides that they prepared for COMP 412 at Rice.

Computing Inside The Parser Syntax-Directed Translation. Comp 412

CS 432 Fall Mike Lam, Professor. Code Generation

Instruction Scheduling Beyond Basic Blocks Extended Basic Blocks, Superblock Cloning, & Traces, with a quick introduction to Dominators.

Combining Optimizations: Sparse Conditional Constant Propagation

Syntax Analysis, VI Examples from LR Parsing. Comp 412

Optimizer. Defining and preserving the meaning of the program

Lecture 12: Compiler Backend

Parsing III. CS434 Lecture 8 Spring 2005 Department of Computer Science University of Alabama Joel Jones

The ILOC Simulator User Documentation

Local Optimization: Value Numbering The Desert Island Optimization. Comp 412 COMP 412 FALL Chapter 8 in EaC2e. target code

The ILOC Simulator User Documentation

CS 406/534 Compiler Construction Intermediate Representation and Procedure Abstraction

The ILOC Simulator User Documentation

The structure of a compiler

Instruction Selection, II Tree-pattern matching

CS 406/534 Compiler Construction Putting It All Together

Syntax Analysis, III Comp 412

CSE P 501 Compilers. Intermediate Representations Hal Perkins Spring UW CSE P 501 Spring 2018 G-1

opt. front end produce an intermediate representation optimizer transforms the code in IR form into an back end transforms the code in IR form into

Just-In-Time Compilers & Runtime Optimizers

Intermediate Representations

Syntax Analysis, III Comp 412

The ILOC Virtual Machine (Lab 1 Background Material) Comp 412

Syntax Analysis, VII One more LR(1) example, plus some more stuff. Comp 412 COMP 412 FALL Chapter 3 in EaC2e. target code.

Arrays and Functions

Code Shape Comp 412 COMP 412 FALL Chapters 4, 5, 6 & 7 in EaC2e. source code. IR IR target. code. Front End Optimizer Back End

CS415 Compilers. Procedure Abstractions. These slides are based on slides copyrighted by Keith Cooper, Ken Kennedy & Linda Torczon at Rice University

Register Allocation. Note by Baris Aktemur: Our slides are adapted from Cooper and Torczon s slides that they prepared for COMP 412 at Rice.

CSE 401/M501 Compilers

Acknowledgement. CS Compiler Design. Intermediate representations. Intermediate representations. Semantic Analysis - IR Generation

CS 406/534 Compiler Construction Instruction Scheduling

Introduction to Parsing. Comp 412

Compilers. Intermediate representations and code generation. Yannis Smaragdakis, U. Athens (original slides by Sam

Parsing II Top-down parsing. Comp 412

Other conditional and loop constructs. Fundamentals of Computer Science Keith Vertanen

Runtime Support for OOLs Object Records, Code Vectors, Inheritance Comp 412

CS5363 Final Review. cs5363 1

Lecture Notes on Intermediate Representation

COMP 181. Prelude. Intermediate representations. Today. High-level IR. Types of IRs. Intermediate representations and code generation

Introduction to Optimization, Instruction Selection and Scheduling, and Register Allocation

Intermediate Representations & Symbol Tables

Instruction Scheduling

The Processor Memory Hierarchy

Introduction to Optimization Local Value Numbering

Instruction Selection and Scheduling

Languages and Compiler Design II IR Code Generation I

Intermediate Code Generation

Loop Invariant Code Mo0on

Operator Strength Reduc1on

CS415 Compilers Register Allocation. These slides are based on slides copyrighted by Keith Cooper, Ken Kennedy & Linda Torczon at Rice University

Intermediate Representations Part II

Short Notes of CS201

CS415 Compilers. Lexical Analysis

CS201 - Introduction to Programming Glossary By

Principle of Complier Design Prof. Y. N. Srikant Department of Computer Science and Automation Indian Institute of Science, Bangalore

CS /534 Compiler Construction University of Massachusetts Lowell. NOTHING: A Language for Practice Implementation

CS 61c: Great Ideas in Computer Architecture

Topic 7: Intermediate Representations

IR Generation. May 13, Monday, May 13, 13

CS415 Compilers. Syntax Analysis. These slides are based on slides copyrighted by Keith Cooper, Ken Kennedy & Linda Torczon at Rice University

MIPS Datapath. MIPS Registers (and the conventions associated with them) MIPS Instruction Types

Computer Science and Engineering 331. Midterm Examination #1. Fall Name: Solutions S.S.#:

Intermediate Representations

Comp 204: Computer Systems and Their Implementation. Lecture 22: Code Generation and Optimisation

Topic Notes: MIPS Instruction Set Architecture

Lexical Analysis - An Introduction. Lecture 4 Spring 2005 Department of Computer Science University of Alabama Joel Jones

COMP 181 Compilers. Administrative. Last time. Prelude. Compilation strategy. Translation strategy. Lecture 2 Overview

Rui Wang, Assistant professor Dept. of Information and Communication Tongji University.

Data Structures and Algorithms in Compiler Optimization. Comp314 Lecture Dave Peixotto

DEMO A Language for Practice Implementation Comp 506, Spring 2018

CSCI312 Principles of Programming Languages

Transcription:

COMP 412 FALL 2018 Implementing Control Flow Constructs Comp 412 source code IR Front End Optimizer Back End IR target code Copyright 2018, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice University have explicit permission to make copies of these materials for their personal use. Faculty from other educational institutions may use these materials for nonprofit educational purposes, provided this copyright notice is preserved. Chapter 7 in EaC2e

Lab 3 Schedule Sunday Monday Tuesday Wednesday Thursday Friday Saturday Oct 21 22 23 24 25 26 You are here Docs Available Lab Lecture Start work 27 28 29 30 31 1 2 3 Complete & Correct Dependence Graph 4 5 6 7 8 9 10 Correct Schedule 11 12 13 14 15 16 17 The goal is here Improve Schedules 18 19 20 Lab 3 Due Date 21 22 23 24 No Class (Walk) Thanksgiving Break Late day Not a late day Not a late day Not a late day COMP 412, Fall 2018 1

Review What is Left in Translation? We have talked about the mechanism of translation. Next, we need to focus on the content, or product, of translation. Expressions More operators in expressions Boolean expressions, relational expressions, string operations Type-related issues in expressions Mixed-type operations and value conversions. Assignment (including addressability) Control Flow Code shape and SDT strategies Done, except strings Today Procedure and Function Calls Functionality: what, precisely, does a procedure call do? Implementation: how does the compiler emit code to do that? COMP 412, Fall 2018 2

Review Boolean & Relational Expressions This grammar allows w < x < y < z First, we need to add Boolean & relational expressions to the grammar Boolean Boolean AndTerm AndTerm AndTerm AndTerm RelExpr RelExpr RelExpr RelExpr < Expr RelExpr Expr RelExpr = Expr RelExpr Expr RelExpr Expr RelExpr > Expr Expr Expr Expr + Term Expr - Term Term Term Term Value Term Value Value Value! Factor Factor Factor ( Expr ) number Reference where Reference derives a name, a subscripted name, a COMP 412, Fall 2018 structure reference, a string reference, a function call, 3

Control-flow Constructs and Portability Computer Scientists (naturally) want to isolate as much of the compiler as possible from the ISA. Enhances portability (conceptually) Leads to a better story source code Front End IR IR target Optimizer Back End code No ISA dependence Depend only on the IR No source dependence Implementationof control-flowis one place where reality intrudes From representation to comparison to branching, ISA matters Optimization cannot easily fix bad control-flow code-shape decisions COMP 412, Fall 2017 4

Boolean Values The compiler needs to represent the values TRUE and FALSE Numerical representation Assign values to TRUE and FALSE Common choices are 1 / 0, -1 / 0, or non-zero / 0 Not a lot of difference between the choices Use hardware AND, OR, and NOT operations Make a choice and use it uniformly (design time) Implementation of Boolean values and relational comparisons depends heavily on features of the ISA. COMP 412, Fall 2018 5

Relational Values Different instruction sets (ISAs) provide different kinds of support Comparison Produces Boolean condition code ISA Impact multiple compare ops multiple branch ops Relational Values Impact on Code Shape complexity into expressions complexity into branches Branch consumes what compare produces Fundamental design issue: operations intended to work together Most ISAs settle on a single model Implementation of Boolean values and relational comparisons depends heavily on features of the ISA. COMP 412, Fall 2018 6

Boolean & Relational Values Boolean-valued comparisons Code can use the result of a relational comparison directly Presume that Boolean ops (e.g., AND, OR, NOT) work on result Leads to straightforward translation Examples r 1 contains a Boolean value x < y becomes cmp_lt r x,r y Þ r 1 if (x < y) then stmt 1 else stmt 2 becomes cmp_lt cbr r x,r y r 1 Þ r 1 L _stmt 1,L_stmt 2 COMP 412, Fall 2018 7

Boolean & Relational Values When compare produces a condition code Must use a branch to interpret result of compare Necessitates branches in the evaluation Example CC typically has bits to represent < = > and, plus, maybe = 0 and 0 x < y becomes cmp r x,r y CC 1 cbr_lt CC 1 L T,L F L T : loadi TRUE r 2 br L E L F : loadi FALSE r 2 L E : br L E other statements If cmp sets a condition-code register, rather than returning a Boolean value, the implementation of x < y becomes much more complex. COMP 412, Fall 2018 8

Boolean & Relational Values When compare produces a condition code Must use a branch to interpret result of compare Necessitates branches in the evaluation Example if (x < y) cmp r x,r y CC 1 then stmt 1 becomes cbr_lt CC 1 L T,L F else stmt 2 L T : stmt 1 br L E L F : stmt 2 L E : br L E other statements If the sole use of the relational expression s value is to control an if-thenelse construct, then we can fold the statements into the evaluation. COMP 412, Fall 2018 9 Condition-code specific optimization

Boolean & Relational Values When compare produces a condition code Must use a branch to interpret result of compare Necessitates branches in the evaluation Example if (x < y) This code represents the result of the comparison implicitly, in the PC cmp r x,r y CC 1 then stmt 1 becomes cbr_lt CC 1 L T,L F else stmt 2 L T : stmt 1 br L E Here, x < y is true This idea works on most ISAs and in many circumstances L F : stmt 2 L E : br L E other statements Here, it is false If the sole use of the relational expression s value is to control an if-thenelse construct, then we can fold the statements into the evaluation. COMP 412, Fall 2018 10

Other Ops That Interpret A Comparison ISAs sometimes include other ops that can interpret a comparison Conditional Move Operation Chooses its argument based on result of the comparison Can envision either a Boolean or a CC-based version Avoids a disruptive branch Predicated Instructions Allows a Boolean value to control execution of a single operation Typically, controls whether result is assigned or discarded Avoids a disruptive branch Branch on a compare may be hard to predict COMP 412, Fall 2018 11

Implementing IF-THEN-ELSE Example if (x < y) then a c + d else a e + f Both avoid branches and lead to shorter code. Note, however, that the path lengths through the code are about the same. Bottom line: your mileage may vary. The best implementation depends on specific details of the ISA. Conditional Move Predicated Execution comp r x,r y Þ CC 1 cmp_lt r x,r y Þ r 1 add r c,r d Þ r 1 (r 1 ) add r c,r d Þ r a add r e,r f Þ r 2 (!r 1 ) add r e,r f Þ r a i2i_lt CC 1,r 1,r 2 Þ r a Encodes x < y in CC 1, but never creates a Boolean value Creates an Boolean value for x < y COMP 412, Fall 2018 12

Generating a branching IF-THEN-ELSE with SDT To generate branching code with SDT, need to create & track the labels (1) (2) (3) (4) Stmt if Expr then WithElse else WithElse 1. Create labels for then part, else part, and exit Generate three labels and push them onto the stack Need a structure to hold 3 labels 2. Emit branch to appropriate part (then or else) after Expr Emit the branch followed by the label for then part (labelled nop) 3. At end of WithElse, emit branch to the exit Emit a jump to the exit label followed by the label for the else part (labelled nop) 4. At end of second WithElse, emit branch to the exit Emit a jump to the exit label followed by the label for the exit statement COMP 412, Fall 2018 13

Generating a predicated IF-THEN-ELSE with SDT The predicated code is easier to generate with SDT 1. Evaluate the controlling Expr into a register Processor may use one or more dedicated predicate registers May require both the predicate and its logical complement 2. Generate a dense stream of ops for the then clause Predicate each instruction with the Expr s value 3. Generate a dense stream of ops for the else clause Predicate each instruction with the logical complement of the Expr s value 4. Count on the instruction scheduler to interleave them. Requires the scheduler to understand the anti-dependences created by the use of a predicate and its logical complement Adds complication to the scheduler, but it comes from predication, not from this particular code-generation scheme Your performance may vary. COMP 412, Fall 2018 14

Control Flow Loops Compiler should follow a uniform template Evaluate condition before loop (if needed) Evaluate condition after loop Branch back to the top (if needed) Merges test with last block of loop body Pre-test Loop body Post-test while, for, do, & until all fit this basic model Next block General Schema for Loops COMP 412, Fall 2018 15

Generating a FOR Loop A typical for loop might be specified as follows: Stmt FOR NAME = Expr 1 TO Expr 2 BY Expr 3 { Stmts } With the usual meaning NAME is an index variable that starts with Expr 1 and runs to Expr 2 by increments of Expr 3 The rules for the individual statements in Stmts will emit code for the loop body The rule for the loop must emit code for the control structure initialization test loop body while, until, repeatuntil, & repeatwhile all fit the same basic template COMP 412, Fall 2018 16

Generating a FOR Loop How should the code look? Two obvious choices for i = 1 to 100 by 1 { } i 1 loop: if (i > 100) goto end loop body i i + 1 goto loop end: next statement... Single copy of test i 1 if (i > 100) goto end loop: loop body i i + 1 if (i < 101) goto loop end: next statement... Two copies of test One copy version may be easier to generate Can generate initialization & test before body, increment and jump after Two copy version may optimize better Single block loop body will incoporate increment and test in one block Converting one to the other is more complex than you might think. COMP See Dave 412, Whalley s Fall 2018 paper in 1991 PLDI. 17

Generating a FOR Loop with SDT Generating the single test version of the loop (1) (2) Stmt FOR NAME = Expr 1 TO Expr 2 BY Expr 3 { Stmts } (1) Use bison s mid-production action to insert code after Expr 2 Initialize NAME to Expr 1 Let SDT generate code to evaluate Expr 1 into a register Test NAME against Expr 2 Let SDT generate code to evaluate Expr 2 into a register Compare against NAME and branch accordingly Emit a label before the loop body (2) On the reduction, emit the end-of-loop code Increment NAME by Expr 3 Let SDT generate code to evaluate Expr 2 into a register Jump to loop initialization test loop body increment COMP 412, Fall 2018 18

Generating a FOR Loop with SDT Generating the two test version of the loop (1) (2) Stmt FOR NAME = Expr 1 TO Expr 2 BY Expr 3 { Stmts } (1) Use bison s mid-production action to insert code after Expr 2 Initialize NAME to Expr 1 Let SDT generate code to evaluate Expr 1 into a register Test NAME against Expr 2 Let SDT generate code to evaluate Expr 2 into a register Compare against NAME and branch accordingly Emit a label before the loop body (2) On the reduction, emit the end-of-loop code Increment NAME by Expr 3 Let SDT generate code to evaluate Expr 2 into a register Generate the other test and branch This process involves evaluating some of the Expr s multiple times initialization COMP 412, Fall 2018 19 test loop body Increment test

Generating a FOR Loop with SDT Generating the two test version of the loop (1) (2) Stmt FOR NAME = Expr 1 TO Expr 2 BY Expr 3 { Stmts } (1) Use bison s mid-production action to insert code after Expr 2 Initialize NAME to Expr 1 Let SDT generate code to evaluate Expr 1 into a register Test NAME against Expr 2 Let SDT generate code to evaluate Expr 2 into a register Compare against NAME and branch accordingly Emit a label before the loop body (2) On the reduction, emit the end-of-loop code Increment NAME by Expr 3 Let SDT generate code to evaluate Expr 2 into a register Generate the other test and branch This process involves evaluating some of the Expr s multiple times In general, the compiler needs a data structure initialization to hold the information for the loop. test One way to handle the second test is to include a buffer of loop code body in that loop structure. Increment The compiler generates test the test into the buffer, then copies it into each place where it is needed. COMP 412, Fall 2018 20

Code For a Two-Test FOR Loop for (i = 1; i< 100; i++) { loop body } next statement loadi 1 Þ r 1 loadi 1 Þ r 2 The two-test template produces a code shape for loops that works well for optimization. ([271] in EaC2e) Initialization L 1 : L 2 : loadi 100 Þ r 3 cmp_ge r 1,r 3 Þ r 4 cbr r 4 L 2,L 1 loop body add r 1,r 2 Þ r 1 cmp_lt r 1,r 3 Þ r 5 cbr r 5 L 1,L 2 next statement Pre-test Post-test Text shows examples of other kinds of COMP 412, Fall 2018 loops translated into the basic template. 21

Control Flow Loops Compiler should follow a uniform template Evaluate condition before loop (if needed) Evaluate condition after loop Branch back to the top (if needed) Merges test with last block of loop body Pre-test Loop body Other loops follow the same basic pattern While loops have test on entry (two-test loop) Until loops have no test on entry (single test at bottom) Optimize the translation for the case of the single-block loop Post-test Next block General Schema for Loops COMP 412, Fall 2018 22

Break statements Many programming languages include a break statement Exits from the innermost control-flow statement Out of the innermost loop Out of a case statement Pre-test Break translates into a jump Targets statement outside the control-flow construct Creates a multiple-exit construct Skip in a loop goes to next iteration break in B1 Loop head B1 B2 Post-test skip in B2 break only makes sense if loop has > 1 block skipor continue becomes branch to post-test block Next block COMP 412, Fall 2018 23

Control Flow Case Statements 1 Evaluate the controlling expression 2 Branch to the selected case 3 Execute the code for that case 4 Branch to the statement after the case Parts 1, 3, & 4 are well understood, part 2 is the key COMP 412, Fall 2018 Example from 1 st Code Shape lecture 24

Control Flow Case Statements 1 Evaluate the controlling expression 2 Branch to the selected case 3 Execute the code for that case 4 Branch to the statement after the case (use break) Parts 1, 3, & 4 are well understood, part 2 is the key Strategies Linear search (nested if-then-else constructs) Build a table of case expressions & binary search it Directly compute an address (requires dense case set) COMP Case statements 412, Fall 2018 are a place where attention to code shape pays off. 25

Case Statement Implementation Using Linear Search switch( expr ) { case 0: block 0 ; break; case 17: block 17 ; break; case 23: block 23 ; break; default: block d ; break; } Case Statement Temp expr ; If (temp == 0) then block 0 ; else if (temp == 17) then block 17 ; else if (temp == 23) then block 23 ; else block d ; Implementation Cost of execution depends on frequency of values for expr Clear benefit to reordering cases COMP 412, Fall 2018 26

Case Statement Implementation Using Binary Search switch( expr ) { case 0: block 0 ; break; case 17: block 17 ; break; case 99: block 99 ; break; default: block d ; break; } Case Statement Value Label 0 LB 0 17 LB 17 99 LB 99 Search Table temp expr ; down 0 up n while (down + 1 < up) { middle (up + down) / 2; if (Table.value[middle] temp) then down middle; else up middle; } if (Table.value[down] == temp) then jump to Table.label[down]; else jump to label for default; Implementation Cost of execution depends on log 2 of number of cases Separate label for default case COMP 412, Fall 2018 27

Case Statement Implementation Using a Jump Table switch( expr ) { case 0: block 0 ; break; case 1: block 1 ; break; case 2: block 2 ; break; case 9: block 9 ; break; default: block d ; break; } Case Statement @LT: LB 0 LB 1 LB 2 LB 9 Label Table temp expr ; If (0 temp 9) then { addr @LT + temp * 4 target Mem[addr] jump to target } else jump to LB d Implementation Cost is O(1) Can optimize code further If expr is one byte, use a full table and avoid the if-then-else COMP 412, Fall 2018 28

Case Statement Implementation Using a Jump Table temp expr ; temp expr * 4 Use lshift rather than mult If (0 temp 9) then { addr @LT + temp * 4 target Mem[addr] jump to target } else jump to LB d Original Code if (0 temp 36) then{ Fold the constants offset @LT + temp Use an addi addr Mem[ARP + offset] Use a loadai jump to addr Simple jump } else jump to LB d Simple jump Mapping into low-level operations (e.g., ILOC) We need the label, @LT, in a register If case statement is in a loop, load @LT before the loop (LICM) Could put @LT in the AR, but that requires initializations Code maps cleanly into a few operations (say 3?) COMP 412, Fall 2018 29

Generating a CASE Statement With SDT The grammar for a case statement might resemble: CaseStmt SWITCH ( Expr ) INTO { CaseList } ; CaseList Caselist OneCase OneCase OneCase CASE LABEL : Stmt ; BREAK ; The difficulty is deciding how to implement the switch Need to see the cases before making the decision The reductions occur in the wrong order To generate a good case statement with SDT, need to inspect the whole construct Build a throw-away data structure to hold necessary information COMP 412, Fall 2018 30

Generating a CASE Statement With SDT CaseStmt SWITCH ( Expr ) INTO { CaseList } ; CaseList Caselist OneCase 1. At (1), create and preserve an EVAL label and an EXIT label, then emit a jump to the EVAL label 2. In each OneCase, create a code label, preserve it in a list of <case label, code label > pairs, emit the code label, and generate the Stmt 3. After Stmt, emit a jump to the EXIT label 4. At (2), analyze the list of labels, choose an evaluation strategy, emit the EVAL label, then emit the code to evaluate the Expr and jump to the selected case label 5. Emit the EXIT label OneCase 1 2 OneCase CASE LABEL : Stmt ; BREAK ; COMP 412, Fall 2018 31

Generating a CASE Statement With SDT The resulting code has the following shape: The spurious jump jump EVAL Step (1) CL 1 : code for first case Step (2) jump EXIT Step (3) CL 2 : code for second case Step (2) jump EXIT Step (3) CL n : code for second case Step (2) jump EXIT Step (3) EVAL: code to evaluate Expr to a label CL i and jump to CL i Step (4) EXIT: nop Step (5) While building the case list While walking the case list It is trivial for the optimizer to straighten out this confused control flow. COMP See, 412, for Fall example, 2018 the CLEAN algorithm in 10.2.2 of EaC2e. 32

Implementing the Switch (Step 4) When Step (4) executes in SDT, all the information is available Compiler has a list of the case labels and their code labels Compiler has access to the result of evaluating Expr Step (4) happens on reduction by CaseStmt production (at vertical line 2) Compiler can implement any of the three schemes for switch Choosing the method Compiler can walk the list and do some analysis Look at number of labels & density of labels Choose among if-then-else, binary search, or a jump table COMP 412, Fall 2018 33

Implementing the Switch (Step 4) When Step (4) executes in SDT, all the information is available Compiler has a list of the case labels and their code labels Compiler has access to the result of evaluating Expr Step (4) happens on reduction by CaseStmt production (at vertical line 2) Compiler can implement any of the three schemes for switch Using an if-then-else structure Compiler walks the list of <case label, code label> pairs For each pair, generate a test on Expr = case label, with branch to code label Use the taken case for the code label & the fall through for the next case Reduces average penalty Handles default as the last else clause Creates the expected code An extra transfer of control per case, beyond other two methods COMP 412, Fall 2018 34

Implementing the Switch (Step 4) When Step (4) executes in SDT, all the information is available Compiler has a list of the case labels and their code labels Compiler has access to the result of evaluating Expr Step (4) happens on reduction by CaseStmt production (at vertical line 2) Compiler can implement any of the three schemes for switch Using a binary search Compiler walks the list of <case label, code label> pairs Generates a sorted table of the pairs, which it statically initializes Assembler directive Inserts either canned inline code or a call to library routine Followed by a jump to the matching code label One extra transfer of control per case as price of SDT COMP 412, Fall 2018 35

Implementing the Switch (Step 4) When Step (4) executes in SDT, all the information is available Compiler has a list of the case labels and their code labels Compiler has access to the result of evaluating Expr Step (4) happens on reduction by CaseStmt production (at vertical line 2) Compiler can implement any of the three schemes for switch Using a jump table Compiler walks the list of <case label, code label> pairs Generates an ordered table of code labels Inserts index on Expr into the table, followed by jump One extra transfer of control per case as price of SDT COMP 412, Fall 2018 36

Generating a CASE Statement With SDT The Bottom Line With some careful planning, you can generate good code for a case statement using SDT The resulting code will have extraneous jump operations A Optimization can eliminate them (branch straightening) The code for the if-then-else implementation is B particularly ugly A B The alternative Compiler could use SDT to build a small AST Compiler could walk the AST multiple times to analyze, and then generate the right code for the case statement COMP 412, Fall 2018 37

Code Shape The material on Boolean values and relational comparisons is drawn from 7.4 in EaC2e. The text presents the material in much greater depth, with more examples. You should read that section, along with the rest of Chapter 7. Lecture will not cover all of the material in Chapter 7, but you are responsible for it on the final exam. STOP COMP 412, Fall 2018 38

Boolean Values The compiler needs to represent the values TRUE and FALSE Numerical representation Assign values to TRUE and FALSE Common choices are Use hardware AND, OR, and NOT operations Use comparison to get a Boolean from a relational expression (design time) Different instruction sets(isa) provide different kinds of support Comparison returns Boolean & branch uses Boolean Comparison sets a condition code & branch reads a condition code Comparison returns Boolean & operations are predicated ISA provides conditional move operation (comparison + predicate?) Implementation of Boolean values and relational comparisons depends heavily on features of the ISA. COMP 412, Fall 2018 39

Implementing IF-THEN-ELSE Example if (x < y) then a c + d else a e + f No significant difference in the quality of the code same basic set of operations Condition Codes Boolean Comparisons comp r x,r y Þ CC 1 cmp_lt r x,r y Þ r 1 cbr_lt CC 1 L 1,L 2 cbr L 1,L 2 L 1 : add r c,r d Þ r a L 1 : add r c,r d Þ r a br L OUT br L OUT L 2 : add r e,r f Þ r a L 2 : add r e,r f Þ r a br L OUT br L OUT L OUT : nop L OUT : nop Encodes x < y in CC 1, but never creates a Boolean value Creates an Boolean value for x < y COMP 412, Fall 2018 40

IF-THEN-ELSE Statements Predication creates an alternative strategy Evaluate the conditional and predicate the then & else blocks Depending on (1) the number & distribution of ops under L1 and L2, and (2) the branch latency, one strategy or the other will be better if Expr Unit 1 Unit 2 Unit 1 Unit 2 then Stmt 1 compare & branch compare r1 else Stmt 2 L1: op1 op2 (r1) op1 op2 jump to L3 (!r1) op3 op4 L2: op3 op4 L3: nop jump to L3 L3: nop Assume two functional units COMP 412, Fall 2018 41

IF-THEN-ELSE Statements if Expr then Stmt 1 else Stmt 2 Unit 1 Unit 2 compare & branch L1: op1 op2 jump to l3 L2: op3 op4 jump to l3 L3: nop Unit 1 Unit 2 compare r1 (r1) op1 op2 (!r1) op3 op4 L3: nop The tradeoffs Using control-flow makes better use of the functional units (issued ops are used) Using control-flow takes a potential hit on the branch & jump latency Using predication avoids the branch latency Using predication leads to operations that are issued but not used Your mileage will vary Best choice depends on number & balance between ops in thenand else parts At some point, there are enough ops to cover the branch & jump latencies COMP 412, Fall 2018 42