4

제 컴파일러 코스에서는 MIPS 아키텍처의 그래프 채색을 기반으로 레지스터 할당자를 작성합니다. 나는 Muchnick의 처치를 다음과 같이 내 구현에 적용하고있다.그래프 채색 레지스터 할당 자

Muchnick은 이러한 할당 자의 함수 인수를 처리하는 방법에 대해 다소 퍼지기가되었습니다.

나는 몇 가지 가정을하고 같은 것을 명확히 할 것이라고 생각했습니다.

  1. 중간 단계 IR에서 낮은 수준의 IR로 변환하려면이 단계가 필요합니다. 중첩 된 함수 호출이 처리되지 않았습니다. 내 생각은 함수 호출을 오른쪽에서 왼쪽으로 스캔하고 가장 안쪽의 호출에 대한 IR을 바깥쪽으로 배치하는 것입니다. 이 방법을 사용하면 인수 레지스터에 처음 몇 개의 인수를 할당하는 MIPS 호출 규칙을 사용할 수 있고 나머지는 최소한의 유출 (단지 1)으로 스택 할 수 있습니다.
  2. 고정 인수 레지스터로 함수 인수를 이동하는 LIR 코드가 처리되는 방식을 다루지 않기 때문에 책에서 병합 처리를 등록하는 것은 나에게 직관적이지 않습니다. 많은 심의를 거친 끝에 필자는 인자 전달 동작에 대해 등록 병합을해서는 안된다는 결론에 도달했습니다.

이러한 가정에 대한 의견/생각은 대단히 감사하겠습니다.

답변

2

나는 당신이 레지스터 할당 이전에 함수 호출 실제 인수에 대해 가상 레지스터에서 인수 레지스터로 (또는 함수 호출 공식 인수는 함수 엔트리에서 복사 된 반대의 경우) 인수 합치기를 위해 등록 병합을하고 싶지 않다고 생각한다.

그러나 이러한 이동을 볼 때 이동 대상 인수 레지스터가 선호되는 할당 자에 대한 힌트를 태그 할 수 있습니다. 선호하는 선택이 적절하게 간섭하지 않을 경우 할당에 사용할 수 있습니다. 할당 후 결과는 move rx,rx으로 나중에 쉽게 삭제할 수 있습니다.

(물론 이러한 힌트가 두 가지 이상 발견 될 수 있으므로 가장 많이 적용되는 힌트 중 하나를 선택하십시오. 대부분의 (경우에 따라 모두) 다른 간섭으로부터 배제됩니다. 루프 등).

(*는 해당 인수 (실수) 레지스터가 가상 레지스터의 수명 동안 다른 방식으로 사용되거나 휴지통에 들어가는 것을 의미합니다 (예 : 중첩 함수 호출 또는 기타). 이를 확인하는 것은 가상 레지스터의 간섭을 검사하는 것만 큼 쉽습니다.))