Az induktív változó olyan ciklusokban lévő változó , amelynek egymást követő értékei aritmetikai progressziót alkotnak. A leggyakoribb példa a hurokszámláló. Az induktív változókat gyakran használják a tömb indexkifejezéseiben.
Például a következő példában iés jinduktív változók:
for ( i = 0 ; i < 10 ; i ++ ) { j = 17 * i ; }A hagyományos optimalizálási módszerek magukban foglalják az induktív változók felismerését és eltávolítását a hurokból.
Az általános optimalizálási elv az induktív változók felismerése és egyszerű számításokkal való helyettesítése. Például a fenti kód módosítható egy optimalizáló fordítóval , azon a feltételezésen alapulva, hogy az állandó összeadás olcsóbb lenne, mint a szorzás:
j = -17 ; for ( i = 0 ; i < 10 ; i ++ ) { j = j + 17_ _ }Ez az alkalmazás a költségcsökkentési optimalizálás speciális esete .
Egyes esetekben ezt az optimalizálást használhatja az induktív változó teljes eltávolítására a kódból. Például:
extern int összeg ; int foo ( int n ) { int i , j ; j = 5_ _ for ( i = 0 ; i < n ; i ++ ) { j += 2 ; összeg += j ; } visszatérési összeg ; _ }A függvény ciklusának két induktív változója van: iés j. Az egyik a másik lineáris függvényeként ábrázolható, így a fordító a következőképpen optimalizálhatja ezt a kódot:
extern int összeg ; int foo ( int n ) { int i ; for ( i = 0 ; i < n ; i ++ ) { összeg += ( 5 + 2 * ( i + 1 )); } visszatérési összeg ; _ }Az induktív változóhelyettesítés olyan transzformáció, amely a ciklusindex függvényében ábrázolható változókat felismeri és a megfelelő kifejezésekkel helyettesíti. Ez az átalakítás explicitté teszi a változók és a ciklusindexek közötti kapcsolatokat, ami segít más fordítóoptimalizálásban. Vegyünk egy példát:
int c , i ; c = 10_ _ for ( i = 0 ; i < 10 ; i ++ ) { c = c + 5 ; // c 5-tel növekszik a ciklus minden iterációjában }A fent leírt módszernek megfelelően a forráskód következő reprezentációját kapjuk:
int c , i ; c = 10_ _ for ( i = 0 ; i < 10 ; i ++ ) { c = 10 + 5 * ( i + 1 ); // c az index függvénye }Ugyanezek az optimalizálások alkalmazhatók olyan induktív változókra is, amelyek nem a hurokszámláló lineáris függvényei. Például a következő kód:
j = 1_ _ for ( i = 0 ; i < 10 ; i ++ ) { j = j << 1 ; }átalakítható:
for ( i = 0 ; i < 10 ; i ++ ) { j = 1 << i + 1 ; }