2009-02-27 3 views
9

스택 머신 (특히 CIL) 용 컴파일러를 만들고 있는데 코드를 기본 블록 그래프로 파싱했습니다. 여기에서 SSA을 메소드에 적용하려고하지만 너무 잘 진행되지는 않습니다. 첫 번째 시도 (그래프보다는 평면 목록으로 작업하는 동안)는 코드를 반복하고 SSA 겹침 (즉, 대상 지정)을 유지하고, 할당을 생성 할 때 밀어 넣고, 그들은 사용됩니다. 이것은 하나의 기본 블록에 대해서는 문제가 없지만 Φ 함수를 생성하는 방법을 이해할 수는 없습니다.SSA (스택 머신 코드)

내가 던져 온 아이디어는 SSA ID에 스택 위치를 첨부 한 다음 코드 경로가 수렴 될 때 스택에 남아있는 내용을 살펴 보는 것이지만 올바른 방법 (Right Way, TM) 일을하는 것.

여러 코드 경로에서 스택 조작을 추적하고 수렴시 충돌을 결정하는 간단한 알고리즘이 있습니까?

+0

컴파일러는 무엇입니까? 나는 똑같은 일을하려고 생각하고있다. –

답변

8

여러 노드 (기본 블록)에 수렴하는 SSA id 세트를 확인해야합니다. 기본 기본 블록 구조를 유지하면 블록의 모든 식별자를 쉽게 사용할 수 있습니다 (예 : 쿼리).

난 당신이 충돌로 무슨 뜻인지 모르겠지만, 나는 당신이

if (bExp)     if (bExp) 
    x := 1     x1 := 1 
else   SSA:  else 
    x := 2     x2 := 2 
y := x;     y := Phi(x1,x2) 

같은 것을 해결하려는 가정이 장소에서 피를 원한다. 실행 코드에 파이가 없다는 것을 깨달으십시오! y가 x1 또는 x2에서 (종속적) 정보를 사용하여 다음 단계에서 다시 쓸 수 있습니다. 예를 들어, 메모리 중심 표현에서 Phi (x1, x2)는 x1과 x2가 동일한 메모리 위치, 즉 y의 두 별칭이어야 함을 알려줍니다. Phi는 정보를 연결합니다.

if (bExp) 
    stackframe[y_index] = 1  (y_index being some offset) 
else 
    stackframe[y_index] = 2 
nop 

희망이 조금 있습니다!

+1

대단히 감사합니다. 나는 이것의 99 %를 가지고 있었지만 어떤 이유로 스택 위치가 충분하지 않은 것으로 보였다. 당신의 대답과 MS Research의 Marmot 컴파일러 논문 사이에, 나는 지금 모든 것을 가지고 있습니다 :) –