15-411: Induction Variables Jan Ho ff mann Example Check if an - - PowerPoint PPT Presentation

15 411 induction variables
SMART_READER_LITE
LIVE PREVIEW

15-411: Induction Variables Jan Ho ff mann Example Check if an - - PowerPoint PPT Presentation

15-411: Induction Variables Jan Ho ff mann Example Check if an array is sorted bool is_sorted(int[] A, int n) //@requires 0 <= n && n <= \length(A); { for (int i = 0; i < n-1; i++) //@loop_invariant 0 <= i; if (A[i] >


slide-1
SLIDE 1

15-411: Induction Variables

Jan Hoffmann

slide-2
SLIDE 2

Example

Check if an array is sorted

bool is_sorted(int[] A, int n) //@requires 0 <= n && n <= \length(A); { for (int i = 0; i < n-1; i++) //@loop_invariant 0 <= i; if (A[i] > A[i+1]) return false; return true; }

slide-3
SLIDE 3

Translation to SSA Form

(without array bound checks)

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue : return 1 rfalse : return 0

slide-4
SLIDE 4

Translation to SSA Form

(without array bound checks)

Basic induction variable

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue : return 1 rfalse : return 0

slide-5
SLIDE 5

Translation to SSA Form

(without array bound checks)

Basic induction variable Derived induction variable

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue : return 1 rfalse : return 0

slide-6
SLIDE 6

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue :

A first optimization

slide-7
SLIDE 7

Common subexpression elimination applies

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue :

A first optimization

slide-8
SLIDE 8

Common subexpression elimination applies

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue :

A first optimization

slide-9
SLIDE 9

Common subexpression elimination applies

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse i2 ← i1 + 1 goto loop(i2) rtrue :

Preserve induction variable i

A first optimization

slide-10
SLIDE 10

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 e if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] se if (t3 > t7) goto rfalse i2 ← t4 goto loop(i2)

slide-11
SLIDE 11

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 e if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] t4 ← i1 + 1 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] se if (t3 > t7) goto rfalse i2 ← t4 goto loop(i2)

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 e if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 t5 ← 4 ∗ i2 t6 ← A + t5 t7 ← M[t6] e if (t3 > t7) goto rfalse goto loop(i2)

slide-12
SLIDE 12

is sorted(A, n) : i0 ← 0 goto loop(i0) loop(i1) : t0 ← n − 1 e if (i1 ≥ t0) goto rtrue t1 ← 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 t5 ← 4 ∗ i2 t6 ← A + t5 t7 ← M[t6] e if (t3 > t7) goto rfalse goto loop(i2)

Consider induction variable t1 variable t1 ← 4 ∗ i1. iteration from at a Idea: compute t1 from a previous iteration of t1 Introduce new variable j = 4*i

slide-13
SLIDE 13

is sorted(A, n) : i0 ← 0 j0 ← 4 ∗ i0 @ensures j0 = 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : @requires j1 = 4 ∗ i1 t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 @assert j1 = 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← 4 ∗ i2 @ensures j2 = 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

Consider induction variable t1 variable t1 ← 4 ∗ i1. iteration from at a Idea: compute t1 from a previous iteration of t1 Introduce new variable j = 4*i

slide-14
SLIDE 14

is sorted(A, n) : i0 ← 0 j0 ← 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2) is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : @requires j1 = 4 ∗ i1 t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 @assert j1 = 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

slide-15
SLIDE 15

j0 = 4 ∗ i0 = 0

is sorted(A, n) : i0 ← 0 j0 ← 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2) is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : @requires j1 = 4 ∗ i1 t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 @assert j1 = 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

slide-16
SLIDE 16

j2 = 4 ∗ i2 = 4 ∗ (i1 + 1) = 4 ∗ i1 + 4 = j1 + 4

j0 = 4 ∗ i0 = 0

is sorted(A, n) : i0 ← 0 j0 ← 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2) is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 goto loop(i0, j0) loop(i1, j1) : @requires j1 = 4 ∗ i1 t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 @assert j1 = 4 ∗ i1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

slide-17
SLIDE 17

is sorted(A, n) : i0 ← 0 j0 ← 0 @ goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

slide-18
SLIDE 18

is sorted(A, n) : i0 ← 0 j0 ← 0 @ goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

Loop hoisting

slide-19
SLIDE 19

is sorted(A, n) : i0 ← 0 j0 ← 0 @ goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

Loop hoisting Copy propagation

slide-20
SLIDE 20

is sorted(A, n) : i0 ← 0 j0 ← 0 @ goto loop(i0, j0) loop(i1, j1) : t0 ← n − 1 if (i1 ≥ t0) goto rtrue t1 ← j1 t2 ← A + t1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t4 ← i2 t5 ← 4 ∗ t4 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2) is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 t0 ← n − 1 goto loop(i0, j0) loop(i1, j1) : @requires j1 = 4 ∗ i1 if (i1 ≥ t0) goto rtrue t2 ← A + j1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 t5 ← 4 ∗ i2 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

slide-21
SLIDE 21

is sorted(A, n) : i0 ← 0 j0 ← 0 @ t0 ← n − 1 goto loop(i0, j0) loop(i1, j1) : if (i1 ≥ t0) goto rtrue t2 ← A + j1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t5 ← 4 ∗ i2 t6 ← A + t5 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2) is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 t0 ← n − 1 goto loop(i0, j0) loop(i1, j1) : @requires j1 = 4 ∗ i1 if (i1 ≥ t0) goto rtrue t2 ← A + j1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

slide-22
SLIDE 22

is sorted(A, n) : i0 ← 0 j0 ← 0 @ t0 ← n − 1 goto loop(i0, j0) loop(i1, j1) : if (i1 ≥ t0) goto rtrue t2 ← A + j1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

t2 is another induction variable.

slide-23
SLIDE 23

is sorted(A, n) : i0 ← 0 j0 ← 0 @ t0 ← n − 1 goto loop(i0, j0) loop(i1, j1) : if (i1 ≥ t0) goto rtrue t2 ← A + j1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2)

t2 is another induction variable. We introduce k to keep track of k = A + j

slide-24
SLIDE 24

is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 k0 ← A + j0 @ensures k0 = A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : @requires j1 = 4 ∗ i1 ∧ k1 = A + j1 if (i1 ≥ t0) goto rtrue t2 ← k1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 k2 ← k1 + 4 @ensures k2 = A + j2 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

k2 = A + j2 = A + j1 + 4 = k1 + 4 and

slide-25
SLIDE 25

is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 k0 ← A @ensures k0 = A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : @requires j1 = 4 ∗ i1 ∧ if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 k2 ← k1 + 4 @ensures k2 = A + j2 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t2 ← k1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

slide-26
SLIDE 26

is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 k0 ← A @ensures k0 = A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : @requires j1 = 4 ∗ i1 ∧ if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 k2 ← k1 + 4 @ensures k2 = A + j2 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) One more round of constant propagation, dead code elim., and CSE is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t2 ← k1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

slide-27
SLIDE 27

is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 k0 ← A @ensures k0 = A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : @requires j1 = 4 ∗ i1 ∧ if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 k2 ← k1 + 4 @ensures k2 = A + j2 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) One more round of constant propagation, dead code elim., and CSE is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t2 ← k1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

slide-28
SLIDE 28

is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 k0 ← A @ensures k0 = A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : @requires j1 = 4 ∗ i1 ∧ if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 k2 ← k1 + 4 @ensures k2 = A + j2 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) One more round of constant propagation, dead code elim., and CSE is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t2 ← k1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

slide-29
SLIDE 29

is sorted(A, n) : i0 ← 0 j0 ← 0 @ensures j0 = 4 ∗ i0 k0 ← A @ensures k0 = A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : @requires j1 = 4 ∗ i1 ∧ if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 @ensures j2 = 4 ∗ i2 k2 ← k1 + 4 @ensures k2 = A + j2 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) One more round of constant propagation, dead code elim., and CSE is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A + j0 t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t2 ← k1 t3 ← M[t2] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t6 ← A + j2 t7 ← M[t6] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

slide-30
SLIDE 30

is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2)

slide-31
SLIDE 31

is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) j1, j2, and j3 are no longer needed.

slide-32
SLIDE 32

is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) j1, j2, and j3 are no longer needed.

slide-33
SLIDE 33

is sorted(A, n) : i0 ← 0 j0 ← 0 @ k0 ← A t0 ← n − 1 goto loop(i0, j0, k0) loop(i1, j1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 j2 ← j1 + 4 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, j2, k2) j1, j2, and j3 are no longer needed. is sorted(A, n) : i0 ← 0 k0 ← A @ensures k0 = A + 4 ∗ i0 t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : @requires k1 = A + 4 ∗ i1 if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 @ensures k2 = A + 4 ∗ i2 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

slide-34
SLIDE 34

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

slide-35
SLIDE 35

i1 ≥ t0 iff A + 4 ∗ i1 ≥ A + 4 ∗ t0

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

slide-36
SLIDE 36

i1 ≥ t0 iff A + 4 ∗ i1 ≥ A + 4 ∗ t0

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (i1 ≥ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (k1 ≥ A + 4 ∗ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

slide-37
SLIDE 37

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (k1 ≥ A + 4 ∗ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

slide-38
SLIDE 38

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (k1 ≥ A + 4 ∗ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

i0, i1, and i2 are no longer needed.

slide-39
SLIDE 39

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (k1 ≥ A + 4 ∗ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

i0, i1, and i2 are no longer needed.

is sorted(A, n) : k0 ← A t0 ← n − 1 t8 ← 4 ∗ t0 t9 ← A + t8 goto loop(k0) loop(k1) : if (k1 ≥ t9) goto rtrue t3 ← M[k1] k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(k2) rtrue :

slide-40
SLIDE 40

is sorted(A, n) : i0 ← 0 k0 ← A t0 ← n − 1 goto loop(i0, k0) loop(i1, k1) : if (k1 ≥ A + 4 ∗ t0) goto rtrue t3 ← M[k1] i2 ← i1 + 1 k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(i2, k2)

i0, i1, and i2 are no longer needed.

is sorted(A, n) : k0 ← A t0 ← n − 1 t8 ← 4 ∗ t0 t9 ← A + t8 goto loop(k0) loop(k1) : if (k1 ≥ t9) goto rtrue t3 ← M[k1] k2 ← k1 + 4 t7 ← M[k2] if (t3 > t7) goto rfalse goto loop(k2) rtrue :

Unrolling the loop

  • nce can remove one

memory access per iteration.