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 cho SSA bằng biên trội lặp (Iterated Dominance Frontier)

    Khi chuyển chương trình sang dạng SSA (Static Single Assignment), tại các điểm hợp nhất (join point) của nhiều luồng định nghĩa cùng một biến, trình biên dịch phải chèn một hàm phi (ϕ\phiϕ) để gộp các giá trị đến từ nhiều nhánh. Vị trí cần chèn ϕ\phiϕ cho một biến được xác định chính xác bằng biên trội lặp (Iterated Dominance Frontier — IDF) của tập các khối chứa định nghĩa của biến đó.

    Cho một CFG gồm nnn khối đánh số 1..n1..n1..n (khối 111 là điểm vào, mọi khối đều tới được từ khối 111), và tập SSS gồm kkk khối có chứa định nghĩa của một biến vvv. Hãy tính tập các khối cần chèn hàm ϕ\phiϕ cho vvv, theo thuật toán chuẩn:

    1. Với hai khối a,ba,ba,b: aaa trội (dominate) bbb nếu mọi đường đi từ khối 111 đến bbb đều đi qua aaa (quy ước aaa luôn trội chính nó). aaa trội thực sự bbb nếu aaa trội bbb và a≠ba \ne ba=b.
    2. Biên trội của khối nnn, ký hiệu DF(n)DF(n)DF(n), là tập các khối mmm sao cho tồn tại một cạnh (p→m)(p \to m)(p→m) trong CFG với nnn trội ppp, nhưng nnn không trội thực sự mmm.
    3. Biên trội lặp IDF(S)IDF(S)IDF(S) là bao đóng nhỏ nhất chứa DF(x)DF(x)DF(x) cho mọi x∈Sx \in Sx∈S, và với mọi khối mmm vừa được thêm vào, tiếp tục thêm DF(m)DF(m)DF(m), lặp lại cho đến khi không còn khối mới nào — chính là tập các khối cần chèn hàm ϕ\phiϕ cho biến vvv (lưu ý: một khối s∈Ss \in Ss∈S chỉ được tính là cần ϕ\phiϕ nếu bản thân nó cũng xuất hiện trong bao đóng này).

    Ví dụ: CFG hình thoi 1→21\to21→2, 1→31\to31→3, 2→42\to42→4, 3→43\to43→4, với S={2,3}S=\{2,3\}S={2,3} (biến được định nghĩa ở cả hai nhánh). Khối 4 là điểm hợp nhất của hai nhánh nên DF(2)=DF(3)={4}DF(2)=DF(3)=\{4\}DF(2)=DF(3)={4}, do đó cần chèn ϕ\phiϕ tại khối 4 — kết quả là {4}\{4\}{4}.

    • Định dạng đầu vào:
      • Dòng 1: số nguyên nnn (1≤n≤121 \le n \le 121≤n≤12).
      • Dòng 2: số nguyên mmm — số cạnh có hướng của CFG.
      • mmm dòng tiếp theo: mỗi dòng hai số nguyên u vu\ vu v (1≤u,v≤n1 \le u,v \le n1≤u,v≤n) biểu diễn cạnh u→vu \to vu→v.
      • Dòng tiếp theo: số nguyên kkk (0≤k≤n0 \le k \le n0≤k≤n) — kích thước tập SSS.
      • Dòng cuối: kkk số nguyên là các khối thuộc SSS, cách nhau bởi khoảng trắng (dòng này có thể rỗng nếu k=0k=0k=0, nhưng vẫn luôn tồn tại trong input).
    • Định dạng đầu ra:

      In ra 2 dòng: dòng đầu là số lượng khối cần chèn hàm ϕ\phiϕ; dòng thứ hai liệt kê chỉ số các khối đó theo thứ tự tăng dần, cách nhau bởi khoảng trắng (dòng này có thể rỗng nếu không có khối nào).

    Ví dụ:

    Đầu vào:

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

    Đầu ra:

    1
    4
    

    Đầu vào:

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

    Đầu ra:

    1
    2
    

    Đang tải editor...