Bài giảng Xây dựng chương trình dịch - Bài 13: Tối ưu mã cung cấp cho người học các kiến thức: Tối ưu hóa cục bộ, tối ưu trong từng khối cơ sở, tối ưu trên DAG, tối ưu vòng đơn giản, giải thuật phân chia các khối cơ bản. Hi vọng đây sẽ là một tài liệu hữu ích dành cho các bạn sinh viên Công nghệ thông tin và những ai quan tâm dùng làm tài liệu học tập và nghiên cứu.
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 tố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 cịn 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 tố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 ngồi 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 ... 21/1/2010 Giải thu? ??t phân chia khối Ví dụ Input: Dãy lệnh ba địa Output: Danh sách khối với mã lệnh ba địa khối Phương g pháp: p p Xác định tập lệnh đầu (leader), khối i) Lệnh chương trình lệnh đầu... = * 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... t9 = a[t8] t14 = a[t13] j=j–1 24 x = a[t11] a[t7] = t9 a[t12] = t14 25 t12 = * i 26 t13 = * n 10 t4 = * j 11 t5 = a[t4] Xác định khối 12 if t5 > v goto (9) 27 t14 = a[t13] 13 if i >= j goto (23)