21/1/2010 Mở đầu Bài 13 Tối ưu mã Tối ưu cục Kỹ thuật để cải tiến mã đích cách cục Một phương pháp để cải tiến chương trình đích cách xem xét dãy lệnh mã đích thay chúng đoạn mã ngắn hiệu Xu hướng g Tối ưu cục Loại bỏ lệnh dư thừa Thông tin dòng điều khiển Giản lược biểu thức đại số Sử dụng đặc trưng ngôn ngữ Yêu cầu Chương trình sau tối ưu phải tương đương Tốc độ thực trung bình tăng Hiệu đạt tương xứng với công sức bỏ Có thể tối ưu mã vào lúc Mã nguồn- người lập trình (giải thuật) Mã trung gian Mã đích Tính toán biểu thức x := 32 trở thành x := 64 x := x + 32 Mã không đến goto L2 x := x + Å Không cần Tối ưu dòng điều khiển goto L1 trở thành goto L2 … L1: goto L2 Å Không cần không lệnh sau L2 21/1/2010 Tối ưu cục Giản Tối ưu khối sở lược biểu thức đại số x := x + Å Không cần Mã chết x := 32 Å x không dùng lệnh y := x + y Æ y := y + 32 Loại bỏ biểu thức chung Tính giá trị Copy Propagation Loại mã chết… Giảm chi phí tính toán x := x * Æ x := x + x Æ x := x v goto (9) 27 t14 = a[t13] 13 if i >= j goto (23) 28 a[t12] = t14 14 t6 = * i 29 t15 = * n 15 x = a[t6] 30 a[t15] = x pháp Chuyển đoạn mã bất biến vòng lặp Ví dụ: while (i v goto B3 t10 = * j t15 = * n a[t10] = x a[t15] = x goto B2 B4 if i >= j goto B6 21/1/2010 B1 B1 i=m-1 j=n i=m-1 Loại biểu thức chung j=n t1 =4 * n v = a[t1] v = a[t1] B5 t6 = * i B2 i=i +1 B3 Loại biểu thức chung t1 =4 * n B6 t11 = * i x = a[t6] x = a[t11] t2 = * i t7 = * i t12 = * i t3 = a[t2] t8 = * j if t3 < v goto B2 t13 = * n t9 = a[t8] t14 = a[t13] a[t7] = t9 a[t12] = t14 j=j–1 t4 = * j t5 = a[t4] t10 = * j t15 = * n a[t10] = x a[t15] = x i=i +1 B6 t6 = * i t11 = * i x = a[t6] x = a[t11] t2 = * i t8 = * j t12 = * i t3 = a[t2] t9 = a[t8] if t3 < v goto B2 t13 = * n a[t6] = t9 t14 = a[t13] t10= * j a[t12] = t14 B3 j=j–1 t4 = * j t5 = a[t4] goto B2 if t5 > v goto B3 B5 B2 a[t10] = x t15 = * n goto B2 a[t15] = x if t5 > v goto B3 B4 B4 if i >= j goto B6 if i >= j goto B6 B1 B1 i=m-1 j=n i=m-1 Loại biểu thức chung j=n t1 =4 * n v = a[t1] B2 i=i +1 B5 v = a[t1] B6 t6 = * i t11 = *i x = a[t6] x = a[t11] t2 = * i t8 = * j t12 = * i t3 = a[t2] t9 = a[t8] if t3 < v goto B2 t13 = * n a[t6] = t9 t14 = a[t13] a[t8] = x a[t12] = t14 B3 j=j–1 t4 = * j t5 = a[t4] goto B2 B2 i=i +1 B6 t6 = * i t11 = * i x = a[t6] x = a[t11] t2 = * i t8 = * j t12 = * i t9 = a[t8] if t3 < v goto B2 t13 = * n a[t6] = t9 t14 = a[t13] a[t8] = x a[t12] = t14 j=j–1 t15 = * n t4 = * j a[t15] = x B5 t3 = a[t2] B3 t5 = a[t4] if t5 > v goto B3 B4 Loại biểu thức chung t1 =4 * n goto B2 t15 = * n a[t15] = x if t5 > v goto B3 B4 if i >= j goto B6 if i >= j goto B6 21/1/2010 B1 B1 i=m-1 j=n Loại biểu thức chung i=m-1 j=n t1 =4 * n v = a[t1] Loại biểu thức chung t1 =4 * n B5 B2 i=i +1 v = a[t1] B6 t6 = * i t11 = * i x = a[t6] x = a[t11] t2 = * i t8 = * j t13 = * n t3 = a[t2] t9 = a[t8] if t3 < v goto B2 t14 = a[t13] a[t6] = t9 a[t11] = t14 a[t8] = x t15 = * n goto B2 a[t15] = x B3 j=j–1 t4 = * j B5 B6 t6 = * i B2 t11 = * i x = a[t6] i=i +1 t2 = * i t8 = * j t3 = a[t2] t9 = a[t8] if t3 < v goto B2 a[t6] = t9 B3 x = a[t11] t13 = * n t14 = a[t [t13] a[t11] = t14 a[t8] = x j=j–1 a[t13] = x goto B2 t4 = * j t5 = a[t4] t5 = a[t4] if t5 > v goto B3 if t5 > v goto B3 B4 B4 if i >= j goto B6 if i >= j goto B6 B1 B1 i=m-1 j=n Loại biểu thức chung i=m-1 j=n t1 =4 * n v = a[t1] B5 i=i +1 x = a[t6] t2 = * i t8 = * j t3 = a[t2] t9 = a[t8] if t3 < v goto B2 B3 a[t6] = t9 a[t8] = x j=j–1 v = a[t1] B6 t6 = * i B2 goto B2 t11 = * i x = a[t11] t13 = * n t14 = a[t [t13] a[t11] = t14 a[t13] = x B6 i=i +1 t8 = * j t2 = * i t9 = a[t8] t3 = a[t2] a[t2] = t9 if t3 < v goto B2 B3 a[t8] = x goto B2 j=j–1 t4 = * j t5 = a[t4] t5 = a[t4] if t5 > v goto B3 B5 x = a[t2] B2 t4 = * j B4 Loại biểu thức chung t1 =4 * n t11 = * i x = a[t11] t13 = * n t14 = a[t [t13] a[t11] = t14 a[t13] = x if t5 > v goto B3 B4 if i >= j goto B6 if i >= j goto B6 21/1/2010 B1 B1 i=m-1 j=n Loại biểu thức chung i=m-1 j=n t1 =4 * n v = a[t1] Loại biểu thưc chung t1 =4 * n B5 t11 = * i t8 = * j i=i +1 t2 = * i t9 = a[t8] t3 = a[t2] a[t2] = t9 if t3 < v goto B2 t13 = * n t14 = a[t [t13] a[t11] = t14 goto B2 a[t13] = x j=j–1 B5 B6 x = t3 B2 x = a[t11] a[t8] = x B3 v = a[t1] B6 x = t3 B2 i=i +1 t9 = a[t4] t2 = * i a[t2] = t9 t3 = a[t2] a[t4] = x if t3 < v goto B2 t11 = * i x = a[t11] t13 = * n t14 = a[t [t13] goto B2 a[t11] = t14 B3 a[t13] = x j=j–1 t4 = * j t4 = * j t5 = a[t4] t5 = a[t4] if t5 > v goto B3 if t5 > v goto B3 B4 B4 if i >= j goto B6 if i >= j goto B6 B1 B1 i=m-1 j=n Loại biểu thức chung i=m-1 j=n t1 =4 * n v = a[t1] t1 =4 * n B5 x = t3 B2 i=i +1 a[t2] = t5 t2 = * i a[t4] = x t3 = a[t2] goto B2 if t3 < v goto B2 v = a[t1] B6 t11 = * i t13 = * n t14 = a[t [t13] a[t11] = t14 B3 j=j–1 a[t13] = x a[t2] = t5 t2 = * i a[t4] = x t3 = a[t2] goto B2 B3 j=j–1 t4 = * j t4 = * j t5 = a[t4] t5 = a[t4] B4 B6 i=i +1 if t3 < v goto B2 if t5 > v goto B3 B5 x = t3 B2 x = a[t11] Common Subexpression Elimination x = t3 t14 = a[t1] a[t2] = t14 a[t [t1] = x Similarly for B6 if t5 > v goto B3 B4 if i >= j goto B6 if i >= j goto B6 21/1/2010 B1 Loại mã chết i=m-1 j=n B1 j=n t1 =4 * n v = a[t1] Loại mã chết i=m-1 t1 =4 * n B5 x = t3 B2 x = t3 a[t2] = t5 i=i +1 v = a[t1] B6 t2 = * i a[t4] = x t3 = a[t2] goto B2 t14 = a[t1] a[t2] = t14 if t3 < v goto B2 B6 a[t2] = t5 t14 = a[t1] i=i +1 a[t4] = t3 a[t2] = t14 t2 = * i goto B2 a[t1] = t3 t3 = a[t2] a[t [t1] = x B3 B5 B2 if t3 < v goto B2 B3 j=j–1 j=j–1 t4 = * j t4 = * j t5 = a[t4] t5 = a[t4] if t5 > v goto B3 if t5 > v goto B3 B4 B4 if i >= j goto B6 if i >= j goto B6 B1 Giảm chi phí i=m-1 j=n B1 j=n t1 =4 * n v = a[t1] t1 =4 * n B5 v = a[t1] B6 a[t2] = t5 t14 = a[t1] i=i +1 a[t4] = t3 a[t2] = t14 t2 = * i goto B2 a[t1] = t3 B2 Giảm chi phí i=m-1 t2 = * i t4 = * j B2 B5 a[t2] = t5 a[t4] = t3 goto B2 t3 = a[t2] t2 = t2 + if t3 < v goto B2 t3 = a[t2] B6 t14 = a[t1] a[t2] = t14 a[t1] = t3 if t3 < v goto B2 B3 j=j–1 t4 = * j B3 t4 = t4 - t5 = a[t4] t5 = a[t4] if t5 > v goto B3 if t5 > v goto B3 B4 if i >= j goto B6 B4 if i >= j goto B6 ... Tính biểu thức Loại mã chết Loại dư thừa cục bộ… Ứng dụng phương pháp tối ưu dẫn đến việc tạo đoạn mã ứng dụng phương pháp tối ưu khác Mã ba địa Quick Sort i=m-1 16 t7 = * I j=n 17 t8... b[t1] a[t1] [t1] = t2 Å Không cần Mã nhận được: i=4 t1 = t2 = b[t1] a[t1] [t1] = t2 i=4 t1 = t2 = b[5] a[5] = t2 i=4 t2 = b[5] a[5] = t2 21/1/2010 Tối ưu DAG Tối ưu vòng đơn giản Phương Vấn đề...21/1/2010 Tối ưu cục Giản Tối ưu khối sở lược biểu thức đại số x := x + Å Không cần Mã chết x := 32 Å x không dùng lệnh y := x + y Æ y := y +