KR20020070809A - 포스트-링크 코드 최적화 - Google Patents

포스트-링크 코드 최적화 Download PDF

Info

Publication number
KR20020070809A
KR20020070809A KR1020020009703A KR20020009703A KR20020070809A KR 20020070809 A KR20020070809 A KR 20020070809A KR 1020020009703 A KR1020020009703 A KR 1020020009703A KR 20020009703 A KR20020009703 A KR 20020009703A KR 20020070809 A KR20020070809 A KR 20020070809A
Authority
KR
South Korea
Prior art keywords
code
function
call
instruction
instructions
Prior art date
Application number
KR1020020009703A
Other languages
English (en)
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 KR20020070809A publication Critical patent/KR20020070809A/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/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

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

코드를 최적화하기 위한 방법은 컴파일 및 링크된 목적 코드를 역어셈블하는 단계(disassembling)와, 역어셈블된 코드의 펑션(function) -상기 펑션은 레지스터에 관하여 저장 및 재저장 명령어(restore instruction)를 포함함- 을 확인하는 단계를 포함한다. 역어셈블된 코드는 레지스터를 킬링할(kill) 명령에 잇따르는 펑션에 대해 호출을 찾아내기(locate) 위해 분석된다. 코드는 펑션이 상기 찾아낸 호출에 의해 불려질 때 그 펑션으로부터 저장 명령을 제거시키기 위해 변경된다.

Description

포스트-링크 코드 최적화{Optimizing Post-Link Code}
본 발명은 일반적으로 더 빠른 실행 처리를 달성하기 위해 컴퓨터 코드를 최적화하는 것에 관한 것으로, 특히 코드의 컴파일 및 링크이후의 목적 코드(object code)를 최적화하는 것에 관한 것이다.
포스트-링크 코드 옵티마이저(post-link code optimizer)는 일반적으로정적-링크형 라이브러리 코드(statically-linked library code)를 포함하는 전체 실행 가능 코드에 대한 포괄적 분석(global analysis)을 실행한다. 실행 가능 코드는 재컴파일 및 재링크될 수 없으므로, 포스트-링크 옵티마이저는 컴파일러 및 링커 규칙을 지킬 필요 없다. 그러므로, 그것이 최적화 컴파일러에 이용가능하지 않다는 점에서, 컴파일 유니트에 걸쳐 공격적인 최적화를 수행하게 된다.
이와 동시에, 포스트-링크 옵티마이저는 컴파일-시간 최적화내에서는 만나지 않는 어려움에 대처해야만 한다. 최적화 컴파일러는, 그 의미가 정확하게 정의된 전형적인 소스코드(source code)인, 하이-레벨 랭귀지(high-level language) 서술 형태 입력에 대해 동작한다. 반대로, 정적 포스트-링크 최적화 툴은 그들의 입력으로 로우-레벨 실행 가능 명령어(목적 코드)를 수신한다.
우선 포스트-링크 옵티마이저는 코드에 포함된 데이터 및 명령어를 확인하기 위해 목적 코드를 역어셈블할 시도를 해야 한다. 이하의 이유로 인해, 역어셈블한 후조차, 포스트-링크 옵티마이저에 대해 주어진 실행 가능 코드의 의미는 부분적으로만 알 수 있다.
ㆍ실행 가능 목적 코드내에서의 코드 명령어 및 데이터가 혼합되므로, 몇몇 경우에는 그들 사이의 구별을 불가능하게 만든다. 전형적으로, 데이터나 코드 명령어 중 하나로서 옵티마이저에 의해 모호하지 않게 분류될 수 없는 코드 영역들이 있다. 본 특허 출원에 관련해서, 이러한 영역들은 "비-분류된 코드 영역"으로 칭한다.
ㆍ코드 명령어를 포함하는 것으로 알려진 완전-분류형 코드 영역조차도, 프로그램의 의미가 항상 결정될 수는 없다. 기계 명령어들은 데이터 정보 또는 메모리 위치 중 하나를 포함하는 레지스터를 동작시킨다. 그러므로, 옵티마이저는 소정의 명령어가 순수 데이터 연산을 실행할지, 또는 프로그램 코드내에서 데이터를 검색/저장하거나 제어 전달을 수행하기 위해 프로그램내에 나중에 사용될 주소를 계산하는 지에 관하여는 불확실할 수 있다.
ㆍ어레이, 구조 또는 스칼라와 같은, 데이터 엘리먼트 및 그러한 형태들은, C, C++, Pascal 등과 같은, 하이-레벨 언어에서만 확인될 수 있다. 포스트-링크 코드에서, 이러한 엘리먼트들은 범용 데이터 영역과 같이 나타나며, 그들에 대한 레프런스(reference)는 범용 주소와 같이 처리된다. 그러므로, 포스트-링크 레벨에서, 데이터 엘리먼트에 대한 레프런스가 완전하게 분석될 수는 없다.
이러한 요인들 때문에, 프로그램의 코드 의미는 포스트-링크 코드로부터 결코 완전하게 추출되지 않을 것이고, 프로그램에 사용되는 데이터 및 코드 엘리먼트 사이에서의 약간의 의존성이 불확실하게 남게될 것이다.
하버 등(Haber et al.)은직접 피드백의 처리 및 동적 최적화 워크샵 3(몬트레이, 캘리포니아, 2000년 12월)의 페이지 91-100, "부분 정보를 기초로 인식 가능한 포스트-링크 최적화("Reliable Post-link Optimizations Based on Partial Information")라는 제목의 기사에서 이러한 어려움을 다루기 위한 방법을 설명하고 있으며, 이는 본 명세서의 일부로서 참조된다.
우선, 최적화될 프로그램은 프로그램내에서 분석될 수 있는 모든 제어 흐름 경로를 순차적으로 따름으로써, 기본 블럭으로 역어셈블된다. 기본 블럭들은코드, 데이터 또는 비분류(완전하게 분석되지 않음) 중 하나로 표시된다. 또한, 코 드 블럭은 그들의 제어 흐름 특성에 따라 플래그된다.
부분적으로 분석된 프로그램의 영역은 비분류된 블럭을 포함하도록 범위를 정하고, 반면, 이러한 블럭들이 최적화에 부과하는 제한을 나머지 프로그램으로부터 경감시킨다. 부분적으로 분석된 영역들은 그들이 내부적으로 최적화될 수 없더라도 선택되어서, 여전히 총괄적으로 코드의 재순서화 및 최적화를 허용하기 위해 전체적으로 안전하게 재위치될 수 있다.
포스트-링크 코드 최적화 및 재구조화의 다른 측면은 피드백 직접 최적화에서 제 2워크샵(하이파, 이스라엘, 1999. 11), 페이지 13-20의 "대형 서브시스템에 대한 포스트-링크 최적화에 기초한 피드백"에서 헤니스 등에 의해 설명되고, IBM 시스템 저널 37:2(1998), 페이지 270-297의 "운영 시스템 코드의 프로파일-지향 재구조"에서 슈미디티 등에 의해 설명된다. 이들 간행물들은 본 명세서의 일부로서 참조된다.
특정 레지스터를 이용하는 펑션이 프로그램의 실행처리 중에 호출될 때, 그것은 일반적으로 펑션이 작동을 시작하기 전에 이러한 레지스터들의 내용을 저장하는 (메모리에 저장) 것이 필수적이며, 그 다음 펑션이 복귀될 때 레지스터 내용을 재저장하는 것이 필수적이다. 이러한 취지로, 전형적으로 컴파일러는 컴파일된 코드내에서 펑션의 프롤로그(prolog)에 적절한 저장 명령어를 추가하며, 에필로그(epilog)내에 대응하는 재저장 명령어를 추가한다. 그러나, 펑션에 대한 특정 호출의 경우에, 이러한 저장/재저장 명령어의 일부가 불필요할 수 있다. 예를 들면, 레지스터가 펑션을 호출한 후에 "삭제"될 때(즉, 레지스터 값이 그것을 다시 사용하기 전에 오버라이트(overwrite)될 때), 레지스터 내용을 저장 및 재저장할 필요가 없다. 메모리 억세스(memory access)가 현대의 고속 프로세서에 대한 버틀넥(bottleneck)으로 작용하기 때문에, 실질적으로 이러한 과도한 저장 및 재저장 동작을 제거하는 것이 프로그램 처리 시간을 감소시킬 수 있다.
마틴 등은, 마이크로-30의 처리(리서치 트라이앵글 파크, 노스 캐롤라이나, 1997)에 발표된 "데드 값 정보 개발"에서 데드 레지스터의 저장 및 재저장하는 내용을 제거하는 것에 기반을 둔 컴파일러 최적화의 방법을 설명하며, 이는 본 명세서의 일부로서 참조된다. 레지스터의 미래 사용에 관한 표명(assertion)을 제공하는 데드 값 정보는, 컴파일 시간에 연산된다. 작성자들은 프로세서 명령어 세트 아키텍처(processor instruction set architecture)가 이러한 정보들이 프로세서에 통신되는 것이 가능해지도록 확장된다는 것을 제안한다. 이러한 하드웨어의 제한이 없으므로, 표준 RISC호출 규칙은 여전히 데드 값 정보의 서브세트(subset)가 프로시져 호출과 복귀 시에 저장 및 재저장 동작의 일부를 제거하기 위해 프로세서로 추론되고 사용되는 것을 허용할 것이다.
도 1은 본 발명의 바람직한 실시예에 따른 컴퓨터 프로그램을 처리하기 위한 시스템을 개략적으로 도시한 블럭도이다.
도 2는 본 발명의 바람직한 실시예에 따른 포스트-링크 코드를 최적화하기 위한 방법을 개략적으로 도시한 흐름도이다.
도 3은 본 발명의 바람직한 실시예에 따른 포스트-링크 코드에서 중복 저장 및 재저장 명령어를 제거하기 위한 방법을 개략적으로 도시하는 흐름도이다.
본 발명의 바람직한 실시예는 프로그램 실행을 최적화하기 위해, 과도한 저장 및 재저장 명령어의 포스트-링크 제거(post-link removal)를 위한 방법을 제공한다. 컴파일러-기반형 방법과는 달리, 마틴 등(Martin et al.)에 의해 설명된 방법과 같이, 포스트-링크 최적화는 컴파일 경계를 통해 확인될 데드 레지스터를 가능케 한다. 그러므로, 본 발명의 방법은 일반적으로 최적화 유니트의 범주로 제한되는, 컴파일러 최적화와 달리, 통일된 전체로서 전체 실행 가능 코드를 처리할 수 있으므로, 포괄적인 프로그램 최적화를 가능하게 한다.
더욱이, 최적화 컴파일러가 연결 규칙(linkage convention)에 의해 결합되는 동안, 포스트-링크 옵티마이저는 불필요한 저장 및 재저장 명령어를 제거하는 데 이러한 규칙을 무시할 수 있다. 그러므로 본 발명의 방법은 단지 컴파일-시간 툴만 사용될 때 가능한 것 보다 더욱 완전하게 불필요한 메모리 동작을 제거하기 위해 사용될 수 있다. 게다가, 이러한 방법들은 증여 목적 코드 또는 정적-연결형 목적코드 라이브러리가 실행 가능 코드에 포함될 때의 경우와 같이, 소스 코드가 컴파일-시간 최적화를 이용할 수 없을 때도 코드 최적화에 사용될 수 있다.
본 발명의 바람직한 실시예에서, 포스트-링크 옵티마이저는 코드에서 호출된 펑션을 확인하기 위해 포스트-링크 목적 코드를 역어셈블한다. 그것은 본 분야에서 잘 알려진 최적화 방법과 마찬가지로, 펑션 전체 제어 흐름 그래프를 분석할 필요는 없으며, 단지 그들의 구성 명령어를 결정하면 된다. 전형적으로 각 펑션은 그 펑션에 사용된 레지스터에 대한 저장 및 재저장 명령어를 포함하는 프롤로그 및 에필로그를 갖는다. 본 명세서에서 이러한 레지스터들을 비휘발성 레지스터라고 칭한다. 옵티마이저는 펑션에 대해 호출을 찾기 위해 역어셈블된 코드를 분석하고, 그 다음, 펑션을 복귀시킨 후에 어떠한 비휘발성 레지스터가 킬링되는지(killed)를 판단하기 위해 각 펑션 호출 다음의 명령어를 검사한다. 킬링된다면, 옵티마이저는 킬링된 레지스터에 관하여 프롤로그 및 에필로그 펑션에서 저장 및 재저장 명령어가 펑션에 대한 특정 호출에 대해 필요하지 않는다는 것(또한, 다른 호출에 대해서도 필요하지 않는다는 것)을 판단한다. 다음, 그 펑션이 이 호출에 의해 불려질 때, 적어도 불필요한 저장 명령어와, 적절한 재저장 명령어를 그 펑션으로부터 제거하기 위해 포스트-링크 코드를 변경한다.
본 발명의 바람직한 실시예에서, 옵티마이저는 어떠한 비휘발성 레지스터가 펑션에 대해 어떠한 호출 다음에 제거되는 지를 결정하기 위해, 포스트-링크 코드내에서 소정의 펑션에 대해 다수의 호출을 확인하고 분석한다. 다음, 그 펑션에 대한 최적화 버전을 생성하게 되는데, 이는 모든 삭제된 비휘발성 레지스터에 관해서 저장/재저장 명령어가 제거되는 것으로부터 펑션의 최적화된 것이다. 비휘발성 레지스터 중의 하나를 킬링하는 것이 뒤따르는 펑션에 대한 각 호출에 대해, 옵티마이저는 펑션의 최적화 버전을 호출하는 개별 랩퍼 코드(respective wrapper code)를 생성하며, 펑션 호출을 적절한 랩퍼 코드에 대한 무조건적인 분기로 대체한다. 전형적으로, 랩퍼 코드는 최적화된 펑션에 대한 호출에 선행하며, 특정 펑션 호출 다음에 킬링되지 않는 레지스터의 내용을 저장하는 하나 이상의 저장 명령어와 대응하는 재저장 명령어를 포함하여 최적화 펑션을 따른다. 다시 말하면, 랩퍼는 최적화 펑션의 프롤로그 및 에필로그로부터 제거된 어떠한 저장/재저장 명령의 일부, 펑션에 대한 각 특정 호출에서 필요로 하는 것들만 교체한다.
랩퍼코드 및 최적화된 펑션은 원래 포스트-링크 코드의 끝에 적절하게 추가된다. 그러므로, 원래의 펑션 호출이 랩퍼코드로 분기하라는 명령으로 교체되는 것을 제외하고는 이 단계에서 코드의 몸체 부분에 어떠한 변경도 이루어지지 않는다.
결과적으로, 원래 펑션에 대한 최적화 펑션의 대체는, 완전히 분석될 수 없는 원래 코드의 일부에 존재할 수 있는 어떠한 레퍼런스도 영향받지 않고 유효하게 남아있다는 점에서 전적으로 안전하다. 비록 최적화된 코드가 원래 포스트-링크 코드보다 더 길더라도, 해당 기술에서 공지된 코드 강화와 같은 부가적인 최적화단계가, 이후에 그 코드에 적용될 수 있다.
대안적으로, 저장 명령어가 전술된 바와 같이(또는 펑션의 최적화 버전에서) 분석된 펑션의 프롤로그에 편리하게 정렬되어 있다면, 포스트-링크 코드는 이에 따라 펑션 호출 방향을 재지정함으로써, 불필요한 저장 동작을 간단하게 건너뛰도록 변경될 것이다. 코드를 변경하기 위한 방법은 당업자에 의해 실현될 수 있으며, 본 발명의 범주 내에서 고려될 수 있다.
그러므로, 본 발명의 바람직한 실시예에 따른 코드를 최적화하기 위한 방법이 제공된다. 본 방법은 컴파일 및 링크된 목적 코드를 역어셈블하는 단계와, 상기 역어셈블된 코드내의 펑션 -상기 펑션은 레지스터에 관한 저장 및 재저장 명령어를 포함함- 확인하는 단계와, 상기 레지스터를 킬링하는 명령어가 이어지는 상기 펑션에 대한 호출을 찾아내기 위해 역어셈블형 코드를 분석하는 단계와, 그 펑션이 상기 찾아낸 호출에 의해 불려질 때 그 펑션으로부터 저장 명령어를 제거하기 위해 코드를 변경하는 단계를 포함한다.
바람직하게, 코드를 변경하는 단계는 펑션이 상기 찾아낸 호출에 의해 불려질 때 그 펑션으로부터 재저장 명령어를 제거하기 위해 상기 코드를 변경하는 단계를 더 포함한다.
바람직한 실시예에서, 상기 코드를 변경하는 단계는 저장 명령어를 건너뛰기 위해 상기 찾아낸 호출을 재지정하는 단계를 포함한다. 바람직하게, 코드를 변경하는 단계는 저장 명령어가 제거된 펑션의 최적화 버전을 생성하기 위하여 펑션에 대응하는 상기 코드의 일부를 중복하는 단계를 포함하고, 상기 찾아낸 호출을 재지정하는 단계는 펑션의 최적화 버전의 주소로 상기 호출을 재지정하는 단계를 포함한다.
더 바람직하게, 역어셈블형 코드를 분석하는 단계는 상기 펑션에 대해 다수의 호출을 찾아내는 단계를 포함하고, 상기 찾아낸 호출을 재지정하는 단계는 상기 펑션의 최적화 버전의 주소로 상기 다수의 호출을 재지정하는 단계를 포함한다.
바람직하게 상기 펑션이 다수의 레지스터에 관한 저장 및 재저장 명령어를 포함하고, 다수의 재지정된 호출 각각은 다수의 레지스터 중 적어도 하나를 킬링할 각각의 명령어가 잇따르며, 상기 코드의 일부를 중복시키는 단계는 상기 재지정된 호출 이후에 킬링된 사실상 모든 레지스터에 관한 저장 및 재저장 명령어를 펑션의 최적화 버전으로부터 제거하는 단계를 포함한다.
더 바람직하게, 상기 코드를 변경하는 단계는 다수의 재지정된 호출 중 적어도 하나를 위해 랩퍼 코드 -랩퍼 코드는 킬링된 레지스터 중 적어도 하나에 관한 저장 명령어가 선행되며, 킬링된 레지스터 중 적어도 하나에 관한 재저장 명령어가 잇따름- 를 생성시키는 단계를 포함하고, 펑션의 최적화 버전에 대한 호출을 포함하고, 찾아낸 호출을 재지정하는 단계는 랩퍼코드로 호출을 지정하는 단계를 포함한다. 또한 바람직하게, 상기 랩퍼코드에 상기 호출 방향을 지정하는 단계는 상기 찾아낸 호출을 상기 랩퍼코드로 분기하라는 명령어로 대체하는 단계를 포함한다.
바람직하게, 상기 랩퍼 코드를 생성시키는 단계는 서로 다른 재지정된 호출 에 대해 각각의 랩퍼 코드를 다수 생성시키는 단계를 포함하고, 다수의 호출을 재지정하는 단계는 개별 랩퍼 코드로 서로 다른 호출들을 재지정하는 단계를 포함한다.
더 바람직하게, 어셈블된 코드는 최종 명령어로 끝나는 정해진 순서의 명령어를 포함하고, 상기 코드의 일부를 중복하는 단계는 상기 정해진 순서를 변경하지 않고 상기 최종 명령 이후에 상기 중복된 코드를 부가하는 단계를 포함한다.
대안적인 실시예에 있어서, 역어셈블된 코드는 명령어의 정해진 순서를 포함하고, 상기 코드를 변경하는 단계는 상기 정해진 순서를 변경하지 않고 상기 저장 명령어를 제거하는 단계를 포함한다.
바람직하게, 상기 역어셈블된 코드를 분석하는 단계는 상기 펑션에 대응하는 코드 부분에서 저장 명령어를 확인하는 단계를 포함하며, 상기 찾아낸 호출을 재지정하는 단계는 상기 확인된 저장 명령어를 건너뛰기 위해 호출을 재지정하는 단계를 포함한다.
더 바람직하게, 상기 코드 부분은 상기 펑션의 프롤로그를 포함하고, 상기 코드를 변경하는 단계는 상기 확인된 저장 명령어가 상기 프롤로그의 시작부에 있도록 상기 코드의 일부를 배치하는 단계를 포함하며, 상기 호출을 재지정하는 단계는 상기 확인된 저장 명령어에 이어지는 타겟 주소(target address)로 호출을 지정하는 단계를 포함한다.
다른 실시예에서, 상기 저장 명령어를 제거하는 단계는 상기 저장 명령어를 NOP명령어로 대체하는 단계를 포함한다.
또한 본 발명의 바람직한 실시예 따른, 코드를 최적화하는 장치를 제공한다. 코드를 최적화하는 장치는, 컴파일 및 링크된 목적 코드를 역어셈블하고, 역어셈블형 코드에서 펑션 - 상기 펑션은 레지스터에 관한 저장 및 재저장 명령어를 포함함- 을 확인하고, 레지스터를 삭제할 명령어에 따른 펑션에 대한 호출을 찾아내기 위해 역어셈블된 코드를 분석하고, 펑션이 상기 찾아낸 호출에 의해 불려질 때 펑션으로부터 저장 명령어를 제거하기 위해 코드를 변경하기 위해 마련된 코드 프로세스를 포함한다.
추가적으로, 본 발명의 바람직한 실시예에 따라 컴퓨터 소프트웨어 제품이 제공된다. 컴퓨터 소프트웨어 제품은 컴퓨터에 의해 상기 명령어가 판독될때, 컴파일 및 링크된 목적 코드를 역어셈블하는 명령어와, 상기 역어셈블된 펑션 -상기 펑션은 레지스터에 관한 저장 및 재저장 지시를 포함함-을 확인하는 명령어와, 상기 레지스터를 제거하기 위한 명령어가 잇따르는 상기 펑션에 대한 호출을 찾아내기 위해 상기 역어셈블된 코드를 분석하는 명령어와, 상기 펑션이 상기 찾아낸 호출에 의해 불려질 때 상기 펑션으로부터 상기 저장 명령어를 제거하도록 상기 코드를 변경시키는 명령어를 포함하는 프로그램 명령어가 저장되는 컴퓨터 판독 가능한 저장매체를 포함한다.
본 발명은 도면과 함께 바람직한 실시예의 상세한 설명에 따라 완전하게 이해될 것이다.
도 1은 본 발명의 바람직한 실시예에 따른, 컴퓨터 프로그램 코드를 처리하기 위한 시스템(20)을 개략적으로 도시한 블럭도이다. 시스템(20)은 가능한 한 이하에 설명된 펑션들을 실행하기 위해 프로그램된다., 범용 컴퓨터 프로세서(general-computer processor)를 포함한다. 프로세서는 이러한 목적으로 제공된 소프트웨어의 제어 하에서 이들 펑션을 실행한다. 소프트웨어는 네트워크에 의해서 전자 형태로 프로세서에 다운로드 될 것이며, 또는 예를 들면, 대안적으로 CD-ROM과 같은, 확실한 저장매체상에 마련될 것이다.
시스템(20)은 전형적으로 프로그래머에 의해 작성된 소스 코드(source code)를 수신한다. 컴파일러(compiler:22)는 목적 코드(object code)를 생성하기 위해 소스 코드를 컴파일하고, 링커(linker:24)는 본 분야에 알려진 바와 같이, 라이브러리 코드(library code)를 갖는 컴파일된 코드를 링크한다. 링크된 목적 코드는 중복 저장/재저장 명령어를 제거하기 위해 코드를 분석하고 변경하는 옵티마이저 (optimizer:26)에 공급되는데, 이는 이하에서 구체적으로 설명되는 것과 같다. 그때 최적화된 코드는, 본 분야에 알려진 것과 마찬가지로, 실행-시간 모듈(run-time module:28)에 의해 실행될 수 있다. 비록 모든 펑션(22) 내지 펑션(28)이 시스템(20)내에서 간단하게 실행되는 것처럼 보일지라도, 이러한 펑션들 또한 다른 컴퓨터상에 나눠져서 실행될 수 있다는 것이 인식될 것이다. 그러므로, 본 발명에 중요한 구성요소인, 옵티마이저(26)는, 시스템(20) 외부의 다른 소스로부터 포스트-링크 코드(post-link code)를 수신할 것이며, 실행을 위해 다른 컴퓨터에여전히 최적화된 코드를 전달할 것이다.
도 2는 본 발명의 바람직한 실시예에 따른, 옵티마이저(26)에 의해 실행된 포스트-링크 코드를 최적화하기 위한 방법을 개략적으로 도시하는 플로우챠트이다. 역어셈블 단계(30)에서, 포스트-링크 코드는 코드내의 명령어를 확인하기 위해 역어셈블된다. 본 분야에서 알려진 적절한 방법이 이러한 목적으로 이용될 수 있다. 바람직하게, 예를 들면, 하버 등 및 헤인스 등에 의해 전술된 논술에 설명된 바와 같이, 증분 역어셈블 방법(incremental disassembly method)은 그 기본 블럭 내의 코드를 해석하기 위해 이용된다. 이러한 목적을 위해, 실행 가능 코드내의 명령어의 주소는 "전위 진입점(potential entry point)"의 목록을 형성하기 위해, 다양한 소스로부터 추출된다. 소스는 전형적으로 프로그램/DLL 진입점, 기호테이블(펑션 및 라벨에 대한), 및 재배치 테이블(코드에 대해 포인터가 액세스될 수 있으므로)을 포함한다. 옵티마이저는 모든 가능한 제어흐름 경로를 분석하는 동안 이들 진입점 으로부터 시작하는 제어흐름을 따라감으로써 프로그램을 횡단(traverse)하고, 점프(JUMP) 및 호출(CALL) 명령어의 타겟(target)과 같이, 새롭게 찾은 추가 전위 진입점의 주소를 목록에 더함으로써 프로그램을 변환한다.
이러한 방식으로 프로그램의 제어 흐름을 따르는 것이 코드의 많은 부분(percentage)를 커버한다. 증분식 역어셈블에 의해 직접 찾을 수 없는 기본 블럭은 "비분류 코드(unclassified code)"로 표시된다. 이러한 블럭들은 전형적으로 동작시간(runtime)에만 분석되는 타겟 레지스터(target register)에 의해 점프(jump)를 통해 도달된 코드로 이루어져 있다. 헤니스 등에 의해 서술된 바와마찬가지로, 그것은 종종 코드의 매개 및 동적 동작시간 분석을 이용하는 이러한 블럭들을 분류할 수 있지만, 이러한 방법 설명은 본 특허 출원의 범주를 벗어난다.
증분 역어셈블 프로세서의 끝에서, 원래 프로그램의 전체 코드 섹션은 기본 블럭으로 분석되는데, 분류 또는 비분류된 것 중하나이다. 분류된 블럭들은 플래그로 표시되는데, 이는 블럭들을 (분기 테이블 데이터와 같은) 코드 또는 데이터 중 하나로서 특징지우며, 폴스루(fallthrough), 계속(continue), 호출(call), 복귀(return), 점프(jump) 등과 같은, 코드 블럭들의 제어 흐름 특성을 확인한다. 특히, 펑션 확인 단계(32)에서, 호출 및 리턴 플래그는 코드 내의 펑션 및 펑션 호출을 확인하기 위해 사용된다.
전형적으로, 단계 (32)에서 확인된 각 펑션은 그 펑션에 의해 이용된 특정 레지스터의 내용을 저장한 다음 재저장할 명령어를 포함하는 프롤로그(prolog) 및 에필로그(epilog)를 갖는다. 본 특허 출원의 내용에서, 이들 레지스터들을 "비휘발성 레지스터"로 칭한다. 분석 단계 (34)에서, 각 펑션내의 비휘발성 레지스터들의 처리법은 동작시간에 다시 레프런스되기 전에 펑션에 대한 각 호출에 이어 어느 레지스터가 킬링되는 지를 판단하기 위해 분석된다. 바람직하게는, 레지스터Rx가 프로그램코드내의 펑션에 대한 호출 명령어 다음에 소정의 주소addr에서 킬링될지를 판단하기 위해, 주소 다음에 역어셈블된 코드의 제어흐름이Rx를 킬링할 명령어가 도달될 때까지 추적된다. 이 경우에서Rxaddr에서 킬링되는 것으로 간주된다. 대안적으로, 추적이Rx를 이용한 명령어에 도달하거나, 또는 그 추적이 예를 들면, 조건적인 분기 명령어, 레지스터를 통한 분리, 또는 비분류된 코드 영역에 도달하는 것을 실패하면, 그때Rxaddr에서 삭제되는 것으로 간주될 수 없다.
각 펑션f에 대해서, 분석 단계 (34)가 이하 정보를 결정하기 위해 바람직하게 이용된다.
REG(f)- 펑션f에서 이용된 모든 비휘발성 레지스터의 세트.
KREG(addr,f)- 주소addr -전술된 바와 같이,addrf에 대한 호출 명령어에 따른 주소임- 에서 킬링된REG(f)내의 모든 레지스터의 부세트(sub-set).
OPT(f)- 모든KREG(addr i ,f) -addr i f에 대해 호출 명령어의 뒤에 오는 주소임(즉, 전체 프로그램내의f에 대해 호출 명령어 중 어느 하나의 다음에 킬링된f내의 비휘발성 레지스터의 세트)- 의 결합내의 비휘발성 레지스터 세트.
OPT(f)가 공백이 아닐 때,f의 특정 비휘발성 레지스터가 킬링된 이후에 프로그램내의f에 대해 하나이상의 호출 명령어가 존재한다. 따라서, 코드 변경 단계 (36)에서, 프로그램 코드는 킬링된 레지스터를 위해f내의 중복 저장 및 재저장 명령어를 제거하기 위해 변경된다. 변경은 어떠한 중복 저장 및 재저장 명령어 없이, 펑션f의 코드를 중복함으로써 바람직하게 실행되고, "랩퍼 코드(wrapper code)"내에 저장 및 재저장 명령어가 필수적으로 추가되며, 이하 본 명세서에 설명된다. 대안적으로, 동일한 목적을 달성하기 위해 코드 변경의 다른 방법이 사용될 수 있다.
도 3은 본 발명의 바람직한 실시예에 따른 코드변경 단계 (36)의 세부사항을개략적으로 도시한 흐름도이다. 코드 변경은OPT(f)가 공백이 아닌 프로그램내의 각 펑션f에 실행된다. 우선, 중복단계 (40)에서, 펑션f의 코드는 존재하는 프로그램 코드의 단부에서 바람직하게 중복된다. 이 새로운 중복 펑션은f_opt로 명명된다. 세트 OPT(f)내의 각 레지스터Rx에 대해서, 제거 단계 (42)에서, f_opt의 프롤로그내의Rx의 저장 명령어 및f_opt의 에필로그내의Rx의 저장 명령어가 제거된다
랩핑단계 (44)에서, 랩퍼 코드는 프로그램내의 펑션f에 대한 각 호출 명령어에 대해 생성된다. 이 단계의 목적을 위해,addrf에 대한 호출 명령어에 이은 코드 주소로 둔다.OPT(f)-KREG(addr,f)가 공백이 아닌 것으로 가정함에 따라, 랩퍼 코드는 이하 명령어를 포함할 것이며, 이때{R1,R2,...Rn}Opt(f)-KREG(addr,f)이다.
store R1
store R2
...
store Rn
call f_opt
restore Rn
restore Rn-1
...
restore R1
branch addr
확장단계 (46)에서, 원래 프로그램내의f에 대한 호출 명령어는 위의 랩퍼 코드 에 대해 무조건 분기로 대체된다.OPT(f)-KREG(addr,f)가 공백이면, 그것은f_opt에 대해 직접 호출을 갖는f에 대한 호출 명령어로 대체하기에 충분하다. 다른 한편으로는,KREG(addr,f)가 공백일 때, 원래 프로그램내의f에 대한 호출 명령어가 바뀌지 않고 오히려 남게 된다.
단계 (40)에서 펑션f의 코드를 중복하는 이유는 프로그램이f에 대해 검출되지 않은 호출 명령어를 여전히 포함할 수 있으므로, 프로그램의 정확성을 보전하기 위한 것이다. 이러한 호출 명령어들은, 포스트 링크 코드가 주어지지 않는 라이브러리 또는 다른 실행 가능 코드와 같이, 레지스터에 의하거나 다른 코드 모듈로부터 만들어지므로, 호출은 정적 포스트-링크 분석에 의해 정확하게 검출될 수 없다.f의 비휘발성 레지스터 중 하나를 킬링하는 것에 잇따르는 모든 검출된 호출 명령어들은, 전술한 바와 같이 최적화된 펑션f_opt를 호출하기 위해 재지정된다. 어떤 비휘발성 레지스터를 킬림함으로써 잇따르는 호출 명령어들은 전술된 바와 같이, 변경되지 않고 오히려 남는다. 반대로, 검출되지 않은 호출 명령어는 원래 최적화되지 않은 펑션f에 대한 분기를 유지할 것이므로, 이전의 프로그램의 의미를 유지한다.
이하의 테이블 I는 역어셈블된 포스트-링크 코드의 샘플 목록이며, 몇몇 호출은 펑션foo에 대해 만들어진다. 이 실예를 위해,foo는 이하의 정의에 의해 특성화된다.
ㆍREG(foo) = {R27, R28, R29}
ㆍKREG(L2, foo) = {R27}, KREG(L4, foo) = {}, KREG(L6, foo) = {R28}
ㆍOPT(foo) = {R27, R28} .
이하 테이블에서 좌측 칼럼은 최적화전에 포스트-링크 코드를 나타내는 반면, 우측 칼럼은 적절한 랩퍼코드에 대한 분기를 갖는foo에 대해 두 개의 호출을 대체함으로써 최적화된 후의 코드를 나타낸다.
테이블 I - 코드 비교
최적화 전 최적화 후
Program beginProgram begin
… …
L1 : call fooL1 : branch L7
L2 : R27 is killed here l2 : R27 is killed here
… …
… …
L3 : call fooL3 : call foo
L4 : …/*no non-volatile*/L4 : …/*no non-volatile*/
…/*regs of foo are*/ …/*regs of foo are*/
…/*killed here*/ …/*killed here*/
… …
L5 : call fooL5 : branch L8
L6 : R28 is killed here L6 : R28 is killed here
… …
… …
function foo :function foo :
Prolog : Prolog :
store R27 store R27
store R28 store R28
store R29 store R29
… …
Epilog : Epilog :
store R29 store R29
store R28 store R28
store R27 store R27
returnreturn
… …
Program end
L7 : store R28 /*wrapper*/
/*code 1*/
call foo_opt/*redi-*/
/*rected call*/
restore R28
branch L2
L8 : store R27 /*wrapper*/
/*code 2*/
call foo_opt/*redi-*/
/*rected call*/
restore R27
branch L6
function foo_opt :
prolog :
store R29
/*store R27, R28*/
/*removed*/
Epilog :
restore R29
/*restore R27, R28*/
/*removed*/
return
Program end
바람직하게는, 전술된 최적화를 실행한 다음, 코드-스트라이트닝(code-straightening) 알고리듬은 랩퍼코드 전체에 걸친 무조건적인 분기를 제거하기 위해 생성된 코드를 이용한다. 스트라이트닝 알고리듬은 포스트-링크 최적화 툴 분야로 알려져 있으며, AIXTM운영 체제용 실행 툴박스(performance tool box:PTX)의 일부로 IBM사(armonk, New York)에 의해 제공된 FDPR(Feedback Directed Program Restructuring) 툴과 같다. PTX의 다른 측면은 하버, 헤니스, 슈미디트 등에 의해 전술된 기사에서 설명된다.
코드 중복 및 랩퍼코드의 이용은, 추가 저장/재저장 명령어를 프로그램의 일부가 비분류되거나 알려지지 않고 남게 되더라도 제거하는 것을 허용하는 일반적인 해결법에 편리하며, 전술된 바와 같다. 그러나, 전체 프로그램코드가 이용가능하고 완전하게 분석되는 경우가 있기 때문에, 코드 내의f에 대한 모든 펑션 호출 명령어를 확실하게 찾을 수 있다. 이러한 경우에, 중복 단계 (40)는 불필요하다.
대신,f의 프롤로그 및 에필로그로부터 중복 저장/재저장 명령어는 바람직하게 대응하는 NOP명령어에 의해 대체된다. 그때 단계 (44)에서 생성된 랩퍼코드는f_opt보다f에 대한 호출을 포함할 것이다. 그들을 간단하게 제거하는 대신 NOP를 갖는 추가 저장/재저장 명령어를 대체하는 것이f의 전체 프로그램 코드를 다시 찾을 필요성을 제거한다.
또한,f에 대해 소정의 펑션 호출 명령어인, 펑션 호출 이후에 킬링된 비휘발성 레지스터의 세트에 관한 저장 명령어KREG(addr,f)는,펑션의 프롤로그내의 명령어를 우선적으로 따를 것이다. 대안적으로, 이러한 저장 명령어들은 프로그램의 의미에 영향을 받지 않고 프롤로그의 시작으로 재스케줄될 수 있을 것이다. 이러한 경우에서, 저장 명령어들은f_opt에 남을 수 있다(또는 전술된 경우와 마친가지로,f가 중복되지 않으면f자체에 남을 수 있다). 그때, 중복 저장 명령어는f_opt또는f의 처음에 찾아낸 중복 저장을 건너뛰기 위해 소정의 호출 명령어의 타겟 주소를 재지정함으로써 쉽게 피해진다. 이 방법은 더 짧고 더 간단하게 랩퍼 코드가 이용되도록 허용된다.
f의 모든 킬링된 비휘발성 레지스터에 관한 저장 명령어인OPT(f)는, 펑션의 프롤로그내의 명령어를 우선적으로 따르거나 또는 이 방법내에서 재스케쥴될 수 있다는 것이 쉽게 떠오를 것이다. 또한, 이러한 경우에서, 본 발명의 최적화는 펑션f의 코드를 중복하지 않고 실행될 수 있다. 대신,f에서 저장 명령어는 프롤로그의 처음에 적절하게 남으며, 펑션에 대한 호출 명령어는 적절하게 저장 명령어를 건너뛰기 위해 재지정된다. 이 경우에, 어떤 중복 저장 명령어는 여전히 실행될 것이다.
본 발명의 다른 대안적인 실시예는 포스트-링크 시간에 새로운 스택 프레임을 증가시키거나 생성시키는 것이 가능할 때 이용될 수 있다. 이 실시예에서,OPT(f)내의 레지스터에 관하여f내의 모든 저장 및 재저장 명령어는 NOP명령어로 대체되며,ff_opt로 이름이 변경된다. 그때,f에 대한 모든 분석된 호출 명령어는, 언킬링된(unkilled) 레지스터를 저장 및 재저장하기 위해 적절한 랩퍼코드에대한 호출에 의해 대체되며, 전술한 바와 같다.f에 대해 얼마든지 가능한 분석되지 않은 호출 명령어를 조작하기 위해, 이하 리스트된 것과 같이, 새로운 펑션f가 프로그램 코드에 추가된다.
store R1
store R2
...
store Rn
call f_opt
restore Rn
restore Rn
restore Rn-1
...
restore R1
return
여기서 다시 한번,{R1,R2,...,Rn}OPT(f)내의 비휘발성 레지스터의 세트이다.
포스트 링크 프로그램의 다시 찾은 정보가 갱신됨으로써 원래 펑션f에 대한 모든 레프런스는f에 대한 새로운 스택 프레임을 증가시키거나 생성시킴으로써, 이런 새로운 펑션에 대해 재지정된다. 이 방법에서,f에 대한 모든 비-분석된(non-resolved) 호출 명령어는 새로운f에 대해 자동적으로 확장될 것이고, 프로그램의원래 의미는 유지된다.
전술된 바람직한 실시예는 안전을 위한 모든 가정을 기초로 하며, 원래 포스트-링크 코드는 최적화 중에 확장되거나 축소될 수 없다. 또한, 본 발명의 원리는 삭제를 가능하게 하는 환경이더라도, 코드의 추가 및 이동을 적용시킬 수 있다. 이러한 환경에서, 랩퍼 코드에 대한 필요성은f에 대한 호출 명령어를 직접적으로 대응하기 전후에 요구된 저장 및 재저장 명령어를 대신 삽입함으로써 피할 수 있다. 마찬가지로, NOP명령어로써 저장 및 재저장 명령어를 대체하는 대신, 불필요한 명령어는 코드로부터 간단하게 삭제될 수 있으며, 전술한 바와 같다.
그러므로 전술된 바람직한 실시예가 실례로 인용되는 것이 바람직할 것이며, 본 발명은 특히 본 명세서에서 도시 및 설명된 것에 제한되지 않는다. 더욱이, 본 발명의 범주는 여기에 설명된 다양한 특징의 조합 및 부분 조합 모두를 포함할 뿐만 아니라, 종래 기술로 공지되지 않고 전술한 설명을 읽고 당업자에 의해 실시될 수 있는 변형물 및 변경을 포함할 것이다.
본 발명에 따르면, 본 발명의 코드 최적화 방법은, 일반적으로 최적화 유니트의 범주로 제한되는, 컴파일러 최적화와 달리, 통일된 전체로서 전체 실행 가능 코드를 처리할 수 있으므로, 포괄적인 프로그램 최적화를 가능하게 한다.
또한, 본 발명은, 최적화 컴파일러가 연결 규칙(linkage convention)에 의해 결합되는 동안, 포스트-링크 옵티마이저는 불필요한 저장 및 재저장 명령어를 제거하는 데 이러한 규칙을 무시할 수 있으므로, 불필요한 메모리 동작을 제거하기 위해 사용될 수 있다.
더욱이, 이러한 본 발명의 코드 최적화 방법들은, 증여 목적 코드 또는 정적-연결형 목적코드 라이브러리가 실행 가능 코드에 포함될 때의 경우와 같이, 소스 코드가 컴파일-시간 최적화를 이용할 수 없을 때도 코드 최적화에 사용될 수 있다.

Claims (16)

  1. 코드를 최적화하기 위한 방법에 있어서,
    컴파일 및 링크된 목적 코드를 역어셈블하는 단계(disassembling)와,
    상기 역어셈블된 코드내의 펑션 -상기 펑션은 레지스터에 관한 저장 및 재저장 명령어를 포함함- 을 확인하는 단계와,
    상기 레지스터를 킬링(kill)할 명령어가 잇따르는 상기 펑션에 대한 호출을 찾아내기(locate) 위해 상기 역어셈블된 코드를 분석하는 단계와,
    상기 펑션이 상기 찾아낸 호출에 의해 불려질 때 상기 펑션으로부터 상기 저장 명령어를 제거하기 위해 상기 코드를 변경하는 단계
    를 포함하는 코드 최적화 방법.
  2. 제1항에 있어서,
    상기 코드를 변경하는 단계는 상기 펑션이 상기 찾아낸 호출에 의해 불려질 때 상기 펑션으로부터 상기 재저장 명령어를 제거하기 위해 상기 코드를 변경하는 단계를 더 포함하는 코드 최적화 방법.
  3. 제1항에 있어서,
    상기 코드를 변경하는 단계는 상기 저장 명령어를 건너뛰기 위해 상기 찾아낸 호출을 재지정하는 단계(redirecting)를 포함하는 코드 최적화 방법.
  4. 제3항에 있어서,
    상기 코드를 변경하는 단계는 상기 저장 명령어가 제거된 상기 펑션의 최적화된 버전을 생성하기 위하여 상기 펑션에 대응하는 상기 코드의 일부를 중복하는 단계를 포함하고, 상기 찾아낸 호출을 재지정하는 단계는 상기 펑션의 최적화 버전의 주소로 상기 호출을 지정하는 단계를 포함하는 코드 최적화 방법.
  5. 제4항에 있어서,
    상기 역어셈블된 코드를 분석하는 단계는 상기 펑션에 대해 다수의 호출을 찾아내는 단계를 포함하고, 상기 찾아낸 호출을 재지정하는 단계는 상기 펑션의 상기 최적화된 버전의 주소로 상기 다수의 호출을 재지정하는 단계를 포함하는 코드 최적화 방법.
  6. 제5항에 있어서,
    상기 펑션은 다수의 레지스터에 관한 저장 및 재저장 명령어를 포함하고, 상기 다수의 재지정된 호출 각각은 상기 다수의 레지스터 중 적어도 하나를 킬링하기 위해 각각의 명령어가 잇따르며, 상기 코드의 일부를 중복하는 단계는 상기 재지정된 호출 이후에 킬링된 사실상 모든 레지스터에 관한 저장 및 재저장 명령어를 상기 펑션의 최적화된 버전으로부터 제거하는 단계를 포함하는 코드 최적화 방법.
  7. 제6항에 있어서,
    상기 코드를 변경하는 단계는 상기 다수의 재지정된 호출 중 적어도 하나를 위해 랩퍼코드 -상기 랩퍼코드는 상기 킬링된 레지스터중 적어도 하나에 관한 저장 명령어가 선행되고, 상기 킬링된 레지스터 중 적어도 하나에 관한 재저장 명령어가 잇따름- 를 생성시키는 단계를 포함하고, 상기 찾아낸 호출을 재지정하는 단계는 상기 랩퍼코드로 상기 호출을 재지정하는 단계
    를 포함하는 코드 최적화 방법.
  8. 제7항에 있어서,
    상기 랩퍼코드에 상기 호출을 지정하는 단계는 상기 찾아낸 호출을 상기 랩퍼코드로의 분기하라는 명령어로 대체하는 단계를 포함하는 코드 최적화 방법.
  9. 제7항에 있어서,
    상기 랩퍼 코드를 생성시키는 단계는 서로 다른 재지정된 호출에 대해 각각의 랩퍼 코드를 다수 생성시키는 단계를 포함하고, 상기 다수의 호출을 재지정하는 단계는 상기 각각의 랩퍼코드로 서로 다른 에 대해 상기 호출들을 재지정하는 단계를 포함하는 코드 최적화 방법.
  10. 제4항에 있어서,
    상기 역어셈블된 코드는 최종 명령어로 끝나는 정해진 순서의 명령어를 포함하고, 상기 코드의 일부를 중복하는 단계는 상기 정해진 순서를 변경하지 않고 상기 최종 명령어 이후에 상기 중복된 코드를 부가하는 단계를 포함하는 코드 최적화 방법.
  11. 제3항에 있어서,
    상기 역어셈블된 코드는 명령어의 정해진 순서를 포함하고,
    상기 코드를 변경하는 단계는 상기 정해진 순서를 변경하지 않고 상기 저장 명령어를 제거하는 단계를 포함하는 코드 최적화 방법.
  12. 제3항에 있어서,
    상기 역어셈블된 코드를 분석하는 단계는 상기 펑션에 대응하는 코드 부분에서 상기 저장 명령어를 확인하는 단계를 포함하고, 상기 찾아낸 호출을 재지정하는 단계는 상기 확인된 저장 명령어를 건너뛰기 위해 상기 호출을 재지정하는 단계를 포함하는 코드 최적화 방법.
  13. 제12항에 있어서,
    상기 코드 부분은 상기 펑션의 프롤로그를 포함하고, 상기 코드를 변경하는 단계는 상기 확인된 저장 명령어가 상기 프롤로그의 시작부에 있도록 상기 코드의 일부를 배치하는 단계를 포함하며, 상기 호출을 재지정하는 단계는 상기 확인된 저장 명령어에 이어지는 상기 타겟주소로 호출을 지정하는 단계를 포함하는 코드 최적화 방법.
  14. 제1항에 있어서,
    상기 저장 명령어를 제거하는 단계는 상기 저장 명령어를 NOP명령어로 교체하는 단계를 포함하는 코드 최적화 방법.
  15. 제1항 내지 제14항 중 어느 한 항에 따른 방법의 단계들을 수행하도록 정해진 코드 프로세서를 포함하는 코드 최적화 장치.
  16. 제1항 내지 제14항 중 어느 한 항에 따른 코드 최적화 방법을 수행하기 위한 프로그램 명령어가 저장된 컴퓨터 판독 가능 매체를 포함하는 컴퓨터 소프트웨어 제품.
KR1020020009703A 2001-03-02 2002-02-23 포스트-링크 코드 최적화 KR20020070809A (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US09/798,879 2001-03-02
US09/798,879 US6966055B2 (en) 2001-03-02 2001-03-02 Optimizing post-link code

Publications (1)

Publication Number Publication Date
KR20020070809A true KR20020070809A (ko) 2002-09-11

Family

ID=25174497

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020020009703A KR20020070809A (ko) 2001-03-02 2002-02-23 포스트-링크 코드 최적화

Country Status (4)

Country Link
US (1) US6966055B2 (ko)
JP (1) JP4181326B2 (ko)
KR (1) KR20020070809A (ko)
CN (1) CN1265290C (ko)

Families Citing this family (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6748589B1 (en) 1999-10-20 2004-06-08 Transmeta Corporation Method for increasing the speed of speculative execution
WO2001075669A1 (en) * 2000-03-31 2001-10-11 British Telecommunications Public Limited Company Resource modelling
CN100388191C (zh) * 2003-04-01 2008-05-14 松下电器产业株式会社 程序连接方法、装置以及终端装置
US7269830B2 (en) * 2003-09-16 2007-09-11 Sun Microsystems, Inc. Methods and hardware for safe memory allocation in arbitrary program environments
US7814467B2 (en) * 2004-01-15 2010-10-12 Hewlett-Packard Development Company, L.P. Program optimization using object file summary information
CN100359470C (zh) * 2004-06-30 2008-01-02 中国科学院计算技术研究所 动静结合二进制翻译中静态信息不完备的处理方法及装置
US7797690B2 (en) * 2005-03-15 2010-09-14 International Business Machines Corporation System, method and program product to optimize code during run time
JP5119590B2 (ja) * 2005-11-10 2013-01-16 富士通セミコンダクター株式会社 マルチプロセッサを有するプロセッサ装置用のタスク分配プログラム及びタスク分配装置
US8214813B2 (en) 2007-01-12 2012-07-03 Microsoft Corporation Code optimization across interfaces
US8370821B2 (en) * 2007-08-21 2013-02-05 International Business Machines Corporation Method for enabling profile-based call site tailor-ing using profile gathering of cloned functions
US8776030B2 (en) * 2008-04-09 2014-07-08 Nvidia Corporation Partitioning CUDA code for execution by a general purpose processor
US9678775B1 (en) * 2008-04-09 2017-06-13 Nvidia Corporation Allocating memory for local variables of a multi-threaded program for execution in a single-threaded environment
GB2463942B (en) * 2008-10-03 2012-08-08 Icera Inc Disassembling an executable to analyse function calls to minimise cache misses
CA2684226A1 (en) * 2009-10-30 2011-04-30 Ibm Canada Limited - Ibm Canada Limitee Eleminating redundant operations for common properties using shared real registers
US9134977B2 (en) * 2010-02-26 2015-09-15 Red Hat, Inc. Compiler operation for handling conditional statements
US8694978B1 (en) * 2011-03-25 2014-04-08 Google Inc. Function side-effect modeling by prototyping
US9183021B2 (en) * 2011-05-31 2015-11-10 Red Hat, Inc. Runtime optimization of application bytecode via call transformations
US8966463B2 (en) * 2011-11-29 2015-02-24 Microsoft Technology Licensing, Llc Eliminating redundant function calls
CN104063208B (zh) * 2013-03-21 2017-11-17 北京百度网讯科技有限公司 代码文件的优化方法、系统和服务器
KR102152735B1 (ko) 2013-09-27 2020-09-21 삼성전자주식회사 그래픽 처리 장치 및 이의 동작 방법
US9274769B1 (en) 2014-09-05 2016-03-01 International Business Machines Corporation Table of contents pointer value save and restore placeholder positioning
US9146715B1 (en) 2014-09-05 2015-09-29 International Business Machines Corporation Suppression of table of contents save actions
US9244663B1 (en) 2014-12-22 2016-01-26 International Business Machines Corporation Managing table of contents pointer value saves
US20170123798A1 (en) * 2015-11-01 2017-05-04 Centipede Semi Ltd. Hardware-based run-time mitigation of blocks having multiple conditional branches
CN109726816A (zh) * 2018-12-12 2019-05-07 中国航空工业集团公司西安航空计算技术研究所 一种汇编级染色器程序链接优化方法

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08147155A (ja) * 1994-11-22 1996-06-07 Sumitomo Metal Ind Ltd オブジェクトプログラムの命令の変更/挿入方法及びシステム
KR19990067823A (ko) * 1998-01-12 1999-08-25 가네꼬 히사시 최적화에 있어서 인터럽트 처리의 경감을 실현하는 컴파일러 및 그의 최적화 방법
US6021272A (en) * 1995-10-04 2000-02-01 Platinum Technology, Inc. Transforming and manipulating program object code
KR20010006995A (ko) * 1999-04-23 2001-01-26 포만 제프리 엘 응용 프로그램의 관리방법

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE69427193T2 (de) * 1993-07-15 2001-09-20 Apple Computer, Inc. Verfahrensauswahl mit mehreren eingangspunkten
JP3311462B2 (ja) * 1994-02-23 2002-08-05 富士通株式会社 コンパイル処理装置
US6324683B1 (en) * 1996-02-23 2001-11-27 International Business Machines Corporation System, method and program for debugging external programs in client/server-based relational database management systems
JPH11272473A (ja) 1998-03-24 1999-10-08 Toshiba Corp プログラム言語処理装置のコード最適化方式
GB2345989A (en) * 1999-01-23 2000-07-26 Ibm Executing defined sequences of prolog instructions.
US6826748B1 (en) * 1999-01-28 2004-11-30 Ati International Srl Profiling program execution into registers of a computer
US6408433B1 (en) * 1999-04-23 2002-06-18 Sun Microsystems, Inc. Method and apparatus for building calling convention prolog and epilog code using a register allocator
US6539543B1 (en) * 1999-11-29 2003-03-25 Adelante Technologies, Nv Method and apparatus for compiling source code by flattening hierarchies
US6588009B1 (en) * 1999-11-29 2003-07-01 Adelante Technologies Nv Method and apparatus for compiling source code using symbolic execution

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH08147155A (ja) * 1994-11-22 1996-06-07 Sumitomo Metal Ind Ltd オブジェクトプログラムの命令の変更/挿入方法及びシステム
US6021272A (en) * 1995-10-04 2000-02-01 Platinum Technology, Inc. Transforming and manipulating program object code
KR19990067823A (ko) * 1998-01-12 1999-08-25 가네꼬 히사시 최적화에 있어서 인터럽트 처리의 경감을 실현하는 컴파일러 및 그의 최적화 방법
KR20010006995A (ko) * 1999-04-23 2001-01-26 포만 제프리 엘 응용 프로그램의 관리방법

Also Published As

Publication number Publication date
CN1265290C (zh) 2006-07-19
CN1374585A (zh) 2002-10-16
JP4181326B2 (ja) 2008-11-12
JP2002259134A (ja) 2002-09-13
US6966055B2 (en) 2005-11-15
US20040205739A1 (en) 2004-10-14

Similar Documents

Publication Publication Date Title
KR20020070809A (ko) 포스트-링크 코드 최적화
US7140006B2 (en) Method and apparatus for optimizing code
US5170465A (en) Incremental-scanning compiler for source-code development system
US5182806A (en) Incremental compiler for source-code development system
US5313387A (en) Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers
US5325531A (en) Compiler using clean lines table with entries indicating unchanged text lines for incrementally compiling only changed source text lines
US5193191A (en) Incremental linking in source-code development system
US5201050A (en) Line-skip compiler for source-code development system
US5586328A (en) Module dependency based incremental compiler and method
US6427234B1 (en) System and method for performing selective dynamic compilation using run-time information
Hall Managing interprocedural optimization
US11579856B2 (en) Multi-chip compatible compiling method and device
US5937191A (en) Determining and reporting data accessing activity of a program
US7010785B2 (en) Eliminating cold register store/restores within hot function prolog/epilogs
US7036116B2 (en) Percolating hot function store/restores to colder calling functions
Serrano et al. Type error diagnosis for embedded DSLs by two-stage specialized type rules
US6009273A (en) Method for conversion of a variable argument routine to a fixed argument routine
US7017154B2 (en) Eliminating store/restores within hot function prolog/epilogs using volatile registers
US5301327A (en) Virtual memory management for source-code development system
AU638999B2 (en) Incremental compiler for source-code development system
Olmos et al. Strategies for source-to-source constant propagation
US20040205736A1 (en) Compile method and program recording medium
Alt et al. TrafoLa-H subsystem
GB2420638A (en) Method of substituting code fragments in Internal Representation
Brosgol TCOLAda and the" middle end" of the PQCC Ada compiler

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E601 Decision to refuse application