2. Rỳt gọn chương trỡnh sử dụng Đồ thị phụ thuộc chương trỡnh (Program Dependence
2.1 Rỳt gọn chương trỡnh đơn thủ tục
PDG cho chương trỡnh P, kớ hiệu là GP là một đồ thị cú hướng, cỏc đỉnh của nú được nối bởi cỏc loại cung. Cỏc đỉnh của GP biểu diờn cỏc cõu lệnh gỏn và cõu lệnh điều khiển xuất hiện trong chương trỡnh P. GP cú đỉnh đặc biệt gọi là Entry Vertex.
GP là một đa đồ thị, tức là cú thể cú nhiều loại cung nối giữa hai đỉnh. Cỏc cung trong GP biểu diờn cỏc phụ thuộc trong cỏc thành phần của chương trỡnh. Một cung biểu diờn hoặc là phụ thuộc điều khiển (Control
Dependence) hoặc là phụ thuộc luồng (hay còn gọi là phụ thuộc dữ liệu)
(Flow Dependence). Cỏc cung phụ thuộc điều khiển được gỏn nhón là True
hoặc False và gốc của một cung phụ thuộc điều khiển luụn là một Entry Vertex hoặc một đỉnh điều khiển. Một cung phụ thuộc điều khiển từ đỉnh u đến đỉnh v kớ hiệu là ucv cú nghĩa là trong quỏ trỡnh thực thi bất cứ khi nào u được thực thi và giỏ trị của nú trựng khớp với nhón trờn cung đến v khi đú thành phần chương trỡnh được biểu diờn bởi v sẽ được thực hiện nếu chương trỡnh kết thỳc. Xét PDG GP chứa một cung phụ thuộc điều khiển từ đỉnh u đến đỉnh v của GP nếu và chỉ nếu cỏc điều kiện sau được thỏa món:
i. u là Entry Vertex và v biểu diờn một thành phần của P mà thành phần đú khụng nằm trong bất kỡ vòng lặp hoặc vựng lệnh điều kiện nào cả, cung đú được gỏn nhón True.
ii. u biểu diờn một cõu lệnh điều khiển và v biểu diờn một thành phần của P nằm trực tiếp trong vòng lặp hoặc vựng cõu lệnh điều kiện.
Nếu u là điều khiển của vòng lặp while, for khi đú cung ucv được gỏn nhón là true; nếu u là điều khiển của cõu lệnh điều kiện khi đú cung ucv
được gỏn nhón là true hay false tựy thuộc vào v xuất hiện trong nhỏnh then
hay nhỏnh else.
Cỏc cung phụ thuộc luồng của một PDG được xỏc định sử dụng cỏc phõn tớch luồng dữ liệu. Một PDG chứa một cung phụ thuộc luồng từ đỉnh u
i. u là một đỉnh mà tại đú cú định nghĩa một biến x nào đú.
ii. v là một đỉnh mà tại đú cú sử dụng biến x.
iii. Giữa hai đỉnh u và v khụng tồn tại đỉnh nào cú định nghĩa biến x.
Cỏc phụ thuộc luồng cú thể được định nghĩa cụ thể hơn bằng việc phõn loại thành loop carried và loop independent. Một phụ thuộc ufv được mang theo bởi vòng lặp L được kớ hiệu ulc(L)v nếu thỏa món (i),(ii),(iii) và cỏc điều kiện sau:
iv. Cú một đường thực thi (EP) thỏa món (iii) và cú cung quay lui lại phớa cõu lệnh điều khiển.
v. Cả hai u và v đều nằm trong vòng lặp L.
Một phụ thuộc luồng ufv là một loop independent kớ hiệu là uliv nếu thỏa món (i),(ii),(iii), cú một đường thực thi thỏa món (iii) và khụng cú cung quay lui, u và v đều nằm trong vòng lặp.
Với đỉnh s của PDG G, rỳt gọn của G tại đỉnh s kớ hiệu là Slice(G,s) là một đồ thị chứa tất cả cỏc đỉnh trờn đú s cú một phụ thuộc điều khiển hoặc phụ thuộc luồng:
Tập đỉnh:
V(Slice(G,s)) = {v V(G)|v*c,f s}.
Tập cung:
Hỡnh 3.1. Chương trỡnh và Đồ thị phụ thuộc chương trỡnh tương ứng.