Abstract
Loop invariant code motion (LICM) optimization includes relatively heavy code analyses, thus being not readily applicable to Java Just-In-Time (JIT) compilation where the JIT compilation time is part of the whole running time. 'Classical' LICM optimization first analyzes the code and constructs both the def-use chains and the use-def chains. which are then used for performing code motions. This paper proposes a light-weight LICM algorithm, which requires only the def-use chains of loop invariant code (without use-def chains) by exploiting the fact that the Java virtual machine is based on a stack machine, hence generating code with simpler patterns. We also propose two techniques that allow more code motions than classical LICM techniques. First, unlike previous JIT techniques that uses LICM only in single-path loops for simplicity, we apply LICM to multi-path loops (natural loops) safely for partially redundant code. Secondly, we move loop-invariant, partially-redundant null pointer check code via predication support in Itanium. The proposed techniques were implemented in a JIT compiler for Itanium processor on ORP (Open Runtime Platform) Java virtual machine of Intel. On SPECjvrn98 benchmarks, the proposed technique increases the JIT compilation overhead by the geometric mean of 1.3%, yet it improves the total running time by the geometric mean of 2.2%.
루프 불변 코드 이동(loop invariant code motion, LICM) 컴파일러 최적화는 비교적 많은 분석 작업을 필요로 하기 때문에 컴파일 시간이 수행 시간의 일부가 되는 자바 적시(Just-In-Time) 컴파일러에는 사용하기 쉽지 않다. "전통적인" LICM 기법에서는 보통 코드를 분석하여 레지스터의 정의-사용체인과 사용-정의 체인을 미리 만든 뒤 이를 바탕으로 코드 이동을 수행하는 데, 본 논문은 자바 가상 머신(Java virtual machine)이 스택 머신 (stack machine)이라서 좀 더 단순한 코드 형태를 생성한다는 특징을 이용하여 정의-사용 체인을 루프 불변 코드에 대해서만 만들고 사용-정의 체인 없이도 정확히 동작하는 알고리즘을 제시한다. 또한 기존의 방식보다 더 많은 루프 불변 코드 이동을 하게 하는 두 가지 방법을 제시한다. 우선, 간단하기 때문에 루프에 경로가 하나인 경우만 LICM을 적용하는 기존의 기법과 달리, 경로가 여러 개인 루프에서도 부분적으로 중복되는 코드에 대해서도 LICM을 안전하게 적용한다. 또한 부분적으로 중복되는 루프 불변 널(null) 포인터 체크 코드도 Itanium의 조건 수행(predication)을 이용하여 이동시키다. 제안된 기법은 Itanium 마이크로프로세서를 위한 인텔의 ORP(Open Runtime Platform) 자바 가상 머신 위의 적시 컴파일러에 구현하였다. SPECjvm98 벤치마크에 대해 실험을 수행한 결과 전체 적시 컴파일 시간을 1.3% 정도만을 증가시켰지만 전체 수행 시간을 기하 평균으로 2.2% 향상 시켰다.