Ñoà thò doøng ñieàu khieån (CFG) cuûa moät chöông trình laø moät ñoà thò coù höôùng, ñöôïc kyù hieäu G = (N, E) maø trong ñoù N laø caùc khoái cô baûn, E laø taäp caïnh theå hieän cho d[r]
(1)CHƯƠNG 10 TỐI ƯU MÃ
10.1 Giới thiệu
- Tiêu chuẩn chuyển mã tốt
- Tổ chức trình biên dịch tối ưu
Hình 10.1 Tổ chức tối ưu mã
front end Bộ tối ưu mã Bộ sinh mã
Chuyển đổi Phân tích
dịng liệu Phân tích dịng
(2)Mã trung gian
Thí dụ 10.1 Chuyển đổi sang mã trung gian ba địa cho đoạn chương trình ngơn ngữ Pascal
for i := n – down to do for j:= to i do
if A [j] > A [j + 1] then begin
temp := A [j];
A [j] := A [j + 1]; A [j + 1] := temp; end;
(3)(1) i = n -
(2) ij i < goto (31) (3) j =
(4) if j > i goto (29) (5) t1 = j -
(6) t2 = * t1 (7) t3 = A [t2] (8) t4 = j + (9) t5 = t4 - (10) t6 = * t5 (11) t7 = A [t6]
(12) ij t3 < t7 goto (27) (13) t8 = j -
(14) t9 = * t8
(15) temp = A [t9]
(16) t10 = j + (17) t11 = t10 - (18) t12 = * t11 (19) t13 = A [t12] (20) t4 = j - (21) t15 = * t14 (22) A [t5] = t13 (23) t16 = j + (24) t17 = t16 - (25) t18 = * t17 (26) A [t18] = temp (27) j = j +
(4)* Khối bản
Thí dụ 10.2 Đoạn mã trung gian sau xác định khối (1) read L
(2) n := (3) k := (4) m :=
(5) k := k + m (6) c := k > L
(7) if (c) goto (11) (8) n := n +
(9) m := m + (10) goto (5) (11) write n
BB2
(5)10.2 Phân tích dịng liệu
Các cấu trúc điều khiển if, while, for gây rẽ nhánh
chương trình Xác định rẽ nhánh xác định thay đổi trị biến chương trình, từ sử dụng biến q trình tối ưu hóa
10.2.1 Mục đích
Xác định cấu trúc điều khiển chương trình là: - mô tả đường thực chương trình
- xác định vòng lặp
10.2.2 Đồ thị dịng điều khiển (Control Flow Graphs)
Định nghóa:
(6)Thí dụ 10.3 Đoạn mã trung gian (gồm khối bản) thí dụ 10.2 biểu diễn thành đồ thị dòng liệu
BB1 BB2
BB3 BB4
Hình 10.2 Đồ thị dịng điều khiển
10.2.3 Successor, predcessor khối bản
(7)* Successor b, ký hiệu succ (b) tập khối n, mà đạt đến từ b cạnh succ (b) = {n ∈ N | (b, n) ∈ E}
như thí dụ 10.3: succ (BB1) = {BB2};
succ (BB2) = {BB3, BB4}, succ (BB3) = {BB2} * Predcessor b, ký hiệu pred (b) tập khối m, mà đạt đến b cạnh pred (b) = {m ∈ N | (m, b) ∈ E}
như thí dụ 10.3: pred (BB2) = {BB1 , BB3}
pred (BB3) = {BB2}, pred (BB4) = {BB2}
Entry G: nút predcessor Exit G: nút successor
(8)Đồ thị dòng điều khiển thí dụ 10.3 thêm nút Entry, Exit Entry
Exit BB1
BB2
BB3 BB4
(9)Thí dụ minh họa nút rẽ nhánh vaø hợp BB1
BB5
BB6 BB7
BB8 BB9 BB10 BB2 BB3 BB4 (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15)
i :=
if(I>n) goto (15) t :=
j :=
if(j>n) goto (13) tmp := te + ts
if(tmp < 0) goto (10) t1 := t1 + ts
(10)BB1
BB5
BB6 BB7
BB8 BB9 BB10
BB2 BB3 BB4 BB1
BB5
BB6 BB7
BB8 BB9 BB10
BB2 BB3 BB4
Hình 10.4 Các nút rẽ nhánh hợp
join node
(11)10.2.4 Chi phoái (dominater)
Định nghĩa dominater: nút n G chi phối nút n’ , ký hiệu n dom n’ (hay n Ỉ n’ ), đường từ nút Entry G đến n’ phải qua n Với định nghĩa nút n chi phối Nút điểm vào vòng lặp chi phối nút vịng lặp
BB1 Ỉ BB1 ; BB1 Ỉ BB2 ; BB1 Ỉ BB3 ; BB1 Ỉ BB4 BB2 Æ BB2 ; BB2 Æ BB3 ; BB2 Æ BB4 BB3 Ỉ BB3 BB4 Ỉ BB4
Entry
Exit BB1
BB2
(12) properdominate
N proper dominate n’ , ký hiệu n Ỉ
p n’ , n Ỉ n’ n ≠ n’
thí dụ BB1 Ỉ p BB2 ; BB1 Ỉ p BB3 ; BB1 Ỉ p BB4 ; BB2 Ỉ
p BB3 ; BB2 Ỉ p BB4
direct dominate
Nút n gọi direct dominate n’ , ký hiệu n Ỉ
d n’ , n Ỉ p n’
và không tồn n” ∈ N mà n Ỉ p n”
BB1 Ỉ d BB2 ; BB2 Ỉ d BB3 ; BB2 Ỉ d BB4
cây dominate (dominate tree); ký hiệu viết tắt DT, mà nút gốc Entry; nút thuộc G cạnh quan hệ direct dominator
(13)Entry BB1 BB2
BB3 BB4
(14)Giải thuật 2.2: tìm dominator Nhập: đồ thị dịng điều khiển G
Xuất: tập dominator nút thuộc G Giải thuật:
DOM (Entry) = Entry
DOM (ν) = N ∀ ν ∈ N - {Entry, Exit} change = true
while (change) {change = false for each ν ∈ N - {Entry, Exit} {
old DOM = DOM (ν)’
(15)if (DOM (ν) = old DOM) change = true }
}
10.2.5 Direct dominator
Direct dominator cuûa nút n.
Giải thuật tìm direct dominator nút: - Khởi động tập proper dominator nút n
- Loại bỏ nút mà proper dominator nút khác tập
Giải thuật 10.3 Tìm direct dominator Nhập: đồ thị dịng G
(16)Giải thuật:
for với nút n ∈ N - {Entry} do DOMd (n) = DOM (n) - {n}
for với nút n ∈ N - {Entry} do
for với nút s ∈ DOMd (n) - {s} do if t ∈ DOMd (s) then
DOMd (n) = DOMd (n) - {t}; Ở thí dụ hình 10.1, ta có:
(17)10.2.6 Post – dominator
Định nghóa:
Cho đồ thị dịng điều khiển G = (N, E) n, n’ ∈ N
- Nút n gọi post – dominator nút n’, ký hiệu n Ỉ n’ đường từ n đến nút Exit chứa n’
Ở thí dụ hình 10.3, ta có post – dominator:
1 ← 1; ← 2; ← 3; ← 4; ← 2; ← 3; ← 4; ← 3; ←
- Nút n gọi direct post – dominator nút n’, ký hiệu n ← n’, n ← pn’ không tồn n” ∈ N mà n ← pn” ← pn’
(18)Thí dụ post – dominator G laø dominator G-1 Entry
Exit BB1
BB2
BB3 BB4
G1 G-1
Entry
Exit BB1
BB2
(19)10.2.7 Vòng lặp
Các yếu tố xác định vịng lặp tự nhiên:
- Một vòng lặp phải có điểm vào đơn, gọi header
- Điểm vào header dominate tất nút lại vòng lặp
- Phải có cách lặp, nghóa phải có cạnh quay header
Giải thuật 10.3 Tìm vòng lặp
Nhập: đồ thị dịng G cạnh t Ỉ h
Xuất: vòng lặp bao gồm tất nút vòng lặp tự nhiên t Ỉ h
Phương pháp:
- Tìm dominator nút CFG - Xác định cạnh vẽ
(20)- Để tìm cạnh vẽ: thực duyệt CFG theo chiều sâu trước Một cạnh lùi e = (t, h) ∈ E cạnh lùi h Ỉ t Một cạnh lùi cạnh vẽ vịng lặp cách sử dụng điều khiển có cấu trúc
Giải thuật: stack s = empty set loop = {h}
insert – on – stack (t); /* stack s* while S is not empty beg
m = pop (s);
for each pred (m) do
insert – on – stack (p); end insert – on – stack (a) begin