Code Shape, Part II Addressing Arrays, Aggregates, & Strings Comp 412 Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled.

Slides:



Advertisements
Similar presentations
Pointers.
Advertisements

Instruction Set Design
Intermediate Code Generation
Programming Languages and Paradigms
Names and Bindings.
The Assembly Language Level
The Last Lecture Copyright 2011, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in Comp 512 at Rice University have explicit permission.
Chapter 5: Elementary Data Types Properties of types and objects –Data objects, variables and constants –Data types –Declarations –Type checking –Assignment.
Fall 2011SYSC 5704: Elements of Computer Systems 1 SYSC 5704 Elements of Computer Systems Optimization to take advantage of hardware.
Chapter 6 Structured Data Types Arrays Records. Copyright © 2007 Addison-Wesley. All rights reserved. 1–2 Definitions data type –collection of data objects.
Introduction to Code Optimization Comp 412 Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice.
Chapter 10.
CS 330 Programming Languages 10 / 16 / 2008 Instructor: Michael Eckmann.
Code Shape IV Procedure Calls & Dispatch Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412.
Intermediate Representations Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice University.
Code Shape III Booleans, Relationals, & Control flow Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled.
Code Shape II Expressions & Arrays Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved.
CS 536 Spring Intermediate Code. Local Optimizations. Lecture 22.
The Procedure Abstraction Part III: Allocating Storage & Establishing Addressability Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all.
4/23/09Prof. Hilfinger CS 164 Lecture 261 IL for Arrays & Local Optimizations Lecture 26 (Adapted from notes by R. Bodik and G. Necula)
ISBN Chapter 6 Data Types: Structured types.
The Procedure Abstraction Part I: Basics Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412.
Context-sensitive Analysis, II Ad-hoc syntax-directed translation, Symbol Tables, andTypes.
Intermediate Code. Local Optimizations
Wrapping Up Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved.
Chapter 6 Structured Data Types Arrays Records. Copyright © 2007 Addison-Wesley. All rights reserved. 1–2 Definitions data type –collection of data objects.
5.3 Machine-Independent Compiler Features
Chapter 7: Runtime Environment –Run time memory organization. We need to use memory to store: –code –static data (global variables) –dynamic data objects.
The Procedure Abstraction Part I: Basics Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412.
Names Variables Type Checking Strong Typing Type Compatibility 1.
Prof. Yousef B. Mahdy , Assuit University, Egypt File Organization Prof. Yousef B. Mahdy Chapter -4 Data Management in Files.
Compiler Construction
The Procedure Abstraction, Part VI: Inheritance in OOLs Comp 412 Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled.
The Procedure Abstraction, Part V: Support for OOLs Comp 412 Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in.
1 C - Memory Simple Types Arrays Pointers Pointer to Pointer Multi-dimensional Arrays Dynamic Memory Allocation.
Compiler Chapter# 5 Intermediate code generation.
1 Code optimization “Code optimization refers to the techniques used by the compiler to improve the execution efficiency of the generated object code”
Code Shape IV Procedure Calls & Dispatch Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412.
ISBN Chapter 6 Data Types Introduction Primitive Data Types User-Defined Ordinal Types.
Addressing Modes Chapter 6 S. Dandamudi To be used with S. Dandamudi, “Introduction to Assembly Language Programming,” Second Edition, Springer,
Introduction to Code Generation Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice.
The Procedure Abstraction, Part IV Addressability Comp 412 Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in Comp.
Chapter 7 Object Code Generation. Chapter 7 -- Object Code Generation2  Statements in 3AC are simple enough that it is usually no great problem to map.
Code Shape II Expressions & Assignment Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412.
Machine Independent Optimizations Topics Code motion Reduction in strength Common subexpression sharing.
Boolean & Relational Values Control-flow Constructs Comp 412 Copyright 2010, Keith D. Cooper & Linda Torczon, all rights reserved. Students enrolled in.
ICOM 4035 – Data Structures Dr. Manuel Rodríguez Martínez Electrical and Computer Engineering Department Lecture 2 – August 23, 2001.
Assembly - Arrays תרגול 7 מערכים.
The Procedure Abstraction Part III: Symbol Tables, Storage Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students.
1 ENERGY 211 / CME 211 Lecture 4 September 29, 2008.
CSI 3125, Data Types, page 1 Data types Outline Primitive data types Structured data types Strings Enumerated types Arrays Records Pointers Reading assignment.
©SoftMoore ConsultingSlide 1 Code Optimization. ©SoftMoore ConsultingSlide 2 Code Optimization Code generation techniques and transformations that result.
Data Types In Text: Chapter 6.
Introduction to Optimization
Type Checking Generalizes the concept of operands and operators to include subprograms and assignments Type checking is the activity of ensuring that the.
Optimization Code Optimization ©SoftMoore Consulting.
The Procedure Abstraction Part IV: Allocating Storage & Establishing Addressability Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights.
Introduction to Optimization
Intermediate Representations
Introduction to Code Generation
Wrapping Up Copyright 2003, Keith D. Cooper, Ken Kennedy & Linda Torczon, all rights reserved. Students enrolled in Comp 412 at Rice University have explicit.
Code Shape III Booleans, Relationals, & Control flow
Intermediate Representations
Code Shape IV Procedure Calls & Dispatch
Code Shape II Expressions & Assignment
Introduction to Optimization
Optimization 薛智文 (textbook ch# 9) 薛智文 96 Spring.
Course Overview PART I: overview material PART II: inside a compiler
Procedure Linkages Standard procedure linkage Procedure has
Presentation transcript:

Code Shape, Part II Addressing Arrays, Aggregates, & Strings Comp 412 Copyright 2010, 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. COMP 412 FALL 2010

Last Lecture Code Generation for Expressions Simple treewalk produces reasonable code —Execute most demanding subtree first —Generate function calls inline —Can implement treewalk explicitly, with an AG or ad hoc SDT … Handle assignment as an operator —Insert conversions according to language-specific rules —If compile-time checking is impossible, check tags at runtime —Talked about reference counting as alternative to GC Today Addressing arrays and aggregates Next Time: Booleans & Relationals Comp 412, Fall 20101

2 How does the compiler handle A [i,j] ? First, must agree on a storage scheme Row-major order (most languages) Lay out as a sequence of consecutive rows Rightmost subscript varies fastest A[1,1], A[1,2], A[1,3], A[2,1], A[2,2], A[2,3] Column-major order (Fortran) Lay out as a sequence of columns Leftmost subscript varies fastest A[1,1], A[2,1], A[1,2], A[2,2], A[1,3], A[2,3] Indirection vectors (Java) Vector of pointers to pointers to … to values Takes much more space, trades indirection for arithmetic Not amenable to analysis

Comp 412, Fall Laying Out Arrays The Concept Row-major order Column-major order Indirection vectors 1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 A 1,1 2,1 1,2 2,2 1,3 2,3 1,4 2,4 A 1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 A 1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 A These can have distinct & different cache behavior

Comp 412, Fall Computing an Array Address A[ i + ( i – low ) x sizeof(A[1]) In general: base(A) + ( i – low ) x sizeof(A[1]) Almost always a power of 2, known at compile-time  use a shift for speed Color Code: Invariant Varying Color Code: Invariant Varying Depending on how A is may be an offset from the ARP, an offset from some global label, or an arbitrary address. The first two are compile time constants. Depending on how A is may be an offset from the ARP, an offset from some global label, or an arbitrary address. The first two are compile time constants.

Comp 412, Fall Computing an Array Address A[ i + ( i – low ) x sizeof(A[1]) In general: base(A) + ( i – low ) x sizeof(A[1]) Almost always a power of 2, known at compile-time  use a shift for speed Almost always a power of 2, known at compile-time  use a shift for speed int A[1:10]  low is 1 Make low 0 for faster access (saves a – ) int A[1:10]  low is 1 Make low 0 for faster access (saves a – )

Comp 412, Fall Computing an Array Address A[ i + ( i – low ) x sizeof(A[1]) In general: base(A) + ( i – low ) x sizeof(A[1]) What about A[i 1,i 2 ] ? Row-major order, two + (( i 1 – low 1 ) x (high 2 – low 2 + 1) + i 2 – low 2 ) x sizeof(A[1]) Column-major order, two + (( i 2 – low 2 ) x (high 1 – low 1 + 1) + i 1 – low 1 ) x sizeof(A[1]) Indirection vectors, two dimensions *(A[i 1 ])[i 2 ] — where A[i 1 ] is, itself, a 1-d array reference This stuff looks expensive! Lots of implicit +, -, x ops This stuff looks expensive! Lots of implicit +, -, x ops + ( i 1 – low ) x sizeof(A[1])

Comp 412, Fall Optimizing Address Calculation for A [i,j] In row-major + (i–low 1 ) x (high 2 –low 2 +1) x w + (j – low 2 ) x w Which can be factored + i x (high 2 –low 2 +1) x w + j x w – (low 1 x (high 2 –low 2 +1) x w) - (low 2 x w) If low i, high i, and w are known, the last term is a constant 0 – (low 1 x (high 2 –low 2 +1) x w - low 2 x w And len 2 as (high 2 -low 2 +1) Then, the address expression 0 + (i x len 2 + j ) x w Compile-time constants where w = sizeof(A[1,1]) is 0 is a known constant.

Comp 412, Fall Array References What about arrays as actual parameters? Whole arrays, as call-by-reference parameters Need dimension information  build a dope vector Store the values in the calling sequence Pass the address of the dope vector in the parameter slot Generate complete address polynomial at each reference Some improvement is possible Save len i and low i rather than low i and high i Pre-compute the fixed terms in prologue sequence What about call-by-value? Most c-b-v languages pass arrays by reference This is a language design low 1 high 1 low 2 high 2

Comp 412, Fall Array References What about A[12] as an actual parameter? If corresponding parameter is a scalar, it’s easy Pass the address or value, as needed Must know about both formal & actual parameter Language definition must force this interpretation What is corresponding parameter is an array? Must know about both formal & actual parameter Meaning must be well-defined and understood Cross-procedural checking of conformability  Again, we’re treading on language design issues

Comp 412, Fall Array References What about variable-sized arrays? Local arrays dimensioned by actual parameters Same set of problems as parameter arrays Requires dope vectors (or equivalent) —dope vector at fixed offset in activation record  Different access costs for textually similar references This presents a lot of opportunity for a good optimizer Common subexpressions in the address polynomial Contents of dope vector are fixed during each activation Should be able to recover much of the lost ground  Handle them like parameter arrays

Array Address Calculations Array address calculations are a major source of overhead Scientific applications make extensive use of arrays and array-like structures —Computational linear algebra, both dense & sparse Non-scientific applications use arrays, too —Representations of other data structures  Hash tables, adjacency matrices, tables, structures, … Array calculations tend iterate over arrays Loops execute more often than code outside loops Array address calculations inside loops make a huge difference in efficiency of many compiled applications Reducing array address overhead has been a major focus of optimization since the 1950s. Comp 412, Fall

Comp 412, Fall Example: Array Address Calculations in a Loop DO J = 1, N A[I,J] = A[I,J] + B[I,J] END DO Naïve: Perform the address calculation twice DO J = 1, N R1 0 + (J x len 1 + I ) x sizeof(A[1,1]) R2 0 + (J x len 1 + I ) x sizeof(A[1,1]) MEM(R1) = MEM(R1) + MEM(R2) END DO A, B are declared as conformable floating-point arrays Code generated by a translator will almost certainly work this way. (treewalk code generator) Imagine a 5 point stencil: Code generated by a translator will almost certainly work this way. (treewalk code generator) Imagine a 5 point stencil: A[I,J] = 0.2 * (A[I-1,J] + A[I,J] + A[I+1,J] + A[I,J-1] + A[I,J+1] ) Inefficiency is an artifact of local translation

Comp 412, Fall Example: Array Address Calculations in a Loop DO J = 1, N A[I,J] = A[I,J] + B[I,J] END DO More sophisticated: Move common calculations out of loop R1 = I x sizeof(A[1,1]) c = len 1 x sizeof(A[1,1]) ! Compile-time constant R2 0 + R1 R3 0 + R1 DO J = 1, N a = J x c R4 = R2 + a R5 = R3 + a MEM(R4) = MEM(R4) + MEM(R5) END DO Loop-invariant code motion

Comp 412, Fall Example: Array Address Calculations in a Loop DO J = 1, N A[I,J] = A[I,J] + B[I,J] END DO Very sophisticated: Convert multiply to add R1 = I x sizeof(A[1,1]) c = len 1 x sizeof(A[1,1]) ! Compile-time constant R2 0 + R1 ; R3 0 + R1 DO J = 1, N R2 = R2 + c R3 = R3 + c MEM(R2) = MEM(R2) + MEM(R3) END DO Operator Strength Reduction (§ in EaC) J is now bookkeeping A good compiler would rewrite the end-of-loop test to operate on R2 or R3 (Linear function test replacement) J is now bookkeeping A good compiler would rewrite the end-of-loop test to operate on R2 or R3 (Linear function test replacement)

Structures and Records Structures and records have two complications Each declared structure has a set of fields Size and offset Compute base + offset for field Use size to choose load width and register width Structures and records can have dimensions Arrays of structures Fields that are arrays or arrays of structures Use array address calculation techniques, as needed Structures and records require compile-time support in the form of a table that maps field names to tuples. Comp 412, Fall

Comp 412, Fall Representing and Manipulating Strings Character strings differ from scalars, arrays, & structures Fundamental unit is a character —Typical sizes are one or two bytes —Target ISA may (or may not) support character-size operations Set of supported operations on strings is limited —Assignment, length, concatenation, translation (?) Efficient string operations are complex on most R ISC I SA s —Ties into representation, linkage convention, & source language § 7.6 in EaC Subword data

Comp 412, Fall Representing and Manipulating Strings Two common representations Explicit length field Null termination Language design issue —Fixed-length versus varying-length strings ( 1 or 2 length fields ) Length field may take more space than terminator String representation is a great case study in the way that one design decision (C, Unix) can have a long term impact on computing (security, buffer overflow)

Comp 412, Fall Representing and Manipulating Strings Each representation as advantages and disadvantages Unfortunately, null termination is almost considered normal Hangover from design of C Embedded in OS and API designs 1 Checked assignment requires both a current length for the string and an allocated length for the buffer.

Comp 412, Fall Manipulating Strings Single character assignment With character operations —Compute address of rhs, load character —Compute address of lhs, store character With only word operations ( >1 char per word ) —Compute address of word containing rhs & load it —Move character to destination position within word —Compute address of word containing lhs & load it —Mask out current character & mask in new character —Store lhs word back into place

Comp 412, Fall Manipulating Strings Multiple character assignment Two strategies 1.Wrap a loop around the single character code, or 2.Work up to a word-aligned case, repeat whole word moves, and handle any partial-word end case With character operations 1.Easy to generate; inefficient use of resources 2.Harder to generate; better use of resources With only word operations 1.Lots of complication to generate; inefficient at runtime, too 2.Fold complications into end case; reasonable efficiency Requires explicit code to check for buffer overflow (  length) Requires explicit code to check for buffer overflow (  length) Source & destination aligned differently  much harder cases for word operations

Comp 412, Fall Manipulating Strings Concatenation String concatenation is a length computation followed by a pair of whole-string assignments —Touches every character Exposes representation issues —Is string a descriptor that points to text? —Is string a buffer that holds the text? —Consider a  b || c  Compute b || c and assign descriptor to a?  Compute b || c into a temporary & copy it into a?  Compute b || c directly into a? What about a call to fee( b || c ) ?

Comp 412, Fall Manipulating Strings Length Computation Representation determines cost —Explicit length turns length(b) into a memory reference —Null termination turns length(b) into a loop of memory references and arithmetic operations Length computation arises in other contexts —Whole-string or substring assignment —Checked assignment (buffer overflow) —Concatenation —Evaluating call-by-value actual parameter or concatenation as an actual parameter And we didn’t consider a list of characters, …