loop_invariant_code_motion_optimization (loop_body):
invariant_code = [ ]
new_loop_body = [ ]
for stmt in loop_body:
if is_loop_invariant(stmt):
invariant_code.append(stmt)
else:
new_loop_body.extend(invariant_code)
invariant_code = [ ]
new_loop_body.append(stmt)
new_loop_body.extend(invariant_code)
return new_loop_body
def is_loop_invariant(stmt):
return True or False
Ushbu
kodda
bizda
ikkita
funktsiya
mavjud.
loop_invariant_code_motion_optimization funksiyasi kirish sifatida loop_body ni
oladi, bu original sikl tanasini ifodalaydi.
Funktsiya ichida ikkita ro'yxat yaratiladi: “loop-invariant” kodini saqlash
uchun “invariant_code” va “loop-invariant” kod harakatini optimallashtirishdan keyin
yangi sikl tanasini saqlash uchun “new_loop_body”, “loop_body” dagi har bir holat
takrorlanadi. Agar statement “loop_invariant” funksiyasi asosida “loop-invariant”
ekanligi aniqlansa, u “invariant_code” ro'yxatiga qo'shiladi. Aks holda , ”
invariant_code” da saqlangan “loop-invariant” kodi, uni “new_loop_body” ga
qo'shish orqali sikldan tashqariga o'tkaziladi. Keyin “invariant_kodlar” ro'yxati qayta
o'rnatiladi.
Loopdan keyin “invariant_code” ro'yxatidagi qolgan har qanday siklning
o'zgarmas kodi uni “new_loop_body” ga qo'shish orqali sikldan tashqariga
ko'chiriladi.
Va nihoyat, funktsiya “loop-invariant kod” harakatini optimallashtirish
qo'llanilgandan so'ng, sikl tanasini ifodalovchi “new_loop_body” ni qaytaradi.
“is_loop_invariant” funksiyasi berilgan statementning “loop-invariant” yoki
yo'qligini aniqlaydigan to'ldiruvchidir. Agar ibora “loop-
invariant” bo'lsa, u "True", aks holda "False" ni qaytarishi kerak.
[8]