Wildan
Banyak teknik yang penting untuk optimasi lokal mulai dengan mengubah
dasar blok menjadi DAG (diarahkan grafik asiklik).
c=b+c
d=ad
Jika variabel x didefinisikan dua kali, atau jika ditugaskan sekali dan
awal Nilai xq juga digunakan, maka kita harus memastikan bahwa kita
tidak mengubah nilai x sampai kita telah membuat semua penggunaan
node yang nilainya x sebelumnya dipegang.
Identitas aljabar merupakan kelas penting dari optimasi pada dasar blok. Sebagai
contoh, kita mungkin berlaku identitas aritmatika, seperti :
x+0=0+xx
x-0=x
xxl = lxx = x
x/1 = x
Kelas lain dari optimasi aljabar meliputi pengurangan lokal dalam kekuatan, yaitu,
mengganti operator yang lebih mahal dengan yang lebih murah seperti dalam:
EXPENSIVE
CHEAPER
x2
xxx
2xx
x+x
x/2
x x 0.5
Jika kita berpikir dari [i] sebagai sebuah operasi yang melibatkan dan saya,
mirip dengan + i, maka itu mungkin muncul seolah-olah dua kegunaan dari [i]
adalah subexpression umum. di Kalau begitu, kita mungkin tergoda untuk
"mengoptimalkan" dengan mengganti instruksi ketiga z = a [i] dengan
sederhana z = x. Namun, karena j bisa sama i, tengah Pernyataan mungkin
sebenarnya mengubah nilai dari [i]; dengan demikian, tidak sah untuk
membuat perubahan ini.
Ketika kita menetapkan secara tidak langsung melalui pointer, seperti dalam
tugas
x = *p
*q = y
kita tidak tahu apa p atau q arahkan ke. Akibatnya, x = * p adalah penggunaan
setiap variabel apapun, dan * q = y adalah tugas mungkin untuk setiap
variabel. sebagai Akibatnya, operator = * harus mengambil semua node yang
saat ini terkait dengan pengidentifikasi sebagai argumen, yang relevan untuk
mati-kode eliminasi. lebih penting, * = operator membunuh semua node lain
sejauh ini dibangun di DAG. Ada pointer global yang menganalisis salah satu
bisa melakukan yang mungkin membatasi set variabel pointer bisa referensi di
suatu tempat tertentu dalam kode.
Setelah kita melakukan optimasi apapun yang mungkin saat membangun DAG
atau dengan memanipulasi DAG sekali dibangun, kita dapat menyusun kembali
tiga alamat kode untuk blok dasar dari mana kita membangun DAG. Untuk
setiap node yang memiliki satu atau lebih variabel terikat, kita membangun
tiga alamat Pernyataan yang menghitung nilai salah satu variabel.