Pointer Analysis Jeff Da Silva Sept 20, 2004 CARG.

Slides:



Advertisements
Similar presentations
Data-Flow Analysis II CS 671 March 13, CS 671 – Spring Data-Flow Analysis Gather conservative, approximate information about what a program.
Advertisements

Advanced Compiler Techniques LIU Xianhua School of EECS, Peking University Pointer Analysis.
Chapter 9 Code optimization Section 0 overview 1.Position of code optimizer 2.Purpose of code optimizer to get better efficiency –Run faster –Take less.
Context-Sensitive Interprocedural Points-to Analysis in the Presence of Function Pointers Presentation by Patrick Kaleem Justin.
Compilation 2011 Static Analysis Johnni Winther Michael I. Schwartzbach Aarhus University.
Pointer Analysis – Part I Mayur Naik Intel Research, Berkeley CS294 Lecture March 17, 2009.
Data-Flow Analysis Framework Domain – What kind of solution is the analysis looking for? Ex. Variables have not yet been defined – Algorithm assigns a.
School of EECS, Peking University “Advanced Compiler Techniques” (Fall 2011) Pointer Analysis.
Rational XL C/C++ Compiler Development © 2007 IBM Corporation Identifying Aliasing Violations in Source Code A Points-to Analysis Approach Ettore Tiotto,
Program Representations. Representing programs Goals.
Limits on ILP. Achieving Parallelism Techniques – Scoreboarding / Tomasulo’s Algorithm – Pipelining – Speculation – Branch Prediction But how much more.
Recap from last time We were trying to do Common Subexpression Elimination Compute expressions that are available at each program point.
Recap from last time Saw several examples of optimizations –Constant folding –Constant Prop –Copy Prop –Common Sub-expression Elim –Partial Redundancy.
Next Section: Pointer Analysis Outline: –What is pointer analysis –Intraprocedural pointer analysis –Interprocedural pointer analysis (Wilson & Lam) –Unification.
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science Emery Berger University of Massachusetts, Amherst Advanced Compilers CMPSCI 710.
Improving code generation. Better code generation requires greater context Over expressions: optimal ordering of subtrees Over basic blocks: Common subexpression.
Administrative info Subscribe to the class mailing list –instructions are on the class web page, which is accessible from my home page, which is accessible.
Interprocedural pointer analysis for C We’ll look at Wilson & Lam PLDI 95, and focus on two problems solved by this paper: –how to represent pointer information.
Prof. Bodik CS 164 Lecture 171 Register Allocation Lecture 19.
4/25/08Prof. Hilfinger CS164 Lecture 371 Global Optimization Lecture 37 (From notes by R. Bodik & G. Necula)
Another example p := &x; *p := 5 y := x + 1;. Another example p := &x; *p := 5 y := x + 1; x := 5; *p := 3 y := x + 1; ???
Range Analysis. Intraprocedural Points-to Analysis Want to compute may-points-to information Lattice:
Register Allocation (via graph coloring)
Data Flow Analysis Compiler Design October 5, 2004 These slides live on the Web. I obtained them from Jeff Foster and he said that he obtained.
Intraprocedural Points-to Analysis Flow functions:
Register Allocation (via graph coloring). Lecture Outline Memory Hierarchy Management Register Allocation –Register interference graph –Graph coloring.
U NIVERSITY OF M ASSACHUSETTS, A MHERST Department of Computer Science Emery Berger University of Massachusetts, Amherst Advanced Compilers CMPSCI 710.
Prof. Fateman CS 164 Lecture 221 Global Optimization Lecture 22.
1 Liveness analysis and Register Allocation Cheng-Chia Chen.
Comparison Caller precisionCallee precisionCode bloat Inlining context-insensitive interproc Context sensitive interproc Specialization.
Improving Code Generation Honors Compilers April 16 th 2002.
Reps Horwitz and Sagiv 95 (RHS) Another approach to context-sensitive interprocedural analysis Express the problem as a graph reachability query Works.
4/29/09Prof. Hilfinger CS164 Lecture 381 Register Allocation Lecture 28 (from notes by G. Necula and R. Bodik)
Pointer analysis. Pointer Analysis Outline: –What is pointer analysis –Intraprocedural pointer analysis –Interprocedural pointer analysis Andersen and.
Procedure Optimizations and Interprocedural Analysis Chapter 15, 19 Mooly Sagiv.
Topic #10: Optimization EE 456 – Compiling Techniques Prof. Carl Sable Fall 2003.
Fast Points-to Analysis for Languages with Structured Types Michael Jung and Sorin A. Huss Integrated Circuits and Systems Lab. Department of Computer.
Static Program Analyses of DSP Software Systems Ramakrishnan Venkitaraman and Gopal Gupta.
Mark Marron 1, Deepak Kapur 2, Manuel Hermenegildo 1 1 Imdea-Software (Spain) 2 University of New Mexico 1.
Compiler Principles Fall Compiler Principles Lecture 0: Local Optimizations Roman Manevich Ben-Gurion University.
Mark Marron IMDEA-Software (Madrid, Spain) 1.
Pointer Analysis Survey. Rupesh Nasre. Aug 24, 2007.
More on Loop Optimization Data Flow Analysis CS 480.
C LANGUAGE Characteristics of C · Small size
Programming for Performance CS 740 Oct. 4, 2000 Topics How architecture impacts your programs How (and how not) to tune your code.
Pointer Analysis – Part I CS Pointer Analysis Answers which pointers can point to which memory locations at run-time Central to many program optimization.
CS 412/413 Spring 2005Introduction to Compilers1 CS412/CS413 Introduction to Compilers Tim Teitelbaum Lecture 30: Loop Optimizations and Pointer Analysis.
Code Optimization More Optimization Techniques. More Optimization Techniques  Loop optimization  Code motion  Strength reduction for induction variables.
Single Static Assignment Intermediate Representation (or SSA IR) Many examples and pictures taken from Wikipedia.
More Code Generation and Optimization Pat Morin COMP 3002.
Probabilistic Pointer Analysis [PPA]
Code Optimization Overview and Examples
High-level optimization Jakub Yaghob
Code Optimization.
Data Flow Analysis Suman Jana
5.13 Recursion Recursive functions Functions that call themselves
Simone Campanoni Dependences Simone Campanoni
Dataflow analysis.
Optimizing Compilers Background
Optimization Code Optimization ©SoftMoore Consulting.
CSC D70: Compiler Optimization Pointer Analysis
University Of Virginia
Unit IV Code Generation
Chapter 6 Intermediate-Code Generation
Data Flow Analysis Compiler Design
Pointer analysis.
Advanced Compiler Design
Loop-Level Parallelism
COMPILERS Liveness Analysis
CSE P 501 – Compilers SSA Hal Perkins Autumn /31/2019
Presentation transcript:

Pointer Analysis Jeff Da Silva Sept 20, 2004 CARG

The Pointer Alias Analysis Problem Statically decide for any pair of pointers, at any point in the program, whether two pointers point to the same memory location. This Problem is known to be undecidable. [Landi 1992]

 Can this loop be parallelized? Example #define N 1024 extern void f(); int *a, *b; int main(int argc, char *argv[]) { int i; a = (int *)calloc(N, sizeof(int)); b = (int *)calloc(N, sizeof(int)); f(); for(i = 0; i < N-1; i++) a[i] = b[i] + i; return 0; } main.c extern int *a, *b; void f() { a = &b[1]; } link.c  Can this loop be parallelized?

The Compiler Writer vs. The Programmer Pointers are needed by programmers to realize complex data structures. Pointers can make life difficult for compiler optimizing and parallelizing tools.

Pointer Analysis Published by Year Haven’t we Solved this Problem Yet? Graph from [M. Hind 2001. Pointer Analysis: Haven’t We Solved this Problem Yet?]

How is Pointer Analysis used? Parallelizing Compiler Can the loop be parallelized? (TLP) void foo(int *a, int *b) { for(i=1; i<N; i++) { a[i] = b[i] / 13; } *a = *b + 1; Guide Compiler Optimizations load/store redundancy elimination, register allocation, CSE, dead code elimination, live variable, instruction scheduling [eg. VLIW] (ILP), loop invariant code motion, etc. Behavioral Synthesis & Data Flow Processors Necessary for partitioning and instruction scheduling. Error Detection & Program Understanding Programmer can detect errors or discover poorly written code.

Pointer Analysis Issues Scalability vs. Accuracy Generally, a ‘difficult’ tradeoff exists between: the amount of computation and memory required vs. the accuracy of the analysis. Precision/Efficiency tradeoff, where is the sweet spot? Which metric should be used? Direct metric The average number of objects aliased to a pointer expression appearing in the program Report performance applied to an optimization Dynamically measure false positives Which benchmark suite? Are the results reproducible?

Pointer Analysis Issues Complications associated with pointer arithmetic, casting, function pointers, long jumps, and multithreaded applications. Can these be ignored? Different pointer analysis uses have different needs. A universal pointer analysis probably doesn’t exist.

Pointer Analysis Design Choices Flow sensitivity Context sensitivity Heap modeling Aggregate modeling Alias representation Whole program

Flow Sensitivity Flow sensitive analysis Flow insensitive The order of the statements matter Need a control flow graph Requires pointer information storage for each program point Flow insensitive The order of statements doesn’t matter Analysis is the same regardless of statement order Uses a single global state Not as precise Path sensitive Each path in a control flow graph is considered

Flow Sensitivity Example S1: a = malloc(…); S2: b = malloc(…); S3: a = b; S4: a = malloc(…); S5: if(c) a = b; S6: if(!c) a = malloc(…) ; S7: ~ = *a; Flow Insensitive aall => [heapS1, heapS2, heapS4, heapS6] Flow Sensitive aS7 => [heapS2, heapS4, heapS6] Path Sensitive aS7 => [heapS2, heapS6]

Context Sensitivity Is calling context considered? p => [b] int f() { p = &b; g(); } int a, b, *p; int main() { f(); p = &a; g(); } p => [b] int g() { ~ = *p; } p => [a]

Heap Modeling Heap merged, i.e. ‘no heap modeling’ Allocation site Each malloc/calloc is considered to be one memory address. Shape analysis Is it a Linked List, Tree, DAG, or Cyclic Graph?

Aggregate Modeling Arrays Structures … … or or or

Alias representation Track pointer aliases a = &b; b = &c; if(…) b = &d; e = b; Track pointer aliases <*a, b>, <*a, e>, <b, e> <**a, c>, <**a, d>, … More precise, less efficient Track points-to info <a, b>, <b, c>, <b, d>, <e, c>, <e, d> Less precise, more efficient **a b *e d c *a e *b a a b c d e

Whole Program & Incremental Compilation Does the analysis require the whole program? Most analysis's require the whole program. Is this practical for commercial compilers? Analysis must be performed at the linking stage. Recompilation will take a long time. What about library code? Incremental Analysis: Can results from a previous analysis be reused? Is the data structure adaptable?

Pointer Analysis Output Typical Output: Typically, ‘Maybe’ is treated like ‘Definitely’ *A = ~ ~ = *B Definitely Not Definitely Maybe Is Maybe Useful?

 What can p point to at program point S5? Example void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); S5: … = *p; }  What can p point to at program point S5?

Address Taken The most basic/intuitive algorithm possible. Flow-insensitive algorithm often used in production compilers. The algorithm: Generate the set of all variables whose addresses are assigned to another variable. Assume that any pointer can potentially point to any variable in that set. Linear with respect to the size of the program. Very imprecise.

Address Taken Example Points-to set = { } T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } Points-to set = { }

Address Taken Example Points-to set = {heap_S1} T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } Points-to set = {heap_S1}

Address Taken Example Points-to set = {heap_S1, p, heap_S4} T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } Points-to set = {heap_S1, p, heap_S4}

Address Taken Example Points-to set = {heap_S1, p, heap_S4, heap_S6} T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } Points-to set = {heap_S1, p, heap_S4, heap_S6}

Address Taken Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } Points-to set = {heap_S1, p, heap_S4, heap_S6, heap_S8, q, local} p can point to point to: {heap_S1, p, heap_S4, heap_S6, heap_S8, q, local}

Anderson Analysis Flow-insensitive iterative algorithm that conservatively uses one points-to graph to represent the entire program. Each abstract stack location is represented by exactly one node in the points-to graph. Given a program statement, the points-to graph building rules are: Worst case complexity of O(n3), where n is the size of the program. Since, it is necessary to iterate until the graph no longer changes. y = x y points-to x y = &x if x points-to w then y points-to w *y = x if y points-to z and x points-to w then z points-to w y = *x if x points-to z and z points-to w

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } p fp q r

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p fp q r

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p fp q r

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q r

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q heap_S6 r

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q heap_S6 r

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q heap_S6 r heap_S1

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q local heap_S6 r heap_S8

Anderson Analysis Example Need to Iterate until graph does not change T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q local heap_S6 r heap_S8

Anderson Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } p q r fp heap_S1 heap_S4 heap_S6 heap_S8 local p can point to point to: {heap_S1, heap_S4, local}

Anderson’s Nightmare Scenario *x = &z; *w = &y; *v = &x; v = &w; v w x y z Initial points-to graph v w x y z Iteration 1 v w x y z Iteration 2 v w x y z Iteration 3 v w x y z Iteration 4

Steensgaard Flow-insensitive algorithm that uses a more compact points-to graph to represent the entire program. Each node within the graph can represent a variable number of abstract stack locations but can only point to one other node [i.e every node has a fan-out of 1 or 0]. A fast union-find data structure is used to enable this fan-out rule. The unioning removes the necessity of iteration from the algorithm. Has almost linear worst case complexity, since it requires only one pass through the program. Not as precise as Anderson’s analysis.

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } p fp q r

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p fp q r

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p fp q r

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 heap_S4 p fp q r

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 heap_S4 p fp q heap_S6 r

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 heap_S4 heap_S6 p, q fp r

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 heap_S4 heap_S6 p, q fp r heap_S8

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 heap_S4 heap_S6 local p, q fp r heap_S8

Steensgaard Analysis Example T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } p, q r fp heap_S1 heap_S4 heap_S6 local heap_S8 p can point to point to: {heap_S1, heap_S4, heap_S6, local}

Steensgaard applied to Anderson’s Nightmare Scenario *x = &z; *w = &y; *v = &x; v = &w; v w x y z Initial points-to graph v x z *v = &x ø w y v w x y z *x = &z ø v x z *w = &y ø w y v x z v = &w y w

A Flow Sensitive, Context Insensitive Analysis T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 q local heap_S6 r heap_S8

A Flow Sensitive, Context Insensitive Analysis T *p, *q, *r; int main() { S1: p = alloc(T); f(); g(&p); S4: p = alloc(T); … = *p; } void f() { S6: q = alloc(T); g(&q); S8: r = alloc(T); } g(T **fp) { T local; if(…) p = &local; } heap_S1 p heap_S4 fp q local heap_S6 r heap_S8 undefined

Emami Flow sensitive, context sensitive, interprocedural points-to algorithm. Has exponential worst case complexity. Very precise, poor scalability. Properties: Arrays aggregated into 2 abstract sets: ahead, atail. Structs separated. Heap represented as one abstract location. The analysis tracks both possible and definite points-to relationships.

Emami – Points-to Node S = {(a,b,D), (b,d,P), (b,c,P)} A definite points to relation from x to y is denoted (x,y,D). A possible points to relation from x to y is denoted (x,y,P). Definite Possible var_name b d a c S = {(a,b,D), (b,d,P), (b,c,P)}

Emami – L-locations and R-locations Given that a points to set S has been calculated for a program point p, you can define the set of locations referred to by each kind of variable referenced in the statement at p. L-loc Sets and R-loc Sets are represented as a pair of the form (x,D) or (x,P). Var Ref L-Loc Set R-Loc Set &a N/A {(a,D)} &a[0] {(ahead,D)} &a[i] (i>0) {(atail,D)} &a[i] (i≥0) {(atail,P), (ahead,P)} malloc {(heap,P)}

Emami – L-locations and R-locations Var Ref L-Loc Set R-Loc Set a {(a,D)} {(x,d) | (a,x,d) Є S} a[0] {(ahead,D)} {(x,d) | (ahead,x,d) Є S} a[i] (i>0) {(atail,D)} {(x,d) | (atail,x,d) Є S} a[i] (i≥0) {(atail,P), (ahead,P),} {(x,P) | (ahead,x,d) Є S U (atail,x,d) Є S} Var Ref L-Loc Set R-Loc Set *a {(x,d) | (a,x,d) Є S} … (*a)[0] {(x,d) | (ahead,x,d) Є S} (*a)[i] (i>0) {(x,d) | (atail,x,d) Є S} (*a)[i] (i≥0) {(x,P) | (ahead,x,d) Є S U (atail,x,d) Є S}

Emami Algorithm Given a stmt S and an input set I, what is the points to set O? If( !is_pointer_type(S) ) O = I; Else { }

Emami’s dataflow framework Else { /*kill all relationships of definite L-locations of lhs(S)*/ kill_set = {(p,x,d) | (p,D) Є L-locations(lhs(S))}; /*change from definite to possible*/ change_set = … /*Generate all possible relationships between lhs(S) and rhs(S); definite iff lhs(S) and rhs(S) are definite*/ gen_set = … O = ((I U change_set) – kill_set) U gen_set; }

Emami Example IN = S = *a = r; kill_set = a b y x z c r s a b y x z c

Emami Example a b y x z c change_set = r s a b y x z c gen_set = r s

Emami Example a b y x z c IN = r s S = *a = r; a b y x z c OUT = r s

Emami Algorithm Merge operation used to handle control flow and loops. IN1 IN2 IN = Merge(IN1, IN2) IN = Merge(IN, OUT) OUT

Concluding Remarks Pointer analysis techniques Address taken Anderson’s analysis Steensgaard Emami Pointer analysis is a difficult problem that may never be solved. Does hardware support for data speculation make the analysis easier for the compiler?

The End… Any Comments or Questions?