Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Đặt hàm phi khi dựng dạng SSA qua biên thống trị

    Cho CFG gồm nnn khối (111 là khối vào entry, mọi khối đều reachable từ khối 1) và mmm cạnh có hướng.

    Bước 1 — Cây thống trị: tính Dom[b]Dom[b]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)Dom[1] = \{1\}, \qquad Dom[b] = \{b\} \cup \bigcap_{p \in pred(b)} Dom[p] \ (b \ne 1)Dom[1]={1},Dom[b]={b}∪⋂p∈pred(b)​Dom[p] (b=1) khởi tạo Dom[b]={1,…,n}Dom[b] = \{1,\ldots,n\}Dom[b]={1,…,n} với b≠1b \ne 1b=1, lặp đến ổn định. idom[b]idom[b]idom[b] (immediate dominator, b≠1b \ne 1b=1) là phần tử của Dom[b]∖{b}Dom[b] \setminus \{b\}Dom[b]∖{b} có ∣Dom[⋅]∣|Dom[\cdot]|∣Dom[⋅]∣ lớn nhất (vì các dominator của bbb 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 bbb 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 bbb có ≥2\ge 2≥2 tiền tố, với mỗi tiền tố p∈pred(b)p \in pred(b)p∈pred(b): đặt x←px \leftarrow px←p; trong khi x≠idom[b]x \ne idom[b]x=idom[b]: thêm bbb vào DF[x]DF[x]DF[x], rồi x←idom[x]x \leftarrow idom[x]x←idom[x].

    Bước 3 — Đặt hàm ϕ\phiϕ: cho tập SSS các khối mà biến vvv được gán trực tiếp (cho trước). Tính tập tối thiểu PhiPhiPhi các khối cần chèn hàm ϕ\phiϕ cho vvv 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 PhiPhiPhi, thứ tự tăng dần, cách nhau dấu phẩy (không khoảng trắng); nếu rỗng in -.

    Ví dụ

    Input:

    4 4
    1 2
    1 3
    2 4
    3 4
    2
    2 3
    

    (CFG hình thoi: 1→21\to21→2, 1→31\to31→3, 2→42\to42→4, 3→43\to43→4; biến vvv được gán ở khối 2 và khối 3)

    Output:

    4
    
    • Định dạng đầu vào:

      Dòng đầu: n,mn, mn,m (1≤n≤2001 \le n \le 2001≤n≤200, 0≤m≤20000 \le m \le 20000≤m≤2000, đảm bảo mọi khối reachable từ khối 1). mmm dòng "uuu vvv" (cạnh u→vu \to vu→v). Dòng tiếp theo: số nguyên sss (kích thước SSS), rồi sss số nguyên là các khối thuộc SSS.

    • Định dạng đầu ra:

      In 1 dòng: các khối thuộc PhiPhiPhi (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...