Кіріспе

Компиляторды оңтайландыру түрі

Компьютерлік бағдарламалауда циклдік өзгермейтін код – бұл бағдарламаның мағынасын өзгертпей, циклдің ішіндегі бөлігінен сыртқа жылжытуға болатын операторлар немесе өрнектер (бұйрық беру тілінде). Циклдік өзгермейтін кодты жылжыту (сонымен қатар көтеру немесе скалярлық жылжыту деп те аталады) – бұл қозғалысты автоматты түрде жүзеге асыратын компилятордың оңтайландыруы.

Өзгермейтін кодты анықтау

Көбінесе, қолжетімді анықтамалар талдауы бір мәлімдеме немесе өрнектің цикл инварианты екенін анықтау үшін қолданылады. Мысалы, егер қандай да бір қарапайым өрнектің операндарына қатысты барлық қолжетімді анықтамалар циклдің сыртында болса, онда сол өрнекті циклден шығаруға болады. Дерек ағынының тәуелділік талдауын пайдаланатын соңғы жұмыстар инвариант командаларды ғана емес, сонымен қатар ішкі цикл сияқты үлкен код фрагменттерін анықтауға мүмкіндік береді. Бұл талдау, сондай-ақ, кез келген дәрежедегі квази-инварианттарды анықтайды, яғни цикл денесінің белгілі бір саны ітерілгеннен кейін инвариант болатын командаларды немесе код фрагменттерін анықтайды.

Артықшылықтары

Шығарылған циклдық инвариант код жиірек орындалмайды, бұл орындау жылдамдығын арттырады. Бұл түрлендірудің тағы бір салдары – тұрақтыларды тіркеулерде сақтауға мүмкіндік туады, соның салдарынан әр итерацияда адресті есептеу және жадқа (немесе кэш жолына) кіру қажеттілігі болмайды. Дегенмен, егер тым көп айнымалы құрылса, тіркеулерге күшті жүктеме түседі, әсіресе 32 биттік x86 сияқты тіркеулердің аз саны бар процессорларда. Егер компилятор тіркеулердің таусылып қалса, кейбір айнымалылар жадқа шығарылады. Мұны болдырмау үшін кері оңтайландыру, яғни қайта құру (рематериализация) қолданылуы мүмкін.