參考資料:
常量傳播
將能夠計算出結(jié)果的變量直接替換為常量
void main() {
int a = 1;
printf("%d", a);
}
優(yōu)化后
void main() {
printf("%d", 1);
}
常量折疊
多個變量計算時,如果能直接計算出結(jié)果,變量將直接被常量替換
int main() {
int a = 3 + 1 - 3 * 1
printf("%d", a);
}
優(yōu)化后
int main() {
printf("%d", 1);
}
復(fù)寫傳播
兩個相同的變量可以用一個代替
void f() {
int x = 3;
int y = 4;
y = x;
}
優(yōu)化后
void f() {
int x = 3;
}
公共子表達式消除
如果一個表達式E已經(jīng)計算過了色查,并且從先前的計算到現(xiàn)在的E中的變量都沒有發(fā)生變化恨胚,那么E的此次出現(xiàn)就成為了公共子表達式铐拐。
void f() {
int a = 3;
int c = 8;
int x = 0;
x=(a+c)*12+(c+a)*2;//此處的a+c便是公共子表達式
}
優(yōu)化后
void f() {
int a = 3;
int c = 8;
int x = 0;
x=E*12+E*2;//此時某些編譯器還會進行代數(shù)化簡x=E*14;
}
無用代碼消除
永遠(yuǎn)不能被執(zhí)行到的代碼或者沒有任何意義的代碼會被清除掉
void f() {
int x = 9;
x =x ;
...
}
優(yōu)化后
void f() {
int x = 9;
...
}
數(shù)組范圍檢查消除
數(shù)組邊界檢查不是必須在運行期間一次不漏的檢查贪绘,而是可以協(xié)商的序调。如果及時編譯器能根據(jù)數(shù)據(jù)流分析出變量的取值范圍在[0,max_length]之間,那么在循環(huán)期間就可以把數(shù)組的上下邊界檢查消除兔簇。
方法內(nèi)聯(lián)
編譯器最終要的優(yōu)化手段,可減少方法調(diào)用的成本,并為其他優(yōu)化做基礎(chǔ)垄琐。
逃逸分析
分析對象動態(tài)作用域边酒,一旦確定對象不會發(fā)生方法逃逸和線程逃逸,就可以對這個變量進行高效的優(yōu)化狸窘,比如棧上分配墩朦、同步消除、標(biāo)量替換等翻擒。
其他資料
1 Program Analysis via Graph Reachability
2 Notes on Graph Algorithms Used in Optimizing Compilers
3 基于中間代碼的優(yōu)化中 循環(huán)的查找算法有哪些呢 循環(huán)的優(yōu)化方法又有哪些氓涣?