Lösung zu Aufgabe 7.2 --------------------- a) Grundlegende Induktionsvariablen: j abhängige Induktionsvariablen: h1 = 4*j + &A für i Aufsplittung in mehrere konstante Modifikationen: i1 = 4*j i2 = 8*j dann ergeben sich weitere abhängige Induktionsvariablen: h2 = 4*i1 + &B = 16*j + &B h3 = 4*i2 + &C = 32*j + &C b) Strength reduction für Induktionsvariablen 1. Neue Hilfsvariablen, (einzige) Zuweisung jeweils ersetzen i1 = t1 i2 = t2 h1 = t3 h2 = t4 h3 = t5 2. Nach der Zuweisung an die grundlegende I.V. Hilfsvariable modifizieren: j = j + 1 t1 = t1 + 1*4 -- 1 aus j = j + 1, 4 aus i1 = 4*j t2 = t2 + 1*8 t3 = t3 + 1*4 t4 = t4 + 1*16 t5 = t5 + 1*32 3. Initialisierung der Hilfsvariablen vor Schleifenbeginn: j = 0 t1 = 4*j -- aus i1 = 4*j t2 = 8*j t3 = 4*j + &A t4 = 16*j + &B t5 = 32*j + &C 4. Verwendungen der I.V. durch Hilfsvariable ersetzen; ergibt insgesamt: j = 0 t1 = 4*j t2 = 8*j t3 = 4*j + &A t4 = 16*j + &B t5 = 32*j + &C L1: if (j >= 100) goto L2 h1 = t3 *t3 = 0 -- Zugriff auf A [j] i1 = t1 h2 = t4 *t4 = 1 -- Zugriff auf B [i] i2 = t2 h3 = t5 *t5 = 2 -- Zugriff auf C [i] j = j + 1 -- I.V.s weiterzählen t1 = t1 + 1*4 t2 = t2 + 1*8 t3 = t3 + 1*4 t4 = t4 + 1*16 t5 = t5 + 1*32 goto L1 L2: Ergebnis: in der Schleife keine Multiplikationen mehr (nach Konstanten) c) Code-Optimierung via (in-)aktive Variablen und Konstantenpropagierung - ursprüngliche I.V. nicht aktiv in der Schleife - dann auch Berechnungen für t1, t2 nicht aktiv (in und vor der Schleife) [wird rein durch "aktive Variable" nicht unbedingt gefunden!] - Konstantenpropagierung hier v.a. vor Schleifenbeginn (j = 0) - Eliminierung mit linearer Funktion: j und Schleifenabbruch durch andere I.V. ausdrücken (z.B. t3) -- unnötig: j = 0 -- unnötig: t1 = 4*j -- unnötig: t2 = 8*j t3 = &A t4 = &B t5 = &C L1: if (t3 >= 400 + &A) goto L2 -- aus t3 = 4*j + &A und j >= 100 -- nicht aktiv: h1 = t3 *t3 = 0 -- nicht aktiv: i1 = t1 -- nicht aktiv: h2 = t4 *t4 = 1 -- nicht aktiv: i2 = t2 -- nicht aktiv: h3 = t5 *t5 = 2 -- unnötig: j = j + 1 -- unnötig: t1 = t1 + 4 -- unnötig: t2 = t2 + 8 t3 = t3 + 4 t4 = t4 + 16 t5 = t5 + 32 goto L1 L2: