연속 폴딩

Constant folding

지속적인 폴딩과 지속적인 전파는 많은 최신 [1]컴파일러에서 사용되는 관련 컴파일러 최적화입니다.스파스 조건부 상수 전파로 알려진 고급 형태의 상수 전파는 상수를 보다 정확하게 전파하는 동시에 데드 코드를 제거할 수 있습니다.

연속 폴딩

연속 폴딩은 실행 시 계산하지 않고 컴파일상수 식을 인식하고 평가하는 과정입니다.상수식의 항은 일반적으로 정수 리터럴과 같은 단순 리터럴입니다. 2단, 컴파일 시에 값이 알려진 변수일 수도 있습니다.다음 문장을 고려합니다.

  i = 320 * 200 * 32; 

대부분의 컴파일러는 실제로 두 개의 곱셈 명령과 이 문을 위한 저장소를 생성하지 않습니다.대신 이러한 구성 요소를 식별하고 컴파일 시 계산된 값을 대체합니다(이 경우,2,048,000).

계속 접으면 산술적 식별 정보를 사용할 수 있습니다.한다면x수치입니다.0 * x컴파일러가 값을 모르더라도 0입니다.x(이것은 IEEE 플로트에서는 유효하지 않습니다.xInfinity 또는 NotANUMBER 중 하나입니다.그러나 GLSL 등 성능을 선호하는 일부 언어에서는 상수에 대해 이 기능을 사용할 수 있으므로 버그가 발생할 수 있습니다).

연속 폴딩은 숫자에만 적용되는 것이 아닙니다.문자열 리터럴과 상수 문자열의 연결은 계속 접을 수 있습니다.다음과 같은 코드"abc" + "def"로 대체될 수 있다"abcdef".

지속적인 폴딩 및 교차 컴파일

크로스 컴파일러를 구현할 때, 호스트 아키텍처에서의 산술 연산의 동작이 타깃 아키텍처에서의 연산 동작과 일치하도록 주의해야 한다.그렇지 않으면 지속적인 폴딩을 활성화하면 프로그램의 동작이 변경되기 때문이다.이것은 특히 부동소수점 연산의 경우 중요합니다.정확한 실장은 크게 다를 수 있습니다.

지속적인 전파

지속적인 전파는 컴파일 시 식에서 알려진 상수 값을 대체하는 프로세스입니다.이러한 상수에는 상수에 적용되는 고유함수뿐만 아니라 에서 정의된 상수도 포함됩니다.다음의 의사 코드에 대해 검토합니다.

  인트 x = 14;   인트 y = 7 - x / 2;   돌아가다 y * (28 / x + 2); 

x의 수율 전파:

  인트 x = 14;   인트 y = 7 - 14 / 2;   돌아가다 y * (28 / 14 + 2); 

전파를 계속하면 다음과 같은 결과가 발생합니다(x와 y의 데드 코드를 제거함으로써 더 최적화될 수 있습니다).

  인트 x = 14;   인트 y = 0;   돌아가다 0; 

도달하는 정의 분석 결과를 사용하여 컴파일러에서 지속적인 전파가 구현됩니다.모든 변수의 도달 정의가 변수에 동일한 상수를 할당하는 동일한 할당인 경우 변수는 상수 값을 가지며 상수로 대체할 수 있습니다.

또한 조건식을 컴파일 시 true 또는 false로 평가하여 가능한 유일한 결과를 결정할 수 있는 경우 지속적인 전파를 통해 조건 브랜치가 하나 이상의 무조건 스테이트먼트로 단순화할 수 있습니다.

동작하고 있는 최적화

지속적인 접힘과 전파는 일반적으로 더 이상 변화가 없을 때까지 반복하여 많은 단순화와 감소를 달성하기 위해 함께 사용됩니다.랜덤 번호를 반환하는 최적화되지 않은 의사 코드에 대해 생각해 봅시다.

  인트 a = 30;   인트 b = 9 - (a / 5);   인트 c;    c = b * 4;   한다면 (c > 10) {      c = c - 10;   }   돌아가다 c * (60 / a); 

일정한 전파를 한 번 적용한 후 일정한 접힘을 적용하면 다음과 같은 결과가 나옵니다.

  인트 a = 30;   인트 b = 3;   인트 c;    c = b * 4;   한다면 (c > 10) {      c = c - 10;   }   돌아가다 c * 2; 

두 단계를 두 번 반복하면 다음과 같은 결과가 발생합니다.

  인트 a = 30;   인트 b = 3;   인트 c;    c = 12;   한다면 (진실의) {      c = 2;   }   돌아가다 c * 2; 

~하듯이a그리고.b상수로 단순화되어 그 값이 발생한 모든 곳에서 대체되었습니다.컴파일러는 데드코드 제거를 적용하여 그것들을 폐기함으로써 코드를 더욱 줄입니다.

  인트 c;   c = 12;    한다면 (진실의) {      c = 2;   }   돌아가다 c * 2; 

위의 코드에서는true컴파일러 프레임워크에 따라 1 또는 기타 Boolean 구성일 수 있습니다.기존의 지속적인 전파 방식에서는 이 정도만 최적화됩니다.그것은 프로그램의 구조를 바꿀 수 없다.

sparse conditional constant propagation이라고 불리는 또 다른 유사한 최적화가 있습니다.이 최적화는 다음과 같은 기준에 따라 적절한 분기를 선택합니다.if-condition컴파일러가 검출할 수 있게 되었습니다.[2]if스테이트먼트는 항상 true로 평가됩니다.c그 자체를 없앨 수 있기 때문에, 코드는 한층 더 축소됩니다.

  돌아가다 4; 

만약 이 의사코드가 함수의 본문을 구성했다면, 컴파일러는 그것이 상수 정수로 평가된다는 지식을 더욱 활용할 수 있었다.4함수에 대한 불필요한 호출을 제거하여 성능을 더욱 향상시킵니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Steven Muchnick; Muchnick and Associates (15 August 1997). Advanced Compiler Design Implementation. Morgan Kaufmann. ISBN 978-1-55860-320-2. constant propagation OR constant folding.
  2. ^ Wegman, Mark N; Zadeck, F. Kenneth (April 1991), "Constant Propagation with Conditional Branches", ACM Transactions on Programming Languages and Systems, 13 (2): 181–210, CiteSeerX 10.1.1.130.3532, doi:10.1145/103135.103136, S2CID 52813828

추가 정보