문제

스택 머신을위한 컴파일러를 작업 중입니다 (특히 ) 그리고 나는 코드를 기본 블록의 그래프로 구문 분석했습니다. 여기에서 나는 신청하려고합니다 SSA 방법에 대해서는 너무 잘 진행되지 않습니다. 첫 번째 시도 (그래프가 아닌 평평한 목록으로 작업하는 동안)는 코드를 반복하고 SSA ID 스택을 유지하는 것이 었습니다 (즉, 대상 지정 대상의 경우) 그들은 사용됩니다. 이것은 단일 기본 블록에 적합하지만 φ 기능을 처리하는 방법을 알 수는 없습니다.

내가 던지고있는 아이디어는 스택 위치를 SSA ID에 부착 한 다음 코드 경로가 수렴 할 때 여전히 스택에 무엇이 있는지 살펴 보는 것입니다. 그러나 이것은 일을하는 올바른 방법 (TM)처럼 보이지 않습니다.

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

도움이 되었습니까?

해결책

배수를 봐야합니다 SSA ID 세트 노드에서 수렴 (기본 블록). 중간 기본 블록 구조를 유지하십시오. 예를 들어 모든 식별자를 블록에 쉽게 사용할 수 있습니다 (예 : 쿼리).

충돌이 무슨 뜻인지 잘 모르겠지만, 당신이 같은 것을 해결하고 싶다고 생각합니다.

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

즉, 당신은이 장소에서 PHI를 원합니다. 실행 가능한 코드에는 PHI가 없음을 인식하십시오! 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

이것이 조금 도움이되기를 바랍니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top