KR19980086578A - 그래프 컬러링 레지스터 할당기에 대한 지역 문맥 스필링을 위한 시스템 - Google Patents

그래프 컬러링 레지스터 할당기에 대한 지역 문맥 스필링을 위한 시스템 Download PDF

Info

Publication number
KR19980086578A
KR19980086578A KR1019980012749A KR19980012749A KR19980086578A KR 19980086578 A KR19980086578 A KR 19980086578A KR 1019980012749 A KR1019980012749 A KR 1019980012749A KR 19980012749 A KR19980012749 A KR 19980012749A KR 19980086578 A KR19980086578 A KR 19980086578A
Authority
KR
South Korea
Prior art keywords
register
program
symbol
registers
machine
Prior art date
Application number
KR1019980012749A
Other languages
English (en)
Other versions
KR100302980B1 (ko
Inventor
앤드류 윌프레드 맥레오드
Original Assignee
제프리 엘. 포맨
인터내셔널 비지네스 머신즈 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 제프리 엘. 포맨, 인터내셔널 비지네스 머신즈 코포레이션 filed Critical 제프리 엘. 포맨
Publication of KR19980086578A publication Critical patent/KR19980086578A/ko
Application granted granted Critical
Publication of KR100302980B1 publication Critical patent/KR100302980B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/22Microcontrol or microprogram arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/441Register allocation; Assignment of physical memory space to logical memory space

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

컴퓨터 프로그램을 컴파일하는 동안 기계 레지스터를 할당하기 위한 레지스터 할당기가 개시되어 있다. 상기 레지스터 할당기는 간섭 그래프를 수립하는 단계, 그래프 컬러링 기술을 사용하여 상기 그래프를 감소시키는 단계, 컬러(즉, 기계 레지스터를 기호 레지스터에 할당함)를 지정하려는 단계, 및 스필 코드(spill code)를 생성하는 단계를 수행한다. 상기 스필 코드는 명령을 기초하여 기본 블록을 프로세스하는 지역 문맥 스필러(local context spiller)에 의해 생성된다. 상기 지역 문맥 스필러는 상기 기본 블록 내에 프리(free)인 기계 레지스터를 할당하려고 한다. 상기 기본 블록이 임의의 프리 기계 레지스터를 갖지 않으면, 상기 지역 문맥 스필러는 스필링하기 위한 기계 레지스터를 선택하도록 룩 어헤드(look ahead)한다. 상기 레지스터 할당기는 간섭 그래프의 재수립과 상기 그래프 감소 동작의 수를 제한함으로써 컴파일러의 성능을 개선시킨다.

Description

그래프 컬러링 레지스터 할당기에 대한 지역 문맥 스필링을 위한 시스템
본 발명은 컴퓨터 시스템에 관한 것으로, 특히 컴퓨터 프로그램에 사용하는 레지스터를 할당하기 위한 방법에 관한 것이다.
전역(global) 레지스터 할당은 컴파일러 성능의 설계와 최적화에 있어 당면한 문제이다. 그 문제는 다수의 기호 레지스터(symbolic register)를 한정된 소수의 하드웨어 레지스터로 감소시키는 것이다. 이것이 불가능할 때마다, 일부 레지스터들은 메모리에 저장되고 필요할 경우에만 다시 로드(load)되어야 한다. 이들 레지스터들은 스필된(spilled) 레지스터라 불리운다.
대부분의 컴파일러는 그 최적화 방법(procedure) 동안 임의적으로 다수의 레지스터를 가정한다. 사실상 종래에는 프로그램의 각기 다른 계산의 결과에 대하여 서로 다른 기호 레지스터가 할당되었다. 이 때에는 기계 내의 레지스터 중에서 실제, 즉 하드웨어 레지스터를 그 기호 레지스터로 지정(assign)하기 위해 레지스터 할당 방법이 호출되어야 한다. 종래의 방법은 특수 목적을 위해 실제 레지스터의 부세트(subset)를 사용하고 나머지 세트는 문(the statement) 또는 기껏해야 기본 블록(예를 들면, 루프) 내에 지역적으로 할당된다. 상기 할당 중에, 보존해야 할 결과는 일시적으로 저장되고 변수는 다시 로드된다. 이들 방법들은 분명히 동작하지만, 데이터가 메모리 저장부와 레지스터들 간에 운반되거나 또는 반대로 운반되고 데이터가 레지스터를 완전히 바이패스하여 저장부로부터 직접 액세스되거나 저장부로 직접 복원되는 동안 상당한 양의 프로세서(즉, CPU) 시간이 낭비된다는 점에서 그 방법들은 비효율적이다.
그래프 컬러링(coloring)은 컴파일하는 동안 레지스터를 할당하기 위한 공지된 기술이다. 그래프 컬러링 기술은 레지스터 지정 또는 할당 문제가 그래프 컬러링 문제에 대응된다는 관찰에 기초한 것이며, 여기서 각각의 기호 레지스터는 노드에 대응하고 실제, 즉 하드웨어 레지스터는 서로 다른 컬러에 대응한다. 두개의 기호 레지스터는, 양쪽 값 모두가 보유되어야 하는 포인트가 프로그램 내에 한 개 이상 있다는 특성을 가질 때, 그 특성은 그래프 상에 두 노드 간의 정점(vertex) 또는 간선(edge)으로 모델링된다. 따라서 레지스터 할당 문제는 한개의 정점에 의해 접속되어 있는 어떠한 두개의 노드도 동일하게 착색되지 않도록 그래프를 착색하는 문제에 대응된다. 이는 이들 두개의(또는 그 이상의) 노드들 각각이 서로 다른 레지스터에 저장되어야 한다는 말과 같다.
그래프 컬러링을 이용하여 전역 레지스터 할당을 하기 위한 두가지 주요한 방법이 있다. 제1 방법은 그레고리 제이. 채틴에 의한 채틴 스타일 그래프 컬러링(Chaitin style graph colouring)로서 공지되어 있다. 채틴 기술은 라이스 대학의 프레스톤 피. 브리그스에 의해 향상되었다.
채틴 그래프 컬러링 기술에 따르면, 두개의 기호 레지스터들은 그들이 동시에 살아있으면, 즉 값을 포함하면 간섭한다고 말한다. 이는 두개의 기호 레지스터들이 동일한 하드웨어 또는 기계 레지스터를 점유할 수 없다는 것을 의미한다. 레지스터도(the degree of a register)는 그와 간섭하는 다른 레지스터들의 수로서 정의된다.
간섭 그래프를 내장하기 위해 프로그램을 한 번 통과한다. 간섭 그래프는 기호 레지스터들이 상호 간섭하고, 각각의 기호 레지스터가 그래프에서 노드로 표현되는 것을 요약한다. 일단 간섭 그래프가 내장되면, 그래프 감소를 시도한다. 레지스터도가 하드웨어 레지스터의 수, 즉 컬러수 미만인 레지스터는 그래프로부터 제거되어, 감소 스택(reduction stack) 상에 푸시된다. 채틴 기술에 따르면, 노드가 하드웨어 레지스터의 수 미만인 간섭을 가지면, 이 때 노드, 즉 기호 레지스터로 지정될 수 있는 하드웨어 레지스터가 있어야 한다. 노드가 제거될 때, 인접한 모든 레지스터도는 하나씩 감소된다. 그래프가 비워있어, 성공적인 컬러링을 나타내거나, 또는 모든 나머지 노드가 너무 높아 감소되지 않는 레지스터도를 가질 때까지 이 감소 프로세스를 계속 진행한다.
노드가 남아 있으면, 노드들, 즉 기호 레지스터들중 한 노드는 스필(즉, 메모리에 저장)하도록 선택된다. 다양한 휴리스틱(heuristics)이 있고 어떻게 선택되는지는 이 기술 분야에 숙련된 자에게 명백할 것이다. 따라서, 나머지 노드들중 한 노드가 선택되어 스필로 표시되며, 이 때 선택된 노드는 감소 스택 상에 푸시되고, 간섭 그래프로부터 제거된다. 노드(즉, 기호 레지스터)의 수를 더 감소시키도록 하기 위해 나머지 노드를 갖는 그래프에 대해 감소 동작을 반복한다. 그래프가 완전히 감소할 때까지 감소 프로세스를 반복한다. 무수한 기호 레지스터들을 갖는 복잡한 프로그램에서는, 많은 레지스터들이 스필로 표시될 것이다.
일단 감소 동작이 완료되었다면, 기호 레지스터는 컬러(즉, 하드웨어 레지스터)에 지정된다. 초기에는, 각각의 기호 레지스터는 임의의 가용한 컬러 또는 하드웨어 레지스터에 지정될 수 있다. 기호 레지스터는 감소 스택으로부터 제거되고, 각 기호가 제거됨에 따라, 그 레지스터에 대한 최저 가용한 컬러수는 기호에 지정된다. 다음으로 간섭 그래프에서 기호 레지스터의 인접한 모든 레지스터들이 참관되고, 지정된 컬러는 그들의 가용한 색상표(colour list)로부터 제거된다. 이는 간섭하는 임의의 레지스터가 동일한 컬러를 선택하지 못하게 한다.
채틴 기술에 따르면, 일반적으로 감소되었던, 즉 스필되지 않았던 임의의 기호 레지스터는 컬러가 부여된다고, 즉 하드웨어 레지스터에 지정된다고 보증된다. 이러한 기호 레지스터는 검증되었다고 말한다. 반대로, 스필로 표시된 임의의 기호 레지스터는 컬러를 얻지 못한다. 종종 스필로 표시된 기호 레지스터는 컬러로 종료할 것이고, 이는 브리그스에 의해 개발된 낙관적인(optimistic) 방법(approach)이다. 여하튼, 채틴에 따르면, 스필 코드는 컬러가 부여될 수 없는 기호 레지스터를 위해 생성될 필요가 있다.
프로그램을 한 번 더 통과하여, 스필로 표시된 기호 레지스터의 임의의 참조가 메모리 로드 또는 저장으로 대체된다. 이 동작은 스필된 레지스터가 사용되거나 또는 한정되는 매우 지역적인 발생으로 스필된 레지스터의 살아있는 범위를 효과적으로 분할한다는 것을 알 것이다.
일단 스필 코드가 생성되었다면, 새로운 간섭 그래프의 내장으로 시작하여 감소 프로세스를 반복한다. 그래프가 성공적으로 감소할 때까지 사이클을 반복한다. 많은 경우에서, 그래프를 성공적으로 감소, 즉 모든 데이터 항목(즉, 기호 레지스터)을 기계 레지스터와 메모리 저장부에 지정하기 위해 컬러링의 다중 반복(multiple iterations)이 요구된다.
채틴 스타일 그래프 컬러링 기술은 동작이 매우 양호한 것으로 밝혀졌다. 그러나, 채틴 기술이 갖는 문제점은 가용한 기계 레지스터가 있는 것보다 보존될 데이터 항목이 더 많이 있을 경우 발생한다. 상술된 바와 같이, 데이터 항목(즉, 기호 레지스터)이 기계 레지스터의 수를 초과할 경우, 메모리로의 기호 레지스터의 스필링이 필요하게 된다.
유효한 스필 코드의 생성은 사소한 것이 아니다. 채틴에 따른 방법(approach)은 메모리로의 로드가 스필된 기호의 각 사용 포인트에서 송출되는 것을 필요로 했다. 이 방법에 따르면, 연속 명령에서 기호 레지스터의 두번 사용이 있다면, 메모리 로드를 한번만 수행하고, 모든 명령들에서 데이터 항목을 사용하는 것이 바람직하다. 유사하게, 기호 레지스터의 두번 사용이 서로 아주 근접하면, 메모리 로드를 한번 수행하고 데이터 항목을 다시 사용하는 것이 유리하다. 채틴 방법에 따르면, 재사용된 스필의 살아있는 범위가 연장됨에 따라, 컬러링의 다른 패스(pass)를 필요로 할 새로운 간섭이 발생될 위험이 있다.
대부분의 프로그램들은 높은 레지스터 압축을 갖는 '핫 스폿(hot spots)'을 가질 것이다. 이들은 데이터 항목(즉, 기호 레지스터)이 대부분 스필링되게 하는 프로그램 내의 영역들이다. 기호 레지스터가 스필되도록 선택될 때, 기호 레지스터와 어떠한 간섭도 없는 다른 영역에 어디든지 레지스터가 스필된다. 이는 인위적인 전역 스필링이다. 어떠한 지역 정보도 레지스터의 개별 사용, 단지 전역 간섭 그래프에 대해서는 가용하지 않다.
레지스터 할당을 개선하기 위해, 몇몇 방법이 이 기술 분야에서 개발되어 왔다.
재구체화(Rematerialization)는 기호 레지스터의 값이 메모리로부터 데이터 항목의 로드 대신에 재계산되는 공지된 한가지 방법이다. 재구체화는 스필될 필요가 있는 메모리 저장의 수를 감소시킨다.
다른 방법은 간섭 또는 플로우 그래프를 파티션하는 단계와 다른 파티션을 분리해서 착색하는 단계를 포함한다. 이 방법은 스필링의 전역 효과를 감소시키려고 하여, 그 결과 기호 레지스터가 한 파티션에 스필하면, 레지스터는 다른 파티션에는 스필할 필요가 없다. 이 방법은 동작가능하지만, 통상적으로 파티션을 브릿징하기 위한 패치-업(patch-up) 코드의 문제가 발생한다.
또 다른 방법으로, 레지스터 세트는 두 그룹, 즉 전역 및 지역 레지스터로 분할된다. 전역 기호 레지스터는 전역 하드웨어 레지스터에 지정된 다음, 나머지 레지스터를 지정하기 위해 지역 할당이 수행된다. 이 방법은 동작가능하지만, 모든 레지스터들이 가용하지 않기 때문에 항상 최적의 우수한 전역 할당이 되지는 않는다.
또 다른 방법에 따르면, 살아있는 범위의 분할은 컬러링(즉, 감소) 프로세스 전에 수행된다. 이 방법으로, 프로그램에서 고압축(high pressure) 또는 핫(hot) 영역에 오래 살아있는 범위를 갖는 임의의 레지스터가 진입하기 전에 저장되고 영역으로 벗어난 후 로드된다. 이는 레지스터(들)가 고압축 영역에서 다른 레지스터로 나타나게 한다.
채틴/브리그스에 따른 그래프 컬러링 방법은 매우 효과적인 것으로 검증되었다. 많은 방법이 어떠한 저장-로드 동작도 일시적으로 저장부 내의 결과를 유지할 필요가 없도록 착색(colour)한다는 것이 경험에 의해 나타났다. 한편, 채틴/브리그스는 다량의 컴파일 시간을 필요로 한다.
따라서, 적은 계산 시간을 필요로 하고, 또한 스필링 문제에 대해 우수한 방법을 제공하는 레지스터 할당기가 필요하게 된다.
본 발명은 그래프 컬러링을 이용하여 레지스터를 할당하기 위한 방법을 제공하고 개선된 스필 코드를 생성하기 위한 지역 문맥 스필링을 제공한다. 이 레지스터 할당 방법은 종래의 간섭 그래프 감소와 그래프 컬러링 기술에 필요한 계산 강화 동작을 감소시킨다는 점에서 유리하다.
본 발명에 따른 방법은 간섭 그래프를 수립하는 단계, 그래프 감소를 수행하는 단계, 스필을 선택하는 단계, 컬러를 지정하려는 단계, 및 스필 코드를 생성하는 단계를 구비한다.
본 발명에 따르면, 컬러(즉, 하드웨어) 레지스터가 감소 스택으로부터 제거된 기호 레지스터에 지정될 수 없는 경우, 그 레지스터는 당분간 스킵되고 레지스터 할당 방법을 계속 진행하고, 가급적 많은 레지스터를 착색할려고 한다. 컬러 없이 남아있는 기호 레지스터는 스필된 레지스터를 표현한다. 착색된 기호 레지스터는 현재 하드웨어 레지스터에 수행된다. 그 다음 패스가 프로그램을 통해 이루어지고, 착색된 레지스터의 모든 참조는 적절한 하드웨어 레지스터로 대체된다. 프로그램은 현재 대부분 하드웨어 레지스터로서 나타나지만, 스필된 임의의 기호 레지스터는 그 본래 기호, 즉 레지스터가 변화되지 않았던 것으로서 여전히 나타난다. 레지스터 할당 방법에서 다음 단계는 지역 문맥 스필러(local context spiller)를 호출하는 단계를 포함한다. 지역 문맥 스필러는 프로그램을 통해 단계별로 진행하고 스필된 기호 레지스터에 대한 하드웨어 레지스터를 지정하려고 한다. 모든 하드웨어 레지스터들이 프로그램에서 사용되기 때문에, 가용한 임의의 레지스터가 있으면, 거의 아무것도 없는 많은 지점이 있을 것이다. 레지스터는 그래프 컬러링 기술을 사용하여 가급적 잘 지정될 것이다. 부가적인 감소 패스의 수행 대신에, 본 발명에 따른 방법은 지역 문맥 스필러를 호출한다. 본 발명의 이 특징에 따르면, 지역 문맥 스필러는 프로그램을 프로세스하고 하드웨어 레지스터를 기본 블록의 문맥 내에 있는 스필된 기호 레지스터에 지정한다. 각각의 기본 블록인 경우, 지역 문맥 스필러는 임의의 가용한 하드웨어 레지스터를 찾으며, 가용하다면, 레지스터는 기호 레지스터에 지정된다. 기본 블록이 임의의 가용한 하드웨어 레지스터를 갖지 않으면, 지역 문맥 스필러는 스필되어 있는 하드웨어 레지스터를 선택한 다음 기호 레지스터에 지정된다.
하나의 특징으로, 본 발명은 고급 수준의 원시 코드(source code) 프로그램을 기계 실행가능한 프로그램으로 변환하며, 상기 고급 수준의 원시 코드를 중간 언어(intermediate language)로 번역하기 위한 최적화기를 포함하는 컴파일러 -상기 프로그램에 대한 기억 필요 조건(storage requirement)이 복수의 기호 레지스터들로서 규정됨- 에 대한 레지스터 할당 방법에 있어서, (a) 상기 프로그램에 대한 간섭 그래프를 생성하는 단계; (b) 그래프 감소 기술의 적용을 통해 상기 간섭 그래프를 감소시키는 단계; (c) 스필링 없이 그래프 컬러링 기술을 통해 기계 레지스터를 상기 프로그램에 할당하는 단계; (d) 상기 그래프 컬러링 기술을 사용하여 할당되지 않았던 레지스터를 할당하기 위해 지역 문맥 스필링을 적용하는 단계를 구비하되, (e) 상기 지역 문맥 스필링은 상기 중간 언어 프로그램의 섹션 내에 하나 이상의 프리 기계 레지스터(one or more free machine registers)를 결정하는 단계와, 상기 프로그램으로 상기 프리 기계 레지스터를 기호 레지스터에 할당하는 단계, 및 섹션이 프리 기계 레지스터를 갖지 않는다고 결정될 때, 스필링하기 위한 기계 레지스터를 선택하는 단계와 상기 선택된 기계 레지스터를 스필하기 위해 상기 프로그램을 명령하기 위한 스필 코드를 생성하는 단계를 구비하는 레지스터 할당 방법을 제공한다.
제2 특징으로, 본 발명은 상기 원시 코드를 중간 언어 프로그램으로 번역하기 위한 파서(parser) -상기 프로그램에 대한 기억 필요 조건은 복수의 기호 레지스터들로서 규정됨- ; 상기 중간 언어 프로그램의 동작을 최적화하기 위한 최적화기; 상기 중간 언어 프로그램으로 기호 레지스터를 기계 레지스터에 재기록하기 위한 레지스터 할당기; 및 상기 재기록된 중간 언어 프로그램으로부터 기계 실행가능한 프로그램을 생성하기 위한 코드 생성기를 구비하되, 상기 레지스터 할당기는 상기 중간 언어 프로그램에 대한 간섭 그래프를 생성하기 위한 수단, 상기 간섭 그래프에서 기호 레지스터의 수를 감소시키기 위한 그래프 감소 수단, 및 스필링 없이 기계 레지스터를 상기 기호 레지스터에 할당하기 위한 그래프 컬러링 수단을 갖고, 상기 레지스터 할당기는 기계 레지스터를 상기 그래프 컬러링 수단에 의해 할당되지 않은 기호 레지스터에 할당하기 위한 지역 문맥 스필러를 더 포함하되, 상기 지역 문맥 스필러는 상기 프로그램의 섹션에 프리 기계 레지스터(free machine register)의 가용성을 판정하기 위한 수단과, 상기 프리 기계 레지스터를 상기 기호 레지스터에 할당하기 위한 수단을 구비하고, 상기 지역 문맥 스필러는 상기 프로그램의 섹션이 임의의 프리 기계 레지스터를 갖지 않는 경우 스필링하기 위한 기계 레지스터를 선택하기 위한 수단을 더 포함하는, 고급 수준의 원시 코드 프로그램을 기계 실행가능한 프로그램으로 변환하기 위한 컴파일러를 제공한다.
또 다른 특징으로, 본 발명은 고급 수준의 원시 코드 프로그램을 컴파일하여 기계 실행가능한 프로그램을 생성하는 컴퓨터 시스템에서 사용하기 위한 컴퓨터 프로그램 제품에 있어서, 기록 매체; 및 상기 컴퓨터 시스템을 명령하기 위하여 상기 매체 상에 기록되는 수단을 구비하되, 상기 수단은 (a) 상기 고급 수준의 원시 코드를 중간 언어 프로그램으로 번역하는 단계 -상기 프로그램에 대한 기억 필요 조건은 복수의 기호 레지스터들로서 규정됨-, (b) 상기 중간 언어 프로그램의 동작을 최적화하는 단계; (c) 상기 중간 언어 프로그램으로 기호 레지스터를 기계 레지스터에 재기록하는 단계; (d) 상기 재기록된 중간 언어 프로그램으로부터 기계 실행가능한 프로그램을 생성하는 단계를 수행하되, (e) 상기 기호 레지스터를 기계 레지스터로 재기록하는 단계는 상기 프로그램에 대한 간섭 그래프를 생성하는 단계, 그래프 감소 기술의 적용을 통해 상기 간섭 그래프를 감소시키는 단계, 스필링 없이 그래프 컬러링 기술을 통해 기계 레지스터를 상기 프로그램에 할당하는 단계, 상기 그래프 컬러링 기술을 사용하여 할당되지 않았던 레지스터를 할당하기 위해 지역 문맥 스필링(local context spilling)을 적용하는 단계를 구비하되, 상기 지역 문맥 스필링은 상기 중간 언어 프로그램의 섹션에 하나 이상의 프리 기계 레지스터(free machine register)를 결정하는 단계와, 상기 프로그램으로 상기 기계 레지스터를 기호 레지스터에 할당하는 단계, 및 섹션이 프리 기계 레지스터를 갖지 않는다고 결정될 때, 스필링하기 위한 기계 레지스터를 선택하는 단계와 상기 선택된 기계 레지스터를 스필하기 위해 상기 프로그램을 명령하기 위한 스필 코드를 생성하는 단계를 구비하는 컴퓨터 프로그램 제품을 제공한다.
도 1은 본 발명에 따른 레지스터 할당기를 일체화하는 컴파일러를 도시한 블록도.
도 2는 본 발명에 따른 지역 문맥 스필링(local context spilling)으로 레지스터를 할당하기 위한 방법을 형성하는 고급 수준의 플로우차트.
도 3은 도 2의 방법에 대한 명령을 프로세싱하기 위한 방법 단계를 도시한 상세한 플로우차트.
도 4는 도 3의 프로세싱의 일부로서 기호 레지스터에 대한 하드웨어 레지스터를 선택하기 위한 방법 단계를 도시한 상세한 플로우차트.
* 도면의 주요부분에 대한 부호의 설명
1 : 컴파일러
2 : 파서
4 : 최적화기(optimizer)
6 : 레지스터 할당기
8 : 코드 생성기
지금부터 예로써, 본 발명의 바람직한 실시예를 도시한 첨부한 도면을 참조하여 설명한다.
우선 본 발명에 따른 레지스터 할당기를 이용하는 컴파일러(1)를 도시한 도 1을 참조한다. 컴파일러(1)는 포트란(Fortran) 또는 C와 같이 사람이 판독가능한 프로그래밍 언어로 기록된 문(즉, 원시 코드)을 판독하는 프로그램을 포함하고, 그들을 기계-판독가능한/실행가능한 프로그램으로 번역한다. 도시되어 있는 바와 같이, 컴파일러(1)는 4개의 주요 구성 요소 또는 모듈, 즉 파서(2), 최적화기(4), 레지스터 할당기(6), 및 코드 생성기(8)를 포함한다.
파서(2)는 원시 코드를 컴파일러(1)가 알 수 있는 중간 언어(IL)로 번역한다. 최적화기(4)는 중간 언어에 대한 다양한 최적화 동작을 수행하여 컴파일된 코드의 실행 성능을 개선한다. 레지스터 할당기(6)는 중간 언어 프로그램으로 생성된 기호 레지스터를 타겟 기계(컴퓨터) 상에 정의된 하드웨어 레지스터에 다시 기록한다. 코드 생성기(8)는 중간 언어의 명령을 타겟 기계를 위한 실행가능한 명령으로 번역하고 실행가능한 프로그램을 생성한다. 이하에 상세히 설명될 바와 같이, 본 발명은 레지스터 할당기(6)에 관한 것이다. 파서(2), 최적화기(4) 및 코드 생성기(8)의 세부사항은 이 기술 분야의 숙련자의 이해 범위 내에 있어 추가 설명은 필요하지 않다.
레지스터 할당기(6)는 중간 언어 IL 프로그램으로 기호 레지스터를 타겟 기계 상의 실제 하드웨어 레지스터에 할당하기 위한 방법을 포함한다. 기호 레지스터는 기존 원시 코드 프로그램의 데이터 항목에 대응한다. 일단 기호 레지스터가 할당되었다면, 중간 언어 프로그램은 코드 생성기(8)에 의해 실행가능한 프로그램으로 번역된다(도 1).
본 발명에 따른 레지스터 할당을 위한 방법(10)을 도시한 도 2를 참조한다. 레지스터 할당 방법(10)은 두가지 주요 구성 요소, 즉 그래프 컬러링 구성 요소(11)와 지역 문맥 스필러(12)를 포함한다.
도 2에 도시되어 있는 바와 같이, 레지스터 할당 방법(10)에서 제1 단계(블록 14)는 간섭 그래프를 내장하는 단계를 포함한다. 다음으로 단계 16에서, 간섭 그래프는 채틴-브리그스에 따른 표준 감소 기술을 사용하여 감소된다. 간섭 그래프가 완전히 감소될 수 없으면(판정 블록 18), 그 다음 단계 20에서 기호 레지스터는 스필하기 위해 선택되고, 그래프 감소 단계 16을 반복한다.
일단 간섭 그래프가 감소되었다면(단계 18), 단계 22에서 다음의 동작은 기호 레지스터를 하드웨어 또는 기계 레지스터에 지정하는 단계(즉, 컬러링)를 포함한다. 본 발명의 이러한 특징에 따르면, 감소 스택으로부터 제거된 기호 레지스터가 착색, 즉 하드웨어 레지스터에 지정될 수 없으면, 기호 레지스터는 스킵되고 스필된 레지스터로서 표시된다. 프로세스는 감소 스택에 있는 나머지 레지스터에 대해서도 계속 진행한다. 단계 22에서 레지스터 지정 동작의 완료시, 가급적 많은 기호 레지스터가 하드웨어 레지스터에 지정, 즉 착색될 것이고, 미지정된 레지스터는 스필된 기호 레지스터를 포함할 것이다. 이 단계에서, 착색된 기호 레지스터는 하드웨어 레지스터로 수행된다. 다음으로 단계 24에서, 프로그램(즉 중간 언어)을 통해, 착색된 기호 레지스터의 참조는 대응하는 하드웨어 레지스터로 대체된다.
단계 24에서 재기록 명령의 완료시, 중간 언어 프로그램은 주로 하드웨어 레지스터로 나타나지만, 스필된 임의의 기호 레지스터는 그 본래 기호 형태로 여전히 나타날 것이다. 단계 26에서, 방법(10)은 스필된, 즉 메모리 내의 저장을 위해 할당된 기호 레지스터를 체크한다. 스필된 기호 레지스터는 본 발명에 따른 문맥 스필러(12)에 의해 처리된다. 지금부터 설명될 바와 같이, 문맥 스필러(12)는 지역을 기초로 하여(상술된 감소 프로세스에서 전역을 기초로 하는 것 대신에) 스필된 기호 레지스터를 하드웨어 레지스터에 지정한다.
지역 문맥 스필러(12)는 중간 언어 코드로 한번에 단일 기본 블록 상에서 동작한다. 기본 블록은 단일 입구점과 단일 출구점을 갖는 코드의 섹션으로서 정의된다. 지역 문맥 스필러(12)는 각각의 하드웨어 레지스터의 내용을 모델링하고, 레지스터가 IL 코드로 기본 블록의 입구에서 살아있다는 것을 근거로 하여 레지스터는 초기화된다.
각각의 하드웨어 레지스터는 3가지 상태, 즉 (1) FREE, (2) INUSE, 또는 (3) SYMBOLIC중 하나의 상태일 수 있다. FREE 상태는 미사용중인 하드웨어 레지스터를 가리킨다. INUSE 상태는 그래프 컬러링 동작에 의해 지정된 활동값을 갖는 하드웨어 레지스터를 가리킨다. SYMBOLIC 상태는 특정 기호 레지스터의 값을 현재 보유하는 하드웨어 레지스터를 나타낸다. 초기에 기본 블록인 경우, 하드웨어 레지스터는 FREE 상태이거나 또는 INUSE 상태이다.
살아있는 레지스터를 추적하기 위해, 지역 문맥 스필러(12)는 명령으로 기본 블록을 프로세스하여 하드웨어 레지스터 활동의 다이나믹 모델을 생성시킨다. 기본 블록에 임의의 주어진 명령에서, 다이나믹 모델은 하드웨어 레지스터가 프로그램에 의해 사용되고 있고, 보다 중요하게는 하드웨어 레지스터가 사용되지 않고 있다는 것을 보여준다. 설명될 바와 같이, 미사용된 하드웨어 레지스터는 필요에 따라 기호 레지스터를 로드 및 저장하기 위해 이용된다.
기본 블록에 있는 각각의 명령을 프로세싱하기 위한 지역 문맥 스필러(12)에 의해 수행되는 단계를 보다 상세히 도시한 도 3을 참조한다. 우선 단계 30에서, 문맥 스필러(12)는 명령에서 명시적으로 참조되는 하드웨어 레지스터를 점유하고 있는 기호 레지스터를 플러시(flush)한다. 다음으로 단계 32에서, 문맥 스필러(12)는 기호 사용을 위한 하드웨어 레지스터(들)를 선택한다. 단계 34에서, 문맥 스필러(12)는 죽은(dead) 하드웨어 레지스터를 프리한다. 또 다른 명령으로 레지스터를 다시 정의하기 전에 최종 사용, 즉 레지스터가 다시 정의되기 전에 하드웨어 레지스터에 포함된 값이 다시 사용되지 않는 동안에, 하드웨어 레지스터는 죽게 된다. 단계 34에서 지역 문맥 스필러(12)는 레지스터의 상태를 FREE로 변경한다. 다음으로 단계 36에서, 문맥 스필러(12)는 명령에서 명시적으로 참조된 하드웨어 레지스터 정의를 점유하고 있는 기호 레지스터를 플러시한다. 단계 38에서, 문맥 스필러(12)는 기호 정의에 대한 하드웨어 레지스터를 선택한다. 마지막으로 단계 40에서, 문맥 스필러(12)는 임의의 죽은 레지스터 정의를 프리한다.
문맥 스필러(12)는 기본 블록에 각 명령에 대해 도 3에 도시되어 있는 프로세싱 단계를 반복한다. 명령 프로세싱의 결과는 기본 블록에 대한 하드웨어 레지스터 활동의 다이나믹 모델이다.
지역 문맥 스필러(12)에 의해 수행되는 다음 동작은 하드웨어 레지스터를 기호 레지스터로 지정하고 있다.
문맥 스필러(12)가 먼저 명령을 조사할 때, 스필러(12)는 명령에 대한 사용을 판정한다. 기호 레지스터가 출회(encounter)되면, 기호값은 메모리로부터 하드웨어 레지스터로 로드되고 그 하드웨어 레지스터는 이 명령에서 사용된다. 사용을 프로세싱한 후, 문맥 스필러(12)는 정의를 프로세스하고 기호 레지스터가 출회되면, 기호는 하드웨어 레지스터에 주어지고 그 값은 메모리에 저장된다.
기호에 대한 하드웨어 레지스터를 선택하는 경우, 문맥 스필러(12)는 우선 FREE(즉 아무것에도 사용되지 않음)인 하드웨어 레지스터를 지정하려고 한다. FREE 하드웨어 레지스터가 가용하면, 스필러(12)는 레지스터를 SYMBOLIC 상태로 진행시키고, 그 레지스터를 기호 레지스터와 연관시킨다. 다음으로, 스필로부터 하드웨어 레지스터로의 로드가 송출되고, 명령에 대한 기호는 하드웨어 레지스터로 대체된다.
문맥 스필러(12)가 명령으로 하드웨어 레지스터의 실제 사용을 출회할 때, 하드웨어 레지스터는 INUSE 상태로 이동된다. 하드웨어 레지스터가 이미 SYMBOLIC 상태에 있었다면, 다음에 레지스터는 더이상 기호 레지스터와 연관되지 않을 것이다.
문맥 스필러(12)가 기본 블록에 있는 명령을 통해 단계별로 진행함에 따라, FREE 레지스터는 SYMBOLIC 레지스터로 천천히 변환된다는 것을 알 것이다. 문맥 스필러(12)는 하드웨어 레지스터와 이미 연관된 기호 레지스터를 출회하면(즉 하드웨어 레지스터가 SYMBOLIC 상태에 있고 기호 레지스터와 연관되면), 스필러(12)는 기호 참조를 하드웨어 레지스터로 대체한다. 스필로부터의 어떠한 로드도 요구되지 않고 스필러(12)는 가능할 때마다 스필 재사용을 실현한다.
기호 레지스터의 정의가 출회되고 기호가 죽게 될 때까지(즉 최종 사용까지) 하드웨어 레지스터 내에 남아 있으면, 이 때 메모리로의 본래 저장은 또한 회피되고 스필된 레지스터는 제거되었다. 그러나, 프리 하드웨어 레지스터수는 제한된다. 문맥 스필러(12)는 기호 레지스터의 최종 사용을 결정함으로써 FREE 하드웨어 레지스터를 제공하려고 한다. 기호 레지스터의 최종 사용이 출회될 때, 문맥 스필러(12)는 하드웨어 레지스터를 FREE 상태로 이동시킨다.
그러나 더이상 FREE 하드웨어 레지스터가 없는 경우의 상황이 있을 것이다. 이것이 발생하는 경우, 문맥 스필러(12)는 모든 하드웨어 레지스터를 SYMBOLIC 상태로 보고, SYMBOLIC 상태의 하드웨어 레지스터들중 하나의 레지스터를 꺼내어 사용한다. (SYMBOLIC 하드웨어에 대한 선택 프로세스가 이하에 설명된다.) 실질적인 규정으로, 이 방법은 하드웨어 레지스터에 있는 가능한 기호의 재사용이 제거되지만, 하드웨어 레지스터는 새로운 기호 레지스터에 가용하게 된다는 것을 의미한다.
모든 하드웨어 레지스터가 INUSE에 있는 상황에서, 문맥 스필러(12)는 하드웨어 레지스터를 스필할 것이다. (종래의 컴파일러에서, 이러한 발생은 본래 반복 프로세스의 다중 패스를 유발시킬 것이다.) 문맥 스필러(12)는 하드웨어 레지스터들중 하나의 레지스터를 선택하여 그 하드웨어 레지스터의 내용을 새로운 스필 위치에 저장한다. 하드웨어 레지스터는 이와 같이 기호 레지스터를 위해 사용된다. 하드웨어 레지스터가 다소 떨어져 있을 수 있는 그 다음 사용까지 스필된 코드로 재로드될 필요가 없기 때문에, 문맥 스필러(12)는 하드웨어 레지스터를 스필되게 한다. 그 결과, 문맥 스필러(12)는 하드웨어 레지스터에 대한 다음 사용이 출회될 때까지 기호에 사용될 수 있는 하드웨어 레지스터를 하나 더 얻었다.
임의의 스필된 하드웨어 레지스터가 기본 블록의 종료로 인해 다시 로드되지 않았다면, 이 때 문맥 스필러(12)는 어떠한 사용이 없더라도 스필된 하드웨어 레지스터를 다시 로드한다. 하드웨어 레지스터가 또 다른 기본 블록으로 사용되므로, 하드웨어 레지스터가 그 교정값으로 로드되게 하는 것이 바람직하다.
기호 레지스터에 대한 하드웨어 레지스터를 선택하기 위한 프로세싱 단계(도 3에서 단계 38)가 도 4를 참조하여 요약될 수 있다. 우선 문맥 스필러(12)는 기호값(즉 레지스터)이 단계 42에서 이미 하드웨어 레지스터에 있는지의 여부를 판정한다. 만약 예이면, 이 하드웨어 레지스터를 사용한다(단계 44). 기호 레지스터가 이미 하드웨어 레지스터에 없다면, 이 때 문맥 스필러(12)는 기호 레지스터에 대한 하드웨어 레지스터를 찾을 필요가 있다. 단계 46에서, 문맥 스필러(12)는 일련의 유효한 하드웨어 레지스터를 얻는다. 다음으로 단계 48에서, 스필러(12)는 값을 포함한 리스트로부터 하드웨어 레지스터, 즉 USE 또는 SYMBOLIC인 하드웨어 레지스터를 제거한다. 가용한 하드웨어 레지스터가 있다면(단계 50), 이 때 문맥 스필러(12)는 기호 레지스터를 위해 이 레지스터를 사용한다(단계 52). 어떠한 가용한 하드웨어 레지스터도 없다면, 이 때 문맥 스필러(12)는 이미 SYMBOLIC 상태에 있는 하드웨어 레지스터들중 하나의 레지스터를 사용할 필요가 있을 것이다. 단계 54에서, SYMBOLIC 하드웨어 레지스터는 가용한 하드웨어 레지스터의 리스트 상에 역으로 추가된다. 다음으로 단계 56에서, 문맥 스필러(12)는 가용한 하드웨어 레지스터의 리스트로부터 가용한 레지스터가 있는지의 여부를 판정한다. 가용한 레지스터가 있다면, 문맥 스필러(12)는 기호 레지스터를 위해 그 레지스터를 사용한다(단계 58). 레지스터가 가용하지 않으면, 이 때 문맥 스필러(12)는 하드웨어 레지스터를 스필하고 기호 레지스터를 위해 스필된 레지스터를 사용할 필요가 있다(단계 60).
문맥 스필러(12)가 스필될 하드웨어 레지스터의 선택(즉 도 4에서 단계 60)에 있어 많은 방법들을 사용할 수 있지만, 하드웨어 레지스터의 선택은 중요할 수 있다. 예를 들면, 일부 명령들 만이 떨어져 있는 하드웨어 레지스터를 사용하면, 다시 레지스터는 재로드되어야 할 것이다. 따라서, 본 명령으로부터 가장 멀리 있는 명령이 참조된 기호로 하드웨어 레지스터를 선택하는 것이 바람직하다.
상술된 바와 같이, 지역 문맥 스필러(12)는 기본 블록에 있는 레지스터의 다이나믹 모델(예를 들어 리스트)을 생성한다. 기본 블록에 있는 명령을 프로세싱하는 동안, 스필러(12)는 레지스터가 사용, 정의, 또는 죽은 사용뿐만 아니라 참조되는 것을 결정한다. 이 정보는 이와 같이 명령에 대해 요약되어 메모리에 저장된다. 현재 명령에 선행하는 많은 명령들에 대한 레지스터 정보를 요약하고 저장함으로써, 계산 시간이 가까운 시일내에(아무튼 레지스터 사용이 고려되는 한) 증가되지 않는다고 확정할 수 있다.
룩-어헤드(look-ahead) 요약에 따르면, 지역 문맥 스필러(12)는 하드웨어 레지스터를 프리하기 위해 대체할 기호값에 대해 보다 유식한 판정을 할 수 있다. 요약을 사용하여, 문맥 스필러(12)는 기호의 다음 사용이 요약 내에는 존재되지 않는 기호를 대체한다. 스필러(12)는 또한 다가오는 참조를 갖는 하드웨어 레지스터 내에 상주하는 기호를 대체하기 위해 선택할 수 있다. 기호가 참조되기 전에 하드웨어 레지스터의 이 참조가 발생하면, 이 때 기호는 아무튼 그 포인트에서 대체되어야 할 것이다.
유사하게, 룩-어헤드 요약은 또한 문맥 스필러(12)가 스필할 레지스터를 선택하게 한다. 스필러(12)는 사용을 알 수 없거나, 또는 첫번째 사용이 가장 멀리 있는 하드웨어 레지스터를 스필하기 위해 선택한다.
상술된 바와 같이, 지역 문맥 스필러(12)는 초기에 기본 블록에 대한 입구 상에 살아있는 정보를 얻고 각각의 하드웨어 레지스터를 FREE 또는 INUSE 상태로 설정한다. 한 블록의 출구에서 그 다음 입구까지 정보를 전달하기 위해, 기본 블록은 영역-순서로 프로세스된다. 이 기술 분야의 숙련자에 의해 알 수 있는 바와 같이 영역-순서는 백 에지(back edge)는 제외하고, 기본 블록의 모든 전임자(predecessor)들이 블록 자체를 프로세싱하기 전에 참관된다는 것을 의미한다.
이 방법은 모든 전임자 출구 상태의 MERGE로 기본 블록 이스테이트(istate)의 초기화를 허용한다. 더우기, 플로우를 가로질러 스필이 다시 사용될 수 있다. 따라서, 모든 로드가 이와 같이 제거되면, 이 때 저장도 제거될 수 있다. 따라서, 하드웨어 레지스터가 임의의 전임자에 대해 INUSE이면, INUSE이며, 하드웨어 레지스터가 모든 전임자에 대해 SYMBOLIC이면, SYMBOLIC이고, 모든 경로에서 동일한 기호와 연관되며, 다른 경우라면, 하드웨어 레지스터는 FREE이며, 하드웨어 레지스터가 모든 전임자에 대해 FREE이면, FREE이다.
정의를 프로세싱하는 동안에, 바로 스필하기 위해 저장을 송출하는 것 대신에, 문맥 스필러(12)는 현재의 저장을 갖는 것으로서 하드웨어 레지스터를 표시하여, 위치를 표시하지만, 저장을 송출하지는 않는다. 기호 레지스터가 하드웨어 레지스터 내에 있는 또 다른 기호 레지스터에 의해 대체될 때, 스필러(12)는 현재의 저장 플래그가 설정되는지의 여부를 체크하고, 설정되면, 스필러는 이 때 스필하기 위해 저장을 송출한다. 기본 블록 종료시에도 동일한 사실로 나타난다. 현재의 저장이 플래그되게 하는 하드웨어 레지스터에 있는 기호 레지스터는 스필할 저장이 송출되게 해야 한다. 이는 모든 로드가 제거되었기 때문에 문맥 스필러(12)가 불필요한 임의의 저장을 송출하지 못하게 한다.
전형적으로, 프로그램은 다양한 포지션을 점유할 수 있는 레지스터에 대한 한계를 가질 일부 명령을 포함할 것이다. 사용 위치는 매우 종종 정의 위치보다 더 제한적이다. 기호에 대한 하드웨어 레지스터를 찾는 경우, 문맥 스필러(12)는 유효한 레지스터 세트를 필요로 한다. 초기에는, 모든 하드웨어 레지스터는 유효하지만, 현재 명령의 프로세싱으로부터 결정되는 한계에 의해 그 수가 감소될 것이다. 룩-어헤드 특징에 따르면, 문맥 스필러(12)는 또한 다음 사용이 있는 곳을 알 수 있고 이 정보에 따라 레지스터 세트는 다음 사용에 존재하는 한계(들)에 근거하여 더 트림(trim)된다.
다음의 의사-코드는 상술된 명령 프로세싱 및 하드웨어 선택 알고리즘을 코딩하기 위한 안내를 제공한다. 의사-코드는 C++ 프로그래밍 언어에 근거한다.
도 3을 참조하여 상술된 바와 같이, 명령 프로세싱 알고리즘은 한번에 단일 명령을 프로세스한다. 이하에 나타난 의사-코드(pseudo-code) 구현시, 동작의 순서는 중요하다. 명령 프로세싱 알고리즘의 루틴은 다음을 포함한다.
process_hw_kill(hwreg) - 이 루틴은 reg를 INUSE 상태로 되게 한 다음, FREE로 되게 한다. 이는 메모리에 포스(force)될 reg를 사용한 임의의 기호 레지스터가 된다.
process_hw_use(hwreg) - 이 루틴은 reg를 INUSE 상태로 이동시킨다. 기호 레지스터가 reg를 사용하고 있으면, 메모리에 포스된다. 하드웨어 레지스터가 이전에 INUSE 상태에 있지 않았다면, 레지스터는 스필되어서, 스필로부터 로드가 송출되어야 한다.
process_sr_use(srreg) - srreg가 하드웨어 reg에 있으면, 루틴은 이 명령을 위해 그 레지스터를 사용하려고 한다. 그럴 수 없으면, 루틴은 FALSE로 복귀한다. srreg가 레지스터에 있지 않으면, 루틴은 레지스터를 찾아 그를 사용하기 위해 명령을 다시 기록할 것이다.
process_end_range(srreg) - 이 루틴은 죽은 사용이라 불리운다. 이 사용후, 하드웨어 레지스터 reg는 FREE 상태로 이동된다.
process_hw_def(hwreg) - 이 루틴은 하드웨어 레지스터 hwreg를 INUSE로 이동시킨다. reg를 사용하는 임의의 기호는 메모리에 포스될 것이다.
process_sr_def(srreg) - 현재의 저장 플래그의 설정 이외에, 이 루틴은 process_sr_use(ssreg)와 동일한 기능을 수행한다.
void SymRegModel : : process(PlSummary pl) {
int x, index;
srobj sr;
rewrite.work_on(pl); // 이는 사용자가 수정할 Pl이다.
// 1 - 모든 HW 죽이기가 regs에 있는 것을 확인한 다음, 프리한다(기호를
플러시함)
for (x=0; xpl.num_kills(); ++x) {
sr=pl.kill(x);
if (sr.is_hwreg()) {
index=sr.index() - sr.rclass().hw_index(0);
process_hw_kill(regs(index));
}
}
// 2 - 모든 HW 사용을 regs로 넣고, 그들을 LIVE한다(기호를
플러시함).
for (x=0; xpl.num_uses(); ++x) {
sr=pl.use(x);
if (sr.is_hwreg()) {
index=sr.index() - sr.rclass().hw_index(0);
process_hw_use(regs(index));
}
}
// 3 - 레지스터 내의 모든 SR 사용에 대해 그들을 송출하려고 시도한다.
// SR이 메모리에 있거나, 또는 현재 레지스터가 고장이면, 스택 상에
푸시한다.
for (x=pl.num_uses() -1; x=0; --x) {
sr=pl.use(x);
if (!sr.is_hwreg()) {
if (symtab(sr).in_memory())
temp.push(x);// 메모리에 있으면 사용의 인덱스를 푸 시한다.
else
if (!process_sr_use(sr)) // 가급적 현재 reg를 사용
하여 재기록한다.
temp.push(x);// 현재 reg가 고장이면 사용의
인덱스를 푸시한다.
}
}
// 4 - 스택 temp는 지금 메모리에 있는 모든 레지스터를 포함하며, 그들을
위한 하드웨어 레지스터를 찾을려고 시도한다.
while (!temp.empty()) {
sr=pl.use(temp.pop());
process_sr_use(sr);
}
// 5 - 지금 모든 DEAD 사용을 프로세스하여 그들을 프리할 필요가
있다.
// 기호가 또한 def이면, 동일한 레지스터가 def에 사용되도록 그를
// 살아남게 한다.
// 즉, opcode r200=r200,1은 r200를 위해 동일한 reg를 사용하고 싶어
한다.
for (x=0; xpl.num_uses(); ++x) {
sr=pl.use(x);
if (!pl.dead_use(x)) // 죽은 사용에만 관심이 있다.
continue;
if (!sr.is_hwreg()) {
int isadef=FALSE;
for (int y=0; ypl.num_defs(); y++) { // 사용이 또한 def인
지를 본다.
if (sr==pl.def(y)) {
isadef=TRUE;
break;
}
}
if (isadef) // def이면 프리하는 것을 스킵한다.
continue;
}
process_end_range(sr);
}
// 6 - 모든 HW defs를 살아남게 한다(기호를 메모리에 포스함).
for (x=0; xpl.num_defs(); ++x) {
sr=pl.def(x);
if (sr.is_hwreg()) {
index=sr.index() - sr.rclass().hw_index(0);
process_hw_def(regs(index));
}
}
// 7 - reg에 있는 모든 기호 defs에 대하여, 현재 reg를 사용하여 재기록을
시도한다.
for (x=pl.num_def() - 1; x=0; --x) {
sr=pl.def(x);
if (!sr.is_hwreg()) {
if (symtab(sr).in_memory())
temp.push(x);// 메모리에 있으면 def의 인덱스를 푸
시한다.
else
if (!process_sr_def(sr)) // 가급적 현재 reg를 사용하여 다시 기록한다.
temp.push(x);// 현재 reg가 고장이면 def의
인덱스를 푸시한다.
}
}
// 8 - 스택 temp는 지금 메모리에 있는 모든 레지스터를 포함하며, 그들을
// 위한 하드웨어 레지스터를 찾으려고 시도한다.
while (!temp.empty()) {
sr=pl.def(temp.pop());
process_sr_def(sr);
}
// 9 - 마지막으로, 모든 죽은 def를 살아나지 않게 한다.
for (x=0; xpl.num_def(); ++x) {
sr=pl.def(x);
if (!pl.dead_def(x)) // 죽은 사용에만 관심이 있다.
continue;
process_end_range(sr);
}
rewrite.replace_pl(); // 필요한 경우 다시 기록한다.
}
도 4를 참조하여 상술된 기호 레지스터에 대한 하드웨어 레지스터를 선택하기 위한 방법을 구현하기 위한 예시적인 의사-코드가 다음과 같이 제공된다.
HWReg TrueOracle : :choose_hwreg(SymRegister reg) {
int num_regs=model.reg_class().num_regs();
BitVect valid(num_regs);
PlObj pl=curr -pl(); // 이는 명령어이다.
int bufdex, x;
hwstat st;
pl.valid_regs(reg, valid); // 명령으로부터 유효한 레지스터 마스
크를 얻는다.
bufdex=GET_BUFFER_INDEX(reg); // 다음 발생을 알 수 있
으면
if (bufdex !=NO_BUFFER_INDEX) { // 그들을 포함하기 위해 유
효한 마스크를 갱신한다.
plsum.first_ref_pl(reg).valid_regs(reg, valid, FALSE); // 제한
}
BitVect try_these(valid);
for (x=0; xnum_regs; x++) // 프리하지 않은 레지스터를 제거한다.
if (model(x).status() !=HW_FREE)
try_these(x)=0;
x=try_these.first_one(); // 이것이 =0이면 이때 적어도 하나는 있다
if (x=0)
return(choose_free(reg, try_these))
// 어떠한 프리 레지스터도 가용하지 않아서, 지금 hwreg에 있는 이들 기호 를 시도한다.
try_these=valid; // 가용한 마스크를 본래로 리셋한다.
for (x=0; xnum_regs; x++) {
st=model(x).status();
if (st !=HW_SYMBOLIC)
try these(x)=0;
}
x=try_these.first_one(); // 이것이 =0이면, 이 때 적어도 하나는 있다.
if (x=0) {
x=choose_ditch_sym(reg, try_these); // 기호를 얻기 위해 try_these
if (x=0) { // 기호를 얻으면
return(model(x)); // 레지스터를 복귀시킨다.
}
}
// 그렇지 않으면, 어떠한 프리 reg도 없고 어떠한 기호도 없어(여하튼 프
// 리하고 싶은 것이 아무것도 없음), HW reg를 스필해야 한다.
// 기호를 갖는 모든 regs를 제거한다(그 레지스터를 다시 사용하는 것은
// 좋지 않다고 이미 결정하였음)
// 그리고 역시 이들 선택으로부터 전용 레지스터를 제거하게 한다.
// 스필링 grl(sr_rauto)는 양호하지 못한 것이다.
// 그래서 전용 레지스터에 있을 것이다.
try_these.ORvec(reg.rclass().dedicated());
try_these.NEGvec(); // 지금 모든 NON_SYMBOLIC 레지스터의 마스크
valid.ANDves(try_these);
return(choose_spill_hw(reg, valid));
}
본 발명은 공지되어 있는 채틴 스타일 할당기를 통해 주목할 만한 개선을 제공한다는 것을 알 것이다. 레지스터가 스필될 필요가 있는 경우, 동일한 레지스터가 표시될 수 있고, 컬러링의 또 다른 패스는 결코 없기 때문에, 문맥 스필러(12)는 순수 채틴 컬러러(colourer)보다 스필 코드를 결코 더 생성하지 말아야 한다. 채틴 기술에 따르면, 하드웨어 레지스터의 스필링은 컬러링의 또 다른 패스와, 적어도 하나 더 전역 레지스터의 스필링을 필요로 한다. 대조적으로, 단지 하드웨어 레지스터가 블록에서 가용하지 않으면, 본 발명에 따른 지역 문맥 스필러(12)는 단지 하드웨어 레지스터를 위해 단지 로드를 하나 더 및 저장을 하나 더 도입한다.
본 발명의 또 다른 장점은 스필링이 지역을 기초로 하고 지역 지식으로 행해지기 때문에 스필 코드의 생성 방법에 대해 훨씬 우수한 판정을 할 수 있다는 것이다.
본 발명에 따른 레지스터 할당을 일체화하는 컴파일러의 컴파일 시간은 훨씬 우수한 경향이 있다. 레지스터 할당 방법은 단지 그래프 컬러러의 한 패스 만을 수행하여, 이로 인해 간섭 그래프를 재내장하지 못하고, 다중 그래프 감소를 수행한다. 간섭 그래프와 그래프 감소 동작의 내장으로 알고리즘의 계산적으로 강한 부분을 포함하므로, 이들 동작들이 수행되는 시간수의 감소는 컴파일 시간을 개선시킨다.
본 발명의 또 다른 장점은 레지스터 할당 방법이 시퀀스를 '팬 아웃(fan out)'하는 경향이 있다는 것이다. 상술된 바와 같이, 문맥 스필러(12)는 가급적 프리 레지스터를 선택하려고 하여, 항상 모든 하드웨어 레지스터에 있는 값을 유지하려고 하는 경향이 있다. 이는 스필 코드의 직렬화를 방지하는데 도움이 된다. 직렬화는 동일한 하드웨어 레지스터가 일련의 스필 명령을 통해 사용되는 경우 발생한다.
본 발명은 그 사상 또는 기본 특성에서 벗어나지 않고 다른 특정 형식으로 실시될 수 있다. 따라서, 현재 기술된 실시예는 예시적인 것이고 그에 제한되지 않으며, 따라서 전술한 설명 이외에 첨부한 청구범위에 의해 나타낸 발명의 범위 및 특허 청구범위와 균등한 의미와 범위 내에서 오는 모든 변화가 여기에 내포되도록 의도된다.

Claims (7)

  1. 고급 수준의 원시 코드(source code) 프로그램을 기계 실행가능한 프로그램으로 변환하며, 상기 고급 수준의 원시 코드를 중간 언어(intermediate language)로 번역하기 위한 최적화기를 포함하는 컴파일러 -상기 프로그램을 위한 기억 필요 조건(storage requirements)이 복수의 기호 레지스터들로서 규정됨- 에 대한 레지스터 할당 방법(register allocation procedure)에 있어서, (a) 상기 프로그램에 대한 간섭 그래프를 생성하는 단계, (b) 그래프 감소 기술의 적용을 통해 상기 간섭 그래프를 감소시키는 단계, (c) 스필링(spilling) 없이 그래프 컬러링(colouring) 기술을 통해 기계 레지스터를 상기 프로그램에 할당하는 단계 및 (d) 상기 그래프 컬러링 기술을 사용하여, 할당되지 않았던 레지스터를 할당하기 위해 지역 문맥 스필링(local context spilling)을 적용하는 단계를 구비하되, 상기 지역 문맥 스필링은 상기 중간 언어 프로그램의 섹션 내에 하나 이상의 프리 기계 레지스터(free machine registers)를 결정하는 단계와, 상기 프로그램으로 상기 프리 기계 레지스터를 기호 레지스터로 할당하는 단계, 및 섹션이 프리 기계 레지스터를 갖지 않는다고 결정될 때, 스필링하기 위한 기계 레지스터를 선택하는 단계와 상기 선택된 기계 레지스터를 스필하기 위해 상기 프로그램을 명령하기 위한 스필 코드를 생성하는 단계를 구비하는 것을 특징으로 하는 레지스터 할당 방법.
  2. 제1항에 있어서, 상기 지역 문맥 스필링 단계는 상기 그래프 감소 동작의 하나의 반복(iteration) 후에 수행되는 것을 특징으로 하는 레지스터 할당 방법.
  3. 제2항에 있어서, 상기 지역 문맥 스필링 단계는 어느 기계 레지스터가 상기 프로그램의 섹션으로 스필링하도록 선택되는가를 결정하기 위한 룩-어헤드(look-ahead) 동작을 포함하는 것을 특징으로 하는 레지스터 할당 방법.
  4. 고급 수준의 원시 코드 프로그램을 기계 실행가능한 프로그램으로 변환시키기 위한 컴파일러에 있어서, 상기 원시 코드를 중간 언어 프로그램으로 번역하기 위한 파서(parser) -상기 프로그램에 대한 기억 필요 조건은 복수의 기호 레지스터들로서 규정됨-, 상기 중간 언어 프로그램의 동작을 최적화하기 위한 최적화기(optimizer, 상기 중간 언어 프로그램으로 기호 레지스터를 기계 레지스터에 재기록하기 위한 레지스터 할당기(register allocator) 및 상기 재기록된 중간 언어 프로그램으로부터 기계 실행가능한 프로그램을 생성하기 위한 코드 생성기(code generator)를 구비하되, 상기 레지스터 할당기는 상기 중간 언어 프로그램에 대한 간섭 그래프를 생성하기 위한 수단, 상기 간섭 그래프에 기호 레지스터의 수를 감소시키기 위한 그래프 감소 수단, 및 스필링 없이 기계 레지스터를 상기 기호 레지스터에 할당하기 위한 그래프 컬러링 수단을 갖고, 상기 레지스터 할당기는 기계 레지스터를 상기 그래프 컬러링 수단에 의해 할당되지 않은 기호 레지스터로 할당하기 위한 지역 문맥 스필러를 더 포함하되, 상기 지역 문맥 스필러는 상기 프로그램의 섹션에 프리 기계 레지스터(free machine register)의 가용성(availability)을 판정하기 위한 수단과, 상기 프리 기계 레지스터를 상기 기호 레지스터로 할당하기 위한 수단을 구비하고, 상기 지역 문맥 스필러는 상기 프로그램의 섹션이 임의의 프리 기계 레지스터를 갖지 않는 경우 스필링하기 위한 기계 레지스터를 선택하기 위한 수단을 더 포함하는 것을 특징으로 하는 컴파일러.
  5. 제4항에 있어서, 상기 지역 문맥 스필러는 스필링하기 위한 최적의 기계 레지스터를 룩 어헤드(look-ahead)하고 어세스(assess)하기 위한 룩-어헤드 수단을 포함하는 것을 특징으로 하는 컴파일러.
  6. 고급 수준의 원시 코드 프로그램을 기계 실행가능한 프로그램으로 변환시키기 위한 컴파일러에서, 상기 컴파일러가 고급 수준의 원시 코드 프로그램을 중간 언어 프로그램으로 번역하기 위한 파서(parser)를 포함하되, 상기 프로그램에 대한 기억 필요 조건은 복수의 기호 레지스터들로서 규정되며, 상기 중간 언어 프로그램으로 기호 레지스터를 기계 레지스터에 재기록하기 위한 개선점(improvement)을 구비하는 레지스터 할당기에 있어서, 상기 중간 언어 프로그램에 대한 간섭 그래프를 생성하기 위한 수단, 상기 간섭 그래프에 기호 레지스터의 수를 감소시키기 위한 그래프 감소 수단, 스필링 없이 기계 레지스터를 상기 기호 레지스터로 할당하기 위한 그래프 컬러링 수단 및 상기 그래프 컬러링 수단에 의해 할당되지 않은 기호 레지스터로 기계 레지스터를 할당하기 위한 지역 문맥 스필러(local context spiller)를 구비하되, 상기 지역 문맥 스필러는 상기 프로그램의 섹션에 프리 기계 레지스터(free machine register)의 가용성을 판정하기 위한 수단과, 상기 프리 기계 레지스터를 상기 기호 레지스터로 할당하기 위한 수단을 포함하고, 상기 지역 문맥 스필러는 상기 프로그램의 섹션이 임의의 프리 기계 레지스터를 갖지 않을 때 스필링하기 위한 기계 레지스터를 선택하기 위한 수단을 더 포함하는 것을 특징으로 하는 레지스터 할당기.
  7. 고급 수준의 원시 코드 프로그램을 컴파일하여 기계 실행가능한 프로그램을 생성하는 컴퓨터 시스템에 사용하기 위한 컴퓨터 프로그램 제품에 있어서, 기록 매체 및 상기 컴퓨터 시스템을 명령(instruct)하기 위하여 상기 매체 상에 기록되는 수단을 구비하되, 상기 수단은 (a) 상기 고급 수준의 원시 코드를 중간 언어 프로그램으로 번역하는 단계 -상기 프로그램에 대한 기억 필요 조건은 복수의 기호 레지스터들로서 규정됨- , (b) 상기 중간 언어 프로그램의 동작을 최적화하는 단계, (c) 상기 중간 언어 프로그램으로 기호 레지스터를 기계 레지스터에 재기록하는 단계 및 (d) 상기 재기록된 중간 언어 프로그램으로부터 기계 실행가능한 프로그램을 생성하는 단계를 수행하되, 상기 기호 레지스터를 기계 레지스터에 재기록하는 단계는 상기 프로그램에 대한 간섭 그래프를 생성하는 단계, 그래프 감소 기술의 적용을 통해 상기 간섭 그래프를 감소시키는 단계, 스필링 없이 그래프 컬러링 기술을 통해 기계 레지스터를 상기 프로그램으로 할당하는 단계, 상기 그래프 컬러링 기술을 사용하여 할당되지 않았던 레지스터를 할당하기 위해 지역 문맥 스필링(local context spilling)을 적용하는 단계를 구비하되, 상기 지역 문맥 스필링은 상기 중간 언어 프로그램의 섹션에 하나 이상의 프리 기계 레지스터(free machine register)를 결정하는 단계와, 상기 프로그램으로 상기 프리 기계 레지스터를 기호 레지스터로 할당하는 단계, 및 섹션이 프리 기계 레지스터를 갖지 않는다고 결정될 때, 스필링하기 위한 기계 레지스터를 선택하는 단계와 상기 선택된 기계 레지스터를 스필하기 위해 상기 프로그램을 명령하기 위한 스필 코드를 생성하는 단계를 구비하는 것을 특징으로 하는 컴퓨터 프로그램 제품.
KR1019980012749A 1997-05-22 1998-04-10 그래프컬러링레지스터할당기에대한지역문맥스필링을위한시스템 KR100302980B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CA2,205,797 1997-05-22
CA002205797A CA2205797C (en) 1997-05-22 1997-05-22 A system for local context spilling for graph colouring register allocators

Publications (2)

Publication Number Publication Date
KR19980086578A true KR19980086578A (ko) 1998-12-05
KR100302980B1 KR100302980B1 (ko) 2001-09-22

Family

ID=4160698

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1019980012749A KR100302980B1 (ko) 1997-05-22 1998-04-10 그래프컬러링레지스터할당기에대한지역문맥스필링을위한시스템

Country Status (3)

Country Link
US (1) US6090156A (ko)
KR (1) KR100302980B1 (ko)
CA (1) CA2205797C (ko)

Families Citing this family (47)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060206219A1 (en) 1995-05-30 2006-09-14 Brown David W Motion control systems and methods
US7024666B1 (en) * 2002-01-28 2006-04-04 Roy-G-Biv Corporation Motion control systems and methods
US5691897A (en) * 1995-05-30 1997-11-25 Roy-G-Biv Corporation Motion control systems
US20010032278A1 (en) 1997-10-07 2001-10-18 Brown Stephen J. Remote generation and distribution of command programs for programmable devices
US6367071B1 (en) * 1999-03-02 2002-04-02 Lucent Technologies Inc. Compiler optimization techniques for exploiting a zero overhead loop mechanism
US6317876B1 (en) * 1999-06-08 2001-11-13 Hewlett-Packard Company Method and apparatus for determining a maximum number of live registers
US8032605B2 (en) 1999-10-27 2011-10-04 Roy-G-Biv Corporation Generation and distribution of motion commands over a distributed network
US6523173B1 (en) * 2000-01-11 2003-02-18 International Business Machines Corporation Method and apparatus for allocating registers during code compilation using different spill strategies to evaluate spill cost
US7031798B2 (en) * 2001-02-09 2006-04-18 Roy-G-Biv Corporation Event management systems and methods for the distribution of motion control commands
US7904194B2 (en) 2001-02-09 2011-03-08 Roy-G-Biv Corporation Event management systems and methods for motion control systems
JP3763518B2 (ja) * 2001-05-29 2006-04-05 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイラ、そのコンパイル方法およびプログラム
US20030069998A1 (en) * 2001-08-31 2003-04-10 Brown David W. Motion services protocol accessible through uniform resource locator (URL)
US20030079210A1 (en) * 2001-10-19 2003-04-24 Peter Markstein Integrated register allocator in a compiler
US7278137B1 (en) * 2001-12-26 2007-10-02 Arc International Methods and apparatus for compiling instructions for a data processor
US7240344B2 (en) * 2003-08-13 2007-07-03 Texas Instruments Incorporated Register allocation and code spilling using interference graph coloring
US20060064503A1 (en) 2003-09-25 2006-03-23 Brown David W Data routing systems and methods
US8027349B2 (en) 2003-09-25 2011-09-27 Roy-G-Biv Corporation Database event driven motion systems
US7124271B2 (en) * 2003-10-14 2006-10-17 Intel Corporation Method and system for allocating register locations in a memory during compilation
US7206923B2 (en) * 2003-12-12 2007-04-17 International Business Machines Corporation Method and apparatus for eliminating the need for register assignment, allocation, spilling and re-filling
US7681187B2 (en) * 2005-03-31 2010-03-16 Nvidia Corporation Method and apparatus for register allocation in presence of hardware constraints
US20070038984A1 (en) 2005-08-12 2007-02-15 Gschwind Michael K Methods for generating code for an architecture encoding an extended register specification
US8555270B2 (en) * 2006-04-28 2013-10-08 International Business Machines Corporation Profile-based global live-range splitting
US7650598B2 (en) * 2006-08-09 2010-01-19 National Tsing Hua University Method for allocating registers for a processor
US9507574B2 (en) * 2006-09-28 2016-11-29 International Business Machines Corporation Method, computer program product, and device for selectively allocating memory
US8056067B2 (en) * 2006-09-29 2011-11-08 International Business Machines Corporation Method, computer program product, and device for reducing delays in data processing
US8141062B2 (en) * 2007-01-31 2012-03-20 Hewlett-Packard Development Company, L.P. Replacing a variable in a use of the variable with a variant of the variable
US8180805B2 (en) * 2008-08-25 2012-05-15 Sap Ag Systems and methods for assigning hosts in response to a data query
CA2684226A1 (en) * 2009-10-30 2011-04-30 Ibm Canada Limited - Ibm Canada Limitee Eleminating redundant operations for common properties using shared real registers
US8635233B2 (en) * 2011-06-27 2014-01-21 Microsoft Corporation Techniques to automatically build a language dependency graph for localizable resources
EP3058456A4 (en) * 2013-10-18 2018-01-24 Marvell World Trade Ltd. Systems and methods for register allocation
GB2538237B (en) * 2015-05-11 2018-01-10 Advanced Risc Mach Ltd Available register control for register renaming
US9582255B1 (en) * 2015-08-28 2017-02-28 International Business Machines Corporation Method of splitting register live ranges
US11036546B1 (en) 2019-04-16 2021-06-15 Xilinx, Inc. Multi-threaded shared memory functional simulation of dataflow graph
US10860766B1 (en) 2019-05-23 2020-12-08 Xilinx, Inc. Compilation flow for a heterogeneous multi-core architecture
US10891132B2 (en) 2019-05-23 2021-01-12 Xilinx, Inc. Flow convergence during hardware-software design for heterogeneous and programmable devices
US10802807B1 (en) 2019-05-23 2020-10-13 Xilinx, Inc. Control and reconfiguration of data flow graphs on heterogeneous computing platform
US11113030B1 (en) 2019-05-23 2021-09-07 Xilinx, Inc. Constraints for applications in a heterogeneous programming environment
US10872057B1 (en) 2019-05-23 2020-12-22 Xilinx, Inc. Partitioning in a compiler flow for a heterogeneous multi-core architecture
US11204745B2 (en) 2019-05-23 2021-12-21 Xilinx, Inc. Dataflow graph programming environment for a heterogenous processing system
US11301295B1 (en) 2019-05-23 2022-04-12 Xilinx, Inc. Implementing an application specified as a data flow graph in an array of data processing engines
US10891414B2 (en) 2019-05-23 2021-01-12 Xilinx, Inc. Hardware-software design flow for heterogeneous and programmable devices
US11188312B2 (en) 2019-05-23 2021-11-30 Xilinx, Inc. Hardware-software design flow with high-level synthesis for heterogeneous and programmable devices
US11138019B1 (en) 2019-05-23 2021-10-05 Xilinx, Inc. Routing in a compilation flow for a heterogeneous multi-core architecture
US11615052B1 (en) 2019-05-23 2023-03-28 Xilinx, Inc. Packet identification (ID) assignment for routing network
US11200061B2 (en) * 2019-11-19 2021-12-14 Microsoft Technology Licensing, Llc Pre-instruction scheduling rematerialization for register pressure reduction
US11144319B1 (en) * 2020-07-28 2021-10-12 International Business Machines Corporation Redistribution of architected states for a processor register file
US11496418B1 (en) 2020-08-25 2022-11-08 Xilinx, Inc. Packet-based and time-multiplexed network-on-chip

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4571678A (en) * 1982-11-05 1986-02-18 International Business Machines Corporation Register allocation and spilling via graph coloring
US4656582A (en) * 1985-02-04 1987-04-07 International Business Machines Corporation Generating storage reference instructions in an optimizing compiler
US4782444A (en) * 1985-12-17 1988-11-01 International Business Machine Corporation Compilation using two-colored pebbling register allocation method such that spill code amount is invariant with basic block's textual ordering
US5249295A (en) * 1990-06-20 1993-09-28 Rice University Digital computer register allocation and code spilling using interference graph coloring
US5784066A (en) * 1995-11-22 1998-07-21 International Business Machines Corporation Method and apparatus for using partner information to color nodes in an interference graph within a computer system

Also Published As

Publication number Publication date
CA2205797C (en) 2001-04-24
KR100302980B1 (ko) 2001-09-22
CA2205797A1 (en) 1998-11-22
US6090156A (en) 2000-07-18

Similar Documents

Publication Publication Date Title
KR100302980B1 (ko) 그래프컬러링레지스터할당기에대한지역문맥스필링을위한시스템
Traub et al. Quality and speed in linear-scan register allocation
Kelsey et al. Realistic compilation by program transformation (detailed summary)
US7007271B2 (en) Method and apparatus for integrated instruction scheduling and register allocation in a postoptimizer
US5327562A (en) Method for implementing virtual function tables in a compiler for an object-oriented programming language
US5249295A (en) Digital computer register allocation and code spilling using interference graph coloring
CA2010056C (en) Method for improving the efficiency of arithmetic code generation in an optimizing compiler using machine independent update instruction generation
US6023583A (en) Optimized variable allocation method, optimized variable allocation system and computer-readable memory containing an optimized variable allocation program
US6408433B1 (en) Method and apparatus for building calling convention prolog and epilog code using a register allocator
US8266603B2 (en) Technique for allocating register to variable for compiling
US5367683A (en) Smart recompilation of performing matchup/difference after code generation
DE19945992A1 (de) Dynamisch optimierender Objektcode-Übersetzer zur Architekturemulation und dynamisches optimierendes Objektcode-Übersetzungsverfahren
US5890000A (en) Cooperation of global and local register allocators for better handling of procedures
JP3900476B2 (ja) オブジェクト指向システム
JPH1139167A (ja) 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ
US7096456B2 (en) Method and apparatus for providing dynamically scoped variables within a statically scoped computer programming language
US20040064811A1 (en) Optimal register allocation in compilers
US6421824B1 (en) Method and apparatus for producing a sparse interference graph
US6134708A (en) Program compilation execution system
US7207032B1 (en) Expanding a software program by insertion of statements
JP3871312B2 (ja) プログラム変換方法、これを用いたデータ処理装置及びプログラム
US6139200A (en) Register resource allocation feedback
Sagonas et al. Experimental evaluation and improvements to linear scan register allocation
JP2000010791A (ja) グロ―バルレジスタを初期化するための方法、コンピュ―タプログラム製品及び装置
Johansson et al. Linear scan register allocation in a high-performance erlang compiler

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
LAPS Lapse due to unpaid annual fee