Cho CFG gồm n khối (1 là khối vào entry, mọi khối đều reachable từ khối 1) và m cạnh có hướng.
Bước 1 — Cây thống trị: tính Dom[b] bằng lặp điểm bất động chuẩn: Dom[1]={1},Dom[b]={b}∪⋂p∈pred(b)Dom[p] (b=1) khởi tạo Dom[b]={1,…,n} với b=1, lặp đến ổn định. idom[b] (immediate dominator, b=1) là phần tử của Dom[b]∖{b} có ∣Dom[⋅]∣ lớn nhất (vì các dominator của b luôn tạo thành một dây chuyền — chain — theo quan hệ bao hàm, nên phần tử này là duy nhất và gần b nhất).
Bước 2 — Biên thống trị (dominance frontier, thuật toán Cytron et al.): với mỗi nút b có ≥2 tiền tố, với mỗi tiền tố p∈pred(b): đặt x←p; trong khi x=idom[b]: thêm b vào DF[x], rồi x←idom[x].
Bước 3 — Đặt hàm ϕ: cho tập S các khối mà biến v được gán trực tiếp (cho trước). Tính tập tối thiểu Phi các khối cần chèn hàm ϕ cho v bằng closure:
worklist = S; Phi = {}
while worklist không rỗng:
lấy node n ra khỏi worklist
for d in DF[n]:
if d not in Phi:
Phi.add(d); worklist.add(d) # phi tại d cũng là 1 định nghĩa mới của v
In ra danh sách các khối thuộc Phi, thứ tự tăng dần, cách nhau dấu phẩy (không khoảng trắng); nếu rỗng in -.
Input:
4 4
1 2
1 3
2 4
3 4
2
2 3
(CFG hình thoi: 1→2, 1→3, 2→4, 3→4; biến v được gán ở khối 2 và khối 3)
Output:
4
Dòng đầu: n,m (1≤n≤200, 0≤m≤2000, đảm bảo mọi khối reachable từ khối 1). m dòng "u v" (cạnh u→v). Dòng tiếp theo: số nguyên s (kích thước S), rồi s số nguyên là các khối thuộc S.
In 1 dòng: các khối thuộc Phi (tăng dần, cách nhau dấu phẩy) hoặc - nếu rỗng.
Ví dụ:
Đầu vào:
1 0
1
1
Đầu ra:
-
Đầu vào:
4 4
1 2
1 3
2 4
3 4
2
2 3
Đầu ra:
4
Đang tải editor...