Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 53 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
53
Dung lượng
281,63 KB
Nội dung
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 front end Bộ tối ưu mã Phân tích dòng điều khiển Phân tích dòng liệu Bộ sinh mã Chuyển đổi Hình 10.1 Tổ chức tối ưu mã 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 for j:= to i if A [j] > A [j + 1] then begin temp := A [j]; A [j] := A [j + 1]; A [j + 1] := temp; end; Giả sử ô nhớ byte Địa dãy A địa phần tử thứ j dãy A là: addr(A[j]) = addr(A) + (j – 1) * (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) i=n-1 ij i < goto (31) j=1 if j > i goto (29) t1 = j - t = * t1 t3 = A [t2] t4 = j + t5 = t4 - t = * t5 t7 = A [t6] ij t3 < t7 goto (27) t8 = j - t = * t8 temp = A [t9] (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) t10 = j + t11 = t10 - t12 = * t11 t13 = A [t12] t4 = j - t15 = * t14 A [t5] = t13 t16 = j + t17 = t16 - t18 = * t17 A [t18] = temp j=j+1 goto (4) i=i-1 goto * Khối Thí dụ 10.2 Đoạn mã trung gian sau xác định khối (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) read L n := k := m := k := k + m c := k > L if (c) goto (11) n := n + m := m + goto (5) write n BB1 BB2 BB3 BB4 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 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: Đồ thị dòng điều khiển (CFG) chương trình đồ thị có hướng, ký hiệu G = (N, E) mà N khối bản, E tập cạnh thể cho dòng điều khiển khối 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 Cho đồ thị dòng điều khiển G = (N, E) khối b ∈ N, xác định successor predcessor cho khối b sau: * 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} 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 caïnh pred (b) = {m ∈ N | (m, b) ∈ E} thí dụ 10.3: pred (BB2) = {BB1 , BB3} pred (BB3) = {BB2}, pred (BB4) = {BB2} Entry G: nút predcessor Exit G: nút successor nút rẽ (branch node) G nút có nhiều successor nút hợp (join node) G nút có nhiều predcessor Đồ thị dòng điều khiển thí dụ 10.3 thêm nút Entry, Exit Entry BB1 BB2 BB3 BB4 Exit Hình 10.3 Nút Entry Exit G Thí dụ minh họa nút rẽ nhánh hợp (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 goto (11) t1 := 4*j j := j+1 goto (5) i := I+1 goto (2) t1 := BB1 BB2 BB3 BB4 BB5 BB6 BB7 BB8 BB9 BB10 BB1 BB1 BB2 BB2 BB3 BB3 BB4 BB4 BB5 BB5 BB6 join node BB7 BB6 branch node BB7 BB8 BB8 BB9 BB9 BB10 BB10 Hình 10.4 Các nút rẽ nhánh hợp Entry g := a*c t1 := a+b c := t1 d := a*c e := d*d i := BB1 f := t1 c := c*2 c>d? BB2 BB3 BB4 i := i+1 i > 10 ? Exit d := c g := d*d BB5 10.4.2 Lan truyền copy 10.4.2.1 Định nghóa sử dụng (use definition) Tập định nghóa đạt đến việc sử dụng a biến gọi dây xích sử dụng định nghóa (ud - chain) cho biến Thí dụ ud – chain Entry z=1 x=1 z>y x=2 y = x+1 z = x-3 Exit 10.4.2.2 Dây xích định nghóa sử dụng Tập tất lần sử dụng mà đạt đến định nghóa gọi dây xích định nghóa sử dụng (du – chain) Thí dụ du – chain ud – chain Entry z=1 x=1 z>y x=2 y = x+1 z = x-3 Exit 10.4.2.3 Biểu thức copy có sẵn (Available Copy Expression) Tập copy Tập câu lệnh copy u := v b maø u vaø v không gán sau b, nghóa câu lệnh có sẵn điểm kết thúc b Tập kill Tập câu lệnh copy bị thay đổi b, nghóa tập câu lệnh copy khối khác mà có toán hạng gán cho b Sự cân dòng liệu copyin: tập lệnh copy có sẵn điểm vào b copyout: tập lệnh copy có sẵn điểm kết thúc b công thức: copyin (b) = ∩ copyout (i) i ∈ pred (b) copyout (b) = copy (b) ∪ [copyin (b) – kill (b)] Giải thuật: tìm copy có sẵn Nhập: đồ thị dòng điều khiển G với kill (b) copy (b) tính sẵn cho khối b Xuất: copyin (b) cho khối Giải thuật: U : Tập tất copy đồ thị dòng điều khiển copyout (Entry) = Φ copyout (b) = copy (b) ∪ [U - kill (b)] ∀ b ∈ N - {Entry, Exit} changed = true while (changed) { changed = false for each b ∈ N - {Entry, Exit} { oldout = copyout (b) copyin (b) = ∩ copyout (i) i ∈ pred (b) copyout (b) = copy (b) ∪ [copyin (b) – kill (b)] if (copyout (b) ≠ oldout) changed = true } } Aein (Exit) = ∩ Aeout (i) i ∈ pred (Exit) 10.4.2.4 Lan truyền copy • Câu lệnh copy câu lệnh có dạng x = y • Sự lan truyền copy thay x y mà không làm thay đổi trị x y Giải thuật: lan truyền copy Nhập: đồ thị dòng điều khiển G với du – chain Xuất: đồ thị dòng điều khiển có sử dụng lan truyền copy Giải thuật: for copy s: x := y thực bước sau: Xác định tất nơi mà định nghóa x sử dụng for lần sử dụng u: a s phải có định nghóa x chạm đạt đến u b đường từ s đến u, tác vụ gán đến y Thí dụ lan truyền copy Entry c := a+b d := c e := d*d c := a+b d := c e := c*c BB1 f := a+c g := e a := e+c a