1 / 34

Loop-invariant Code Motion in SSA

This article explores the concept of loop-invariant code motion in Single Static Assignment (SSA) form, including techniques for detecting loop invariants and implementing code transformations. It also discusses the benefits of SSA in simplifying Common Subexpression Elimination (CSE) and other optimizations.

ramm
Download Presentation

Loop-invariant Code Motion in SSA

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Example in SSA in X := Y op Z FX := Y op Z(in) = in [ { X ! Y op Z } out in0 in1 FX := (in0, in1) = (in0Å in1 ) [ { X ! E | Y ! E 2 in0Æ Z ! E 2 in1 } X := (Y,Z) out

  2. Example in SSA

  3. Example in SSA

  4. What about pointers? • Pointers complicate SSA. Several options. • Option 1: don’t use SSA for pointed to variables • Option 2: adapt SSA to account for pointers • Option 3: define src language so that variables cannot be pointed to (eg: Java)

  5. SSA helps us with CSE • Let’s see what else SSA can help us with • Loop-invariant code motion

  6. Loop-invariant code motion • Two steps: analysis and transformations • Step1: find invariant computations in loop • invariant: computes same result each time evaluated • Step 2: move them outside loop • to top if used within loop: code hoisting • to bottom if used after loop: code sinking

  7. Example

  8. Example

  9. Detecting loop invariants • An expression is invariant in a loop L iff: (base cases) • it’s a constant • it’s a variable use, all of whose defs are outside of L (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use with only one reaching def, and the rhs of that def is loop-invariant

  10. Computing loop invariants • Option 1: iterative dataflow analysis • optimistically assume all expressions loop-invariant, and propagate • Option 2: build def/use chains • follow chains to identify and propagate invariant expressions • Option 3: SSA • like option 2, but using SSA instead of ef/use chains

  11. Example using def/use chains • An expression is invariant in a loop L iff: • (base cases) • it’s a constant • it’s a variable use, all of whose defs are outside of L • (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use with only one reaching def, and the rhs of that def is loop-invariant

  12. Example using def/use chains • An expression is invariant in a loop L iff: • (base cases) • it’s a constant • it’s a variable use, all of whose defs are outside of L • (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use with only one reaching def, and the rhs of that def is loop-invariant

  13. Example using def/use chains • An expression is invariant in a loop L iff: • (base cases) • it’s a constant • it’s a variable use, all of whose defs are outside of L • (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use with only one reaching def, and the rhs of that def is loop-invariant

  14. Loop invariant detection using SSA • An expression is invariant in a loop L iff: (base cases) • it’s a constant • it’s a variable use, all of whose single defs are outside of L (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use whose single reaching def, and the rhs of that def is loop-invariant •  functions are not pure

  15. Example using SSA • An expression is invariant in a loop L iff: • (base cases) • it’s a constant • it’s a variable use, all of whose single defs are outside of L • (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use whose single reaching def, and the rhs of that def is loop-invariant •  functions are not pure

  16. Example using SSA and preheader • An expression is invariant in a loop L iff: • (base cases) • it’s a constant • it’s a variable use, all of whose single defs are outside of L • (inductive cases) • it’s a pure computation all of whose args are loop-invariant • it’s a variable use whose single reaching def, and the rhs of that def is loop-invariant •  functions are not pure

  17. Summary: Loop-invariant code motion • Two steps: analysis and transformations • Step1: find invariant computations in loop • invariant: computes same result each time evaluated • Step 2: move them outside loop • to top if used within loop: code hoisting • to bottom if used after loop: code sinking

  18. Code motion

  19. Example

  20. Lesson from example: domination restriction

  21. Domination restriction in for loops

  22. Domination restriction in for loops

  23. Avoiding domination restriction

  24. Another example

  25. Data dependence restriction

  26. Avoiding data restriction

  27. Summary of Data dependencies • We’ve seen SSA, a way to encode data dependencies better than just def/use chains • makes CSE easier • makes loop invariant detection easier • makes code motion easier • Now we move on to looking at how to encode control dependencies

  28. Control Dependencies • A node (basic block) Y is control-dependent on another X iff X determines whether Y executes • there exists a path from X to Y s.t. every node in the path other than X and Y is post-dominated by Y • X is not post-dominated by Y

  29. Control Dependencies • A node (basic block) Y is control-dependent on another X iff X determines whether Y executes • there exists a path from X to Y s.t. every node in the path other than X and Y is post-dominated by Y • X is not post-dominated by Y

  30. Example

  31. Example

  32. Control Dependence Graph • Control dependence graph: Y descendent of X iff Y is control dependent on X • label each child edge with required condition • group all children with same condition under region node • Program dependence graph: super-impose dataflow graph (in SSA form or not) on top of the control dependence graph

  33. Example

  34. Example

More Related