WO2012134122A2 - Method and apparatus for eliminating partially redundant array bounds checks in an embedded compiler - Google Patents

Method and apparatus for eliminating partially redundant array bounds checks in an embedded compiler Download PDF

Info

Publication number
WO2012134122A2
WO2012134122A2 PCT/KR2012/002147 KR2012002147W WO2012134122A2 WO 2012134122 A2 WO2012134122 A2 WO 2012134122A2 KR 2012002147 W KR2012002147 W KR 2012002147W WO 2012134122 A2 WO2012134122 A2 WO 2012134122A2
Authority
WO
WIPO (PCT)
Prior art keywords
array
loop
checks
expression tree
references
Prior art date
Application number
PCT/KR2012/002147
Other languages
French (fr)
Other versions
WO2012134122A3 (en
Inventor
Mohammed Javed Absar
Original Assignee
Samsung Electronics Co., Ltd.
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 Samsung Electronics Co., Ltd. filed Critical Samsung Electronics Co., Ltd.
Publication of WO2012134122A2 publication Critical patent/WO2012134122A2/en
Publication of WO2012134122A3 publication Critical patent/WO2012134122A3/en

Links

Images

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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • G06F9/4552Involving translation to a different instruction set architecture, e.g. just-in-time translation in a JVM
    • 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
    • G06F8/4441Reducing the execution time required by the program code

Definitions

  • the present invention relates to the field of code compliers and more particularly to just-in-time (JIT) compiler for Java based Virtual Machine.
  • JIT just-in-time
  • VMs offer a complete system platform which supports the execution of a complete operating system.
  • the introduction of Virtual machines (VM) has offered a platform for development of programming languages such as Java and so on.
  • Dalvik VM One of the VM developed is the Dalvik VM that is used in an Android operating system. Unlike, Java VMs, which are stack-based, Dalvik VM is register-based. Stack-based machines use instructions to load data on the stack and manipulate the data, and thus requiring more instructions than register-based machines to implement the same high-level code. But the instructions in a register-based machine encode source and destination registers, therefore tend to be larger.
  • Java programs are compiled to Java bytecode.
  • the bytecode which is essentially the instructions for the Java Virtual Machine, enables the distribution of programs in a safe architecture-neutral format.
  • a tool called Dex is used by Android to convert stack-based Java bytecode files to the virtual-register based dexcode. Multiple classes can be included in a single dex file so, duplicate strings and other constants used in multiple class files are included only once in the dex output to conserve space.
  • DVM Dalvik Virtual Machine
  • JIT just-in-time compilation.
  • DVM added the JIT compiler that selectively compiles hot-traces to native ARM code.
  • the DVM interpreter passes hot-traces to the JIT compiler for native-compilation.
  • the JIT runs as a separate thread and picks up the traces to compile from its work-queue.
  • the JIT includes a number of optimizers such as constant-folding, induction variable analysis. It also includes an array-bounds check optimizer.
  • Array bound check in a Java language In Java language before any array referencing, the index expression is checked whether is not less than 0 (lower bound check) and not greater than array length minus 1 (upper bound check). If these checks fail, an out of bounds exception must be thrown at that program point. Performing bounds check with every array access significantly slow down programs with high array referencing. Some of the bounds check may be proven to be fully redundant. Further, there are techniques to eliminate such fully redundant checks. For example, if we allocate an array of length L and index it as a[i] in a for loop where the iterator 'i' increments by one in each iteration and I first is zero and I last is L-1, then there is no need to perform checks.
  • Range propagation an algorithm that uses data and conditional structure of program to derive and propagate refinements in the accuracy of range information.
  • Range propagation is not inductive, so presence of loop limits the utility of derived results.
  • range analysis tracks modifications applied to variable at each program point but it disregards control structure.
  • loop-counting which derives bounds on the number of times inductive process of a loop needs to be applied.
  • ABCD array bounds check elimination
  • An aspect of the present invention is to provide a method and an apparatus for identifying optimizable partially redundant array bounds checks and eliminate them.
  • Another aspect of the present invention is to provide a method and an apparatus for handling array indices that are combination of functions of iterators, loop invariants and literals.
  • the invention provides a method for optimizing array bounds checks in JIT complier by hoisting the checks outside a loop.
  • the method comprising steps of checking for array references for optimization, creating a valid expression tree table (VETT) employing pre-defined definitions for the array references, analyzing the array references in view of the valid expression tree table (VETT), and hoisting the array references outside the loop for performing the check only once during execution of the loop.
  • VETT valid expression tree table
  • the invention provides a computer program product embodied in a computer readable medium including program instructions which when executed by a processor cause the processor to perform a method for optimizing array bounds checks in JIT complier by hoisting the checks outside a loop.
  • the method comprising checking for array references for optimization, creating a valid expression tree table (VETT) employing pre-defined definitions for the array references, analyzing the array references in view of the valid expression tree table (VETT), and hoisting the array references outside the loop for performing the check only once during execution of the loop.
  • VETT valid expression tree table
  • FIG. 1 illustrates an existing operating system and virtual machine environment, as disclosed herein,
  • FIG. 2 depicts a method for optimizing partially redundant checks in an array reference, according to embodiments as disclosed herein,
  • FIG. 3 illustrates a value expression tree table (VETT), according to embodiments as disclosed herein,
  • FIG. 4 illustrates an example of optimizing array bounds checks, according to embodiments as disclosed herein,
  • FIG. 5 is a graph depicting normalized execution time of benchmarks after array bounds check optimization, according to embodiments as disclosed herein,
  • FIG. 6 is a graph depicting the cost breakdown of applying the method for array bounds check optimization, according to embodiments as disclosed herein, and
  • FIG. 7 illustrates a computing environment implementing the application as disclosed in an embodiment herein.
  • FIGS. 1 through 7 where similar reference characters denote corresponding features consistently throughout the figures, there are shown preferred embodiments.
  • a method for identifying and eliminating partially redundant array bounds checks in DVM employs an algorithm that is capable of eliminating array bound checks for complex indices that comprise of a combination of iterators, loop invariants and constants.
  • the method identifies array references that may be hoisted outside the loop for optimization of the checks. Further, a valid expression tree table is constructed for the reference and the partially redundant checks are eliminated by hoisting newly generated check out of the loop.
  • FIG. 1 illustrates an existing operating system and virtual machine environment, as disclosed herein.
  • the figure depicts existing Operating system (OS) environment.
  • the OS may be an Android OS 101 for the purposes of the application.
  • the OS 101 comprises of a virtual machine VM 102 that resides on the OS 101.
  • the VM 102 may be a Dalvik VM.
  • the DVM 102 supports Java programming language and enables execution of Java programs on it.
  • the DVM 102 comprises an interpreter 103 and a complier 104.
  • the complier is a JIT complier 104 that complies Java codes to native codes.
  • DVM is register-based.
  • Stack-based machines use instructions to load data on the stack and manipulate that data, and, thus, require more instructions than register machines to implement the same high- level code. But the instructions in a register machine must encode the source and destination registers and, therefore, tend to be larger.
  • Java programs are compiled to Java bytecode.
  • the bytecode which is essentially the instructions for the Java Virtual Machine, enables the distribution of programs in a safe, architecture-neutral format.
  • a tool called Dex is used by Android to convert stack-based Java bytecode files to the virtual-register based dexcode. Multiple classes can be included in a single dex file. Duplicate strings and other constants used in multiple class files are included only once in the dex output to conserve space.
  • Interpretation 103 is inherently slower than running the code native. However, as most of the byte-code (dynamic-loading) may not be present at application launch time, offline compilation of the dexcode is not a practical solution. As a result Dalvik, since the Froyo 2.2 release, Android has incorporated a just-in-time (JIT) compiler into it.
  • JIT just-in-time
  • the DVM interpreter passes hot-traces to the JIT compiler 104 for native-compilation.
  • the JIT 104 runs as a separate thread and picks up the traces to compile from its work-queue.
  • the JIT 104 includes a number of optimizers such as constant-folding, induction variable analysis. It also includes an array-bounds check optimizer.
  • FIG. 2 depicts a method for optimizing partially redundant checks in an array reference, according to embodiments as disclosed herein.
  • the algorithm for eliminating partially redundant array bounds checks is disclosed in this method.
  • a Java program that comprises of many references to array.
  • the algorithm checks (201) for array references that may be optimized. For this, there are no checks conducted within the loops. The check is made by identifying instructions with opcode AGET or APUT and that array bounds check has not already been optimized away (flag MIR_IGNORE_RANGE_CHECK set) and so on. If found (202), the process moves further with the algorithm execution. In case there are no such array optimizations possible, the method exits (203).
  • the algorithm starts (204) building a valid expression tree.
  • the algorithm refers to some pre-defined variables and their entries in the Static Single Assignment (SSA) register.
  • the obtained expression tree table and its corresponding information are stored (205) as an attribute to the SSA register.
  • the array references are analyzed (206). During this step, a look up to the VETT through SSA registers gives the array references that may be optimized and how the expression tree may be generated. If there are any expression to array references that may be hoisted (207) outside the loop these references are hoisted based on their pre-defined representations. Thus, eliminating (208) the need for performing redundant checks to such references. If not, the process exits.
  • the various actions in the method 200 can be performed in the order presented, in a different order or simultaneously. Further, in some embodiments, some actions listed in FIG. 2 can be omitted.
  • biv The min and max values of the basic induction variable are biv min and biv max .
  • literal or constant. It could be a constant or a value stored in a register (identified through constant propagation) whose value is compile-time known.
  • div derived independent variable.
  • the div is formed by an operation (e.g. add, sub, multiply, logical and etc) on liv, ⁇ , and div.
  • ddv derived dependent variable is formed by an operation on biv with ⁇ , liv or div. Also, any operation of ddv with ⁇ , liv or div results in a ddv.
  • Table 1 depicts Generation of derived independent variable (div) and derived dependent variable (ddv).
  • ddv is an SSA register whose value is computed through an expression-tree in which there a single appearance of biv term.
  • any number of ⁇ , liv terms or div expressions can appear in the ddv expression-tree.
  • the generation of div and ddv through different combining operations is given in Table 1 where, for example, we see that .
  • some table entries e.g. - are undefined and they cannot be optimized.
  • the expression-tree information (about ddv, div, liv, biv) is stored as an attribute to the SSA register. This is the VETT (valid expression tree table) creation.
  • FIG. 3 illustrates a value expression tree table (VETT), according to embodiments as disclosed herein.
  • Each SSA register is initially marked as a biv, liv, ⁇ or unresolved.
  • the algorithm walks through the instructions in the trace, building the VETT as follows. Given an instruction, check is made if it is a compatible-computation type (e.g. 1 .div. biv is an incompatible-computation). If yes, the attributes of the operands (i.e. the attributes of the SSA registers) are used to define the attribute of the result SSA register (defined) by reading Table 1. For instance, in Figure 3, SSA register s8, has the attribute biv and the operator is nill and operand 1 and 2 are nill.
  • a compatible-computation type e.g. 1 .div. biv is an incompatible-computation
  • s2 In s2, the attribute is liv, the operator is nill and operand 1 and 2 are nill. Further, s8 (is the biv) is added to s2 (liv d). The result (i.e. i+d) in SSA register s9 is therefore a ddv. This follows from the entry in Table 1. On similar lines, next s9 is subtracted from s3 (v3_0 which is a liv). The result (i+d-c) stored in SSA register s10 (v5_2) is again ddv as per the entry in Table 1.
  • FIG. 4 illustrates an example of optimizing array bounds checks, according to embodiments as disclosed herein.
  • the embodiments herein indicate the actions to be taken for hoisting a check out of the loop.
  • each instruction is checked (401) for its computational compatibility. If the instruction is compatible (402) for optimization then VETT tree is constructed and SSA registers are employed for executing the code. If not compatible, then the process exits (403).
  • the operands and the results of the instruction execution are assigned (404) to the SSA registers. Then the attribute value is checked and a reference is made (405) to the table given below table 2 to determine if the check may be hoisted.
  • the below table 2 depicts code hoisting possibilities for the array bounds check. Whether the check can be hoisted and how depends on the attributes of the array indexing SSA register. For example, Let the SSA register used to index into an array be idx. The VETT attribute of idx tells 1. Whether the array boundary check can be hoisted 2. What code to generate for the hoisted checks. For example, in the running example SSA register s10 indexes into an array. s10.attribute is ddv.
  • the checks for this referencing can be hoisted (406) out of the loop. Thus eliminating redundant array references and repeated execution. If the s10.attribute was set as unresolved, then the check cannot be hoisted out of the loop and process ends (403).
  • the various actions in the method 400 can be performed in the order presented, in a different order or simultaneously. Further, in some embodiments, some actions listed in FIG. 4 can be omitted.
  • the process of generating hoisted code for array references may be discussed.
  • the array index SSA register attribute is liv
  • to remove the check from inside the loop to outside the loop one must reproduce the check "(unsigned) liv ⁇ 0" in the pre-header of the loop.
  • Two checks are required for ddv type expressions.
  • the lower bound check code is generated by substituting the biv with the bivmin (which will be either a constant or a loop-invariant) in the expression tree.
  • the upper bound check is generated substituting the biv with the bivmax (which will be either a constant or a loopinvariant) in the expression. Reproducing the expression tree is easy.
  • VETT entry also tells us that s10 ⁇ s9 - s3. In this manner, by following the entries in VETT one can reproduce the entire expression tree for s10 in the pre-header of the loop. There are just two things to worry about. Firstly, all writes must be to temporaries as we do not want to corrupt contents of Dalvik registers that may be required later on. Secondly, as mentioned before, the biv in the generated code must be substituted by bivmax or bivmin, depending on the upper-bound or lower-bound check.
  • Table 3 Name Description PNG-K kernel of EEMBC PNG (portable networks graphics) Benchmark. Vec-Mult multiplication of a vector with a matrix Mot-Est motion estimation where each block is compared with other blocks to find the minimum difference Blur image processing application kernel. Echo audio processing application
  • a hot section of the code is JIT compiled when the interpreter observes that it has executed (interpreted) the same code beyond a pre-determined JIT_THRESHOLD. Then the trace is submitted to JIT compiler.
  • the JIT compiler translates the dexcode to an equivalent native (e.g. ARM) code.
  • One step in the JIT compiler is optimization such as constant-folding and array-bounds check optimization.
  • the JIT compilation is useful only if the compiled code is executed multiple times in the future to amortize the overhead of JIT compilation. The same holds true for array-bounds check. For elimination whether it is our technique or any other partially/fully redundant array bounds check elimination technique. For brevity, in the following explanation we abbreviate our technique as ABCO (array bounds check optimization).
  • FIG. 5 is a graph depicting normalized execution time of benchmarks after array bounds check optimization, according to embodiments as disclosed herein.
  • Figure 5 we show the normalized execution time.
  • the interpretation of the columns is as follows.
  • the columns for each benchmark show the ratio of execution time with ABCO applied or without ABCO applied. If the loop executes only for 10 iterations (leftmost column) then there is no gain. In fact, applying ABCO makes the performance worse (e.g. 4.5 times worse in case of PNG-K) because of ABCO analysis overhead. That overhead does not get amortized as the loop runs only for 10 iterations. When the loop iterates for at least 100 times, there is almost break even. When the loop iterates for more than 100 times, the reduction in execution time is significant. The overhead of ABCO becomes negligible when the loop iterates for more than 1000.
  • FIG. 6 is a graph depicting the cost breakdown of applying the method for array bounds check optimization, according to embodiments as disclosed herein.
  • the start-up and clean-up cost of ABCO is usually small (see Figure 6).
  • the main cost is in building the VETT and the generation of hoisted checks. Building VETT cost is proportional to the size of the trace. As DVM compiles only one basic block at a time this cost is low.
  • the generation of hoisted check cost is proportional to the number of instructions resulting in the index.
  • the proposed technique is especially effective for embedded devices such as mobile phones running Java based virtual machine (e.g. Dalvik virtual machine).
  • the proposed technique kicks in only when the default array-bound check is unable to optimize all the array-references in the given trace and this minimizes overhead of our technique.
  • Proposed technique obtains average 30% speedup on array intensive application kernels.
  • FIG. 7 illustrates a computing environment implementing the application as disclosed in an embodiment herein.
  • the computing environment comprises at least one processing unit 710 that is equipped with a control unit 711 and an Arithmetic Logic Unit (ALU) 713, a memory 730, a storage unit 750, plurality of networking devices 770, and a plurality Input output (I/O) devices 790.
  • the processing unit 710 is responsible for processing the instructions of the algorithm.
  • the processing unit 710 receives commands from the control unit 711 in order to perform its processing. Further, any logical and arithmetic operations involved in the execution of the instructions are computed with the help of the ALU 713.
  • Processing unit 710 can support more than one threads.
  • the overall computing environment can be composed of multiple homogeneous and/or heterogeneous cores, multiple GPUs of different kinds, special media and other accelerators.
  • the processing unit 710 is responsible for processing the instructions of the algorithm.
  • the processing unit 710 receives commands from the control unit 711 in order to perform its processing. Further, any logical and arithmetic operations involved in the execution of the instructions are computed with the help of the ALU 713. Further, the plurality of process units may be located on a single chip or over multiple chips.
  • the instructions and codes required for the implementation are stored in either the memory unit 730 or the storage 750 or both. At the time of execution, the instructions may be fetched from the corresponding memory 730 and/or storage 750, and executed by the processing unit 710.
  • networking devices 770 or external I/O devices 790 may be connected to the computing environment to support the implementation through the networking unit and the I/O device unit 790.
  • the embodiments disclosed herein can be implemented through at least one software program running on at least one hardware device and performing network management functions to control the elements.
  • the elements shown in Figs. 1 include blocks which can be at least one of a hardware device, or a combination of hardware device and software module.
  • Certain exemplary embodiments of the present invention can also be embodied as computer-readable codes on a computer-readable recording medium.
  • the computer-readable recording medium is any data storage device that can store data which can thereafter be read by a computer system. Examples of the computer-readable recording medium include, but are not limited to, read-only memory (ROM), random-access memory (RAM), CD-ROMs, magnetic tapes, floppy disks, optical data storage devices, and carrier waves (such as data transmission through the Internet).
  • the computer-readable recording medium can also be distributed over network-coupled computer systems so that the computer-readable code is stored and executed in a distributed fashion. Also, functional programs, codes, and code segments for accomplishing the present invention can be easily construed as within the scope of the invention by programmers skilled in the art to which the present invention pertains.

Landscapes

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

Abstract

A method for identifying and eliminating partially redundant array bounds checks in DVM JIT compliers is disclosed. The method employs an algorithm that is capable of eliminating array bound checks for complex indices that comprise of a combination of iterators, loop invariants and constants. The method identifies array references that may be hoisted outside the loop for optimization of the checks. Further, a valid expression tree table is constructed for the reference and the partially redundant checks are eliminated by hoisting newly generated check out of the loop. The method optimizes the checks and thereby increases speed of execution.

Description

METHOD AND APPARATUS FOR ELIMINATING PARTIALLY REDUNDANT ARRAY BOUNDS CHECKS IN AN EMBEDDED COMPILER
The present invention relates to the field of code compliers and more particularly to just-in-time (JIT) compiler for Java based Virtual Machine.
With the advancements in computing technology virtual machines have been developed. The VMs offer a complete system platform which supports the execution of a complete operating system. The introduction of Virtual machines (VM) has offered a platform for development of programming languages such as Java and so on.
One of the VM developed is the Dalvik VM that is used in an Android operating system. Unlike, Java VMs, which are stack-based, Dalvik VM is register-based. Stack-based machines use instructions to load data on the stack and manipulate the data, and thus requiring more instructions than register-based machines to implement the same high-level code. But the instructions in a register-based machine encode source and destination registers, therefore tend to be larger.
Further, Java programs are compiled to Java bytecode. The bytecode, which is essentially the instructions for the Java Virtual Machine, enables the distribution of programs in a safe architecture-neutral format. A tool called Dex is used by Android to convert stack-based Java bytecode files to the virtual-register based dexcode. Multiple classes can be included in a single dex file so, duplicate strings and other constants used in multiple class files are included only once in the dex output to conserve space.
Interpretation is inherently slower than running the code native. However, as most of the byte-code(dynamic-loading) may not be present at application launch time, offline compilation of the dexcode is not a practical solution. The luxury of offline compilation of the entire dexcode to native is not possible for two reasons. Firstly, because of the dynamic loading feature of Java (where some code may have to be downloaded from the Internet), the entire dexcode may not be available. Secondly, even if the entire code was available, compiling to native takes a lot of time. Delaying the application launch-time just to compile upfront everything does not translate to a very good user-experience. For these two reasons, the DVM starts off interpreting. However, some parts of the code that are repeatedly executed, the interpreter and associated logic can decide to JIT compile them to native.
A significant component of the Android is the Dalvik Virtual Machine (DVM) that interprets client applications codes written in Java and compiled to dexcode. Since interpretation is inherently slow, virtual machines typically employ just-in-time (JIT) compilation. In the Froyo 2.2 release of Android, DVM added the JIT compiler that selectively compiles hot-traces to native ARM code. The DVM interpreter passes hot-traces to the JIT compiler for native-compilation. The JIT runs as a separate thread and picks up the traces to compile from its work-queue. As part of the compilation, the JIT includes a number of optimizers such as constant-folding, induction variable analysis. It also includes an array-bounds check optimizer.
Some crucial optimizations such as array bounds-check optimizations (ABCO) have been implemented in the DVM-JIT compiler; however, in the existing system ABCO in DVM JIT limits its capabilities to indices that are "iterator plus a constant".
Array bound check in a Java language: In Java language before any array referencing, the index expression is checked whether is not less than 0 (lower bound check) and not greater than array length minus 1 (upper bound check). If these checks fail, an out of bounds exception must be thrown at that program point. Performing bounds check with every array access significantly slow down programs with high array referencing. Some of the bounds check may be proven to be fully redundant. Further, there are techniques to eliminate such fully redundant checks. For example, if we allocate an array of length L and index it as a[i] in a for loop where the iterator 'i' increments by one in each iteration and Ifirst is zero and Ilast is L-1, then there is no need to perform checks. Such fully-redundant-checks can be safely eliminated without violating Java language semantics as many theorem-based and range-based approaches exist for this. Some checks are not full-redundant and cannot be eliminated completely because the index-value is input to the program, so there is a need to analyze for partially-redundant (i.e. unnecessarily duplicate) checks. In the previous example, if the array length is compile-time unknown then lower bound check is redundant as Ifirst is zero and upper bound checks is partially-redundant as it needs be performed only once at the beginning of the loop where the iterator last value Ilast equal to L-1, is compared with the array length, and thus is the combination of loop-hoisting combined with range-analysis.
The problem of array bounds check optimization (i.e. eliminating fully-redundant checks and removing redundancies in partially-redundant checks) has been addressed as either one of the following (or combinations of them, in case of comprehensive solutions) (a) range propagation, (b) range analysis, (c) loop-counting, (d) inequality graph traversal, and (d) symbolic analysis of inequality constraints (theorem-provers).
Programs can be analyzed to determine bounds on the range of values assumed by variables as various program points. This range information can then be used to eliminate redundant checks. One of the solution in the prior art, decomposes the range problem into three parts - first one is range propagation, an algorithm that uses data and conditional structure of program to derive and propagate refinements in the accuracy of range information. Range propagation is not inductive, so presence of loop limits the utility of derived results. Secondly, range analysis tracks modifications applied to variable at each program point but it disregards control structure. Finally, by combining the two is a technique called loop-counting which derives bounds on the number of times inductive process of a loop needs to be applied.
Another solution deals with array bounds check elimination algorithm for the Java HotSpot Client Compiler. This solution for hoisted checks the exception is thrown at exactly the array index access point that violates the boundary condition instead of at beginning of the loop. For example, two references to the same array where the index expression differs only by a constant are grouped together for bounds checking. For example, in the following code: a[i] = a[i+1]+a[i+2]; it is sufficient to check that i ≥ 0 and (i+2) < a.length. But this approach has limitations that it can only handle array index which is loop iterator plus a constant.
Another solution employs a demand-driven array bounds check elimination (ABCD) algorithm. ABCD works by adding a few edges to the Static Single Assignment (SSA) value graph and performing simple traversal of the inequality-graph to conclude if the check is redundant and therefore can be eliminated. However, even ABCD works with sparse representation and can only handle iterators and constants. These solutions cannot handle scenarios where the array indices are combination of loop invariants, function of iterators and literals.
Due to the aforementioned reasons it is evident that existing solutions are not capable of handling complex scenarios where the array indices are other than iterators plus a constant. Hence, there is a need of an efficient method that can handle complex scenarios well and eliminates partially redundant checks thereby increasing the speed of execution.
An aspect of the present invention is to provide a method and an apparatus for identifying optimizable partially redundant array bounds checks and eliminate them.
Another aspect of the present invention is to provide a method and an apparatus for handling array indices that are combination of functions of iterators, loop invariants and literals.
Accordingly the invention provides a method for optimizing array bounds checks in JIT complier by hoisting the checks outside a loop. The method comprising steps of checking for array references for optimization, creating a valid expression tree table (VETT) employing pre-defined definitions for the array references, analyzing the array references in view of the valid expression tree table (VETT), and hoisting the array references outside the loop for performing the check only once during execution of the loop.
Accordingly the invention provides a computer program product embodied in a computer readable medium including program instructions which when executed by a processor cause the processor to perform a method for optimizing array bounds checks in JIT complier by hoisting the checks outside a loop. The method comprising checking for array references for optimization, creating a valid expression tree table (VETT) employing pre-defined definitions for the array references, analyzing the array references in view of the valid expression tree table (VETT), and hoisting the array references outside the loop for performing the check only once during execution of the loop.
These and other aspects of the embodiments herein will be better appreciated and understood when considered in conjunction with the following description and the accompanying drawings. It should be understood, however, that the following descriptions, while indicating preferred embodiments and numerous specific details thereof, are given by way of illustration and not of limitation. Many changes and modifications may be made within the scope of the embodiments herein without departing from the spirit thereof, and the embodiments herein include all such modifications.
This invention is illustrated in the accompanying drawings, throughout which like reference letters indicate corresponding parts in the various figures. The embodiments herein will be better understood from the following description with reference to the drawings, in which:
FIG. 1 illustrates an existing operating system and virtual machine environment, as disclosed herein,
FIG. 2 depicts a method for optimizing partially redundant checks in an array reference, according to embodiments as disclosed herein,
FIG. 3 illustrates a value expression tree table (VETT), according to embodiments as disclosed herein,
FIG. 4 illustrates an example of optimizing array bounds checks, according to embodiments as disclosed herein,
FIG. 5 is a graph depicting normalized execution time of benchmarks after array bounds check optimization, according to embodiments as disclosed herein,
FIG. 6 is a graph depicting the cost breakdown of applying the method for array bounds check optimization, according to embodiments as disclosed herein, and
FIG. 7 illustrates a computing environment implementing the application as disclosed in an embodiment herein.
The embodiments herein and the various features and advantageous details thereof are explained more fully with reference to the non-limiting embodiments that are illustrated in the accompanying drawings and detailed in the following description. Descriptions of well-known components and processing techniques are omitted so as to not unnecessarily obscure the embodiments herein. The examples used herein are intended merely to facilitate an understanding of ways in which the embodiments herein can be practiced and to further enable those of skill in the art to practice the embodiments herein. Accordingly, the examples should not be construed as limiting the scope of the embodiments herein.
The embodiments herein achieve a method for eliminating partially redundant array bounds check in Java based JIT complier. Referring now to the drawings, and more particularly to FIGS. 1 through 7, where similar reference characters denote corresponding features consistently throughout the figures, there are shown preferred embodiments.
A method for identifying and eliminating partially redundant array bounds checks in DVM is disclosed. The method employs an algorithm that is capable of eliminating array bound checks for complex indices that comprise of a combination of iterators, loop invariants and constants. The method identifies array references that may be hoisted outside the loop for optimization of the checks. Further, a valid expression tree table is constructed for the reference and the partially redundant checks are eliminated by hoisting newly generated check out of the loop.
FIG. 1 illustrates an existing operating system and virtual machine environment, as disclosed herein. The figure depicts existing Operating system (OS) environment. The OS may be an Android OS 101 for the purposes of the application. The OS 101 comprises of a virtual machine VM 102 that resides on the OS 101. The VM 102 may be a Dalvik VM. The DVM 102 supports Java programming language and enables execution of Java programs on it. For the purpose, of execution the DVM 102 comprises an interpreter 103 and a complier 104. The complier is a JIT complier 104 that complies Java codes to native codes.
Unlike Java VMs which are stack-based, DVM is register-based. Stack-based machines use instructions to load data on the stack and manipulate that data, and, thus, require more instructions than register machines to implement the same high- level code. But the instructions in a register machine must encode the source and destination registers and, therefore, tend to be larger.
Java programs are compiled to Java bytecode. The bytecode, which is essentially the instructions for the Java Virtual Machine, enables the distribution of programs in a safe, architecture-neutral format. A tool called Dex is used by Android to convert stack-based Java bytecode files to the virtual-register based dexcode. Multiple classes can be included in a single dex file. Duplicate strings and other constants used in multiple class files are included only once in the dex output to conserve space.
Interpretation 103 is inherently slower than running the code native. However, as most of the byte-code (dynamic-loading) may not be present at application launch time, offline compilation of the dexcode is not a practical solution. As a result Dalvik, since the Froyo 2.2 release, Android has incorporated a just-in-time (JIT) compiler into it.
The DVM interpreter passes hot-traces to the JIT compiler 104 for native-compilation. The JIT 104 runs as a separate thread and picks up the traces to compile from its work-queue. As part of the compilation, the JIT 104 includes a number of optimizers such as constant-folding, induction variable analysis. It also includes an array-bounds check optimizer.
FIG. 2 depicts a method for optimizing partially redundant checks in an array reference, according to embodiments as disclosed herein. The algorithm for eliminating partially redundant array bounds checks is disclosed in this method. Consider a Java program that comprises of many references to array. At first the algorithm checks (201) for array references that may be optimized. For this, there are no checks conducted within the loops. The check is made by identifying instructions with opcode AGET or APUT and that array bounds check has not already been optimized away (flag MIR_IGNORE_RANGE_CHECK set) and so on. If found (202), the process moves further with the algorithm execution. In case there are no such array optimizations possible, the method exits (203).
Further, when there is identified optimization possible, the algorithm starts (204) building a valid expression tree. For this purpose, the algorithm refers to some pre-defined variables and their entries in the Static Single Assignment (SSA) register. The obtained expression tree table and its corresponding information are stored (205) as an attribute to the SSA register. Further, the array references are analyzed (206). During this step, a look up to the VETT through SSA registers gives the array references that may be optimized and how the expression tree may be generated. If there are any expression to array references that may be hoisted (207) outside the loop these references are hoisted based on their pre-defined representations. Thus, eliminating (208) the need for performing redundant checks to such references. If not, the process exits. The various actions in the method 200 can be performed in the order presented, in a different order or simultaneously. Further, in some embodiments, some actions listed in FIG. 2 can be omitted.
In an embodiment, to explain array-bounds algorithm considers the running example shown below. In this code, there is a simple for loop wherein an array is accessed using the iterator i. All other complexities are abstracted away.
For { i=L; i< U; i++} {
a[i+d-c] = i+77;
}
On identifying the above optimize-able loop, a check is made if there are any array references (e.g. instructions with opcode AGET or APUT), whose array bounds check has not already been optimized away (flag MIR_IGNORE_RANGE_CHECK set). If no such arrays references exist, further analysis for this trace is skipped. Further, the valid expression tree-table (VETT) is built. In order to build the tree each SSA register is pre-defined or classified as either a biv, liv, Δ, div, ddv or unresolved.
The definitions are given below:
1. biv: The min and max values of the basic induction variable are bivmin and bivmax.
2. liv: is the loop-invariant variable. This particular Dalvik virtual register does not get redefined at any point in the loop body.
3. Δ: literal or constant. It could be a constant or a value stored in a register (identified through constant propagation) whose value is compile-time known.
4. div: derived independent variable. The div is formed by an operation (e.g. add, sub, multiply, logical and etc) on liv, Δ, and div.
5. ddv: derived dependent variable is formed by an operation on biv with Δ, liv or div. Also, any operation of ddv with Δ, liv or div results in a ddv.
6. unresolved: Either we have not processed this SSA register yet or its value is the result of an incompatible computation.
The definitions are employed and the Table 1 below is constructed. Table 1 depicts Generation of derived independent variable (div) and derived dependent variable (ddv).
Table 1
biv liv Δ div ddv
biv - ddv ddv ddv -
liv ddv div div div ddv
Δ ddv div - div ddv
div ddv div div div ddv
ddv - ddv ddv ddv -
In other words, ddv is an SSA register whose value is computed through an expression-tree in which there a single appearance of biv term. Other than that, any number of Δ, liv terms or div expressions can appear in the ddv expression-tree. The generation of div and ddv through different combining operations is given in Table 1 where, for example, we see that
Figure PCTKR2012002147-appb-I000001
. As we do not optimize array expressions with multiple appearances of the iterator (e.g. i*i), some table entries e.g. -
Figure PCTKR2012002147-appb-I000002
are undefined and they cannot be optimized. The expression-tree information (about ddv, div, liv, biv) is stored as an attribute to the SSA register. This is the VETT (valid expression tree table) creation. Look up into the VETT, through SSA attributes, tells us which arrays references can be optimized and how the expression tree can be generated. The generation of VETT using the running example of array reference "a[i+d-c]", the SSA assignment for which was illustrated in Figure 3, is described next.
FIG. 3 illustrates a value expression tree table (VETT), according to embodiments as disclosed herein. Each SSA register is initially marked as a biv, liv, Δ or unresolved. The algorithm walks through the instructions in the trace, building the VETT as follows. Given an instruction, check is made if it is a compatible-computation type (e.g. 1 .div. biv is an incompatible-computation). If yes, the attributes of the operands (i.e. the attributes of the SSA registers) are used to define the attribute of the result SSA register (defined) by reading Table 1. For instance, in Figure 3, SSA register s8, has the attribute biv and the operator is nill and operand 1 and 2 are nill. In s2, the attribute is liv, the operator is nill and operand 1 and 2 are nill. Further, s8 (is the biv) is added to s2
Figure PCTKR2012002147-appb-I000003
(liv d). The result (i.e. i+d) in SSA register s9 is therefore a ddv. This follows
Figure PCTKR2012002147-appb-I000004
from the entry in Table 1. On similar lines, next s9 is subtracted from s3 (v3_0 which is a liv). The result (i+d-c) stored in SSA register s10 (v5_2) is again ddv as per the entry in Table 1.
FIG. 4 illustrates an example of optimizing array bounds checks, according to embodiments as disclosed herein. The embodiments herein indicate the actions to be taken for hoisting a check out of the loop. During the execution, each instruction is checked (401) for its computational compatibility. If the instruction is compatible (402) for optimization then VETT tree is constructed and SSA registers are employed for executing the code. If not compatible, then the process exits (403).
The operands and the results of the instruction execution are assigned (404) to the SSA registers. Then the attribute value is checked and a reference is made (405) to the table given below table 2 to determine if the check may be hoisted. The below table 2 depicts code hoisting possibilities for the array bounds check. Whether the check can be hoisted and how depends on the attributes of the array indexing SSA register. For example, Let the SSA register used to index into an array be idx. The VETT attribute of idx tells 1. Whether the array boundary check can be hoisted 2. What code to generate for the hoisted checks. For example, in the running example SSA register s10 indexes into an array. s10.attribute is ddv. Therefore, the checks for this referencing can be hoisted (406) out of the loop. Thus eliminating redundant array references and repeated execution. If the s10.attribute was set as unresolved, then the check cannot be hoisted out of the loop and process ends (403). The various actions in the method 400 can be performed in the order presented, in a different order or simultaneously. Further, in some embodiments, some actions listed in FIG. 4 can be omitted.
Table 2
attribute action
biv Hoist the check "(unsigned) biv max < a m .length".
liv Hoist the check "(unsigned) liv < a m .length".
div Reproduce the expression-tree (generate code) at the pre-header to the loop, using temporaries. Generate check "(unsigned) div < a m .length".
ddv Reproduce two expression-trees (generate code) at the pre-header of the loop. In the first generated code, replace biv with biv min In the second generated code, replace biv with biv max . Generated hoisted check "div min ≥ 0" and "div max < a m .length"
In an embodiment, referring to the table 2 above the process of generating hoisted code for array references may be discussed. In an example, if the array index SSA register attribute is liv, to remove the check from inside the loop to outside the loop (partial redundancy elimination), one must reproduce the check "(unsigned) liv ≥ 0" in the pre-header of the loop. Two checks are required for ddv type expressions. The lower bound check code is generated by substituting the biv with the bivmin (which will be either a constant or a loop-invariant) in the expression tree. The upper bound check is generated substituting the biv with the bivmax (which will be either a constant or a loopinvariant) in the expression. Reproducing the expression tree is easy. One simply has to simply read the entries in the VETT. For example, in the running example we note that s10 is used to index into array (reference through s1). s10.attribute is ddv. VETT entry also tells us that s10 ≤ s9 - s3. In this manner, by following the entries in VETT one can reproduce the entire expression tree for s10 in the pre-header of the loop. There are just two things to worry about. Firstly, all writes must be to temporaries as we do not want to corrupt contents of Dalvik registers that may be required later on. Secondly, as mentioned before, the biv in the generated code must be substituted by bivmax or bivmin, depending on the upper-bound or lower-bound check.
In an embodiment, implemented techniques described herein into the Dalvik Virtual Machine (Froyo/Gingerbread) JIT compiler. The technique kicks in only when the default array-bound check of Froyo/Gingerbread is unable to optimize all the array references in the given trace. If there are no array-references in the trace or all of them have already been optimized, technique does not start. If the array index expression is not a linear function of loop iterator, but is instead some nonlinear function, then it may not be monotonically increasing or decreasing function and so finding the min and max value attained by the index expression can get quite computationally expensive. Such cases occur rarely in practice and so one is justified sticking to linear functions. The below Table 3 depicts benchmarks used for measuing performance.
Table 3
Name Description
PNG-K kernel of EEMBC PNG (portable networks graphics) Benchmark.
Vec-Mult multiplication of a vector with a matrix
Mot-Est motion estimation where each block is compared with other blocks to find the minimum difference
Blur image processing application kernel.
Echo audio processing application
The experimental results are presented using the following benchmarks. Naturally, only in kernels where there are array references do we expect to see gains. Also, proposed technique does not incur any overhead if there is no un-optimized bounds check in the trace. Therefore, applications that are not array intensive are not helped nor hurt by the technique. The main source of gains from the technique is that array bounds check which in the default DVM JIT-generated code would occur inside the inner-most loop of the hot section of codes (trace) are hoisted out of the loop.
A hot section of the code is JIT compiled when the interpreter observes that it has executed (interpreted) the same code beyond a pre-determined JIT_THRESHOLD. Then the trace is submitted to JIT compiler. The JIT compiler translates the dexcode to an equivalent native (e.g. ARM) code. One step in the JIT compiler is optimization such as constant-folding and array-bounds check optimization. The JIT compilation is useful only if the compiled code is executed multiple times in the future to amortize the overhead of JIT compilation. The same holds true for array-bounds check. For elimination whether it is our technique or any other partially/fully redundant array bounds check elimination technique. For brevity, in the following explanation we abbreviate our technique as ABCO (array bounds check optimization).
FIG. 5 is a graph depicting normalized execution time of benchmarks after array bounds check optimization, according to embodiments as disclosed herein. In Figure 5 we show the normalized execution time. The interpretation of the columns is as follows. The columns for each benchmark show the ratio of execution time with ABCO applied or without ABCO applied. If the loop executes only for 10 iterations (leftmost column) then there is no gain. In fact, applying ABCO makes the performance worse (e.g. 4.5 times worse in case of PNG-K) because of ABCO analysis overhead. That overhead does not get amortized as the loop runs only for 10 iterations. When the loop iterates for at least 100 times, there is almost break even. When the loop iterates for more than 100 times, the reduction in execution time is significant. The overhead of ABCO becomes negligible when the loop iterates for more than 1000.
FIG. 6 is a graph depicting the cost breakdown of applying the method for array bounds check optimization, according to embodiments as disclosed herein. As mentioned before, there is no cost if no un-optimized array references exist. The start-up and clean-up cost of ABCO is usually small (see Figure 6). The main cost is in building the VETT and the generation of hoisted checks. Building VETT cost is proportional to the size of the trace. As DVM compiles only one basic block at a time this cost is low. The generation of hoisted check cost is proportional to the number of instructions resulting in the index.
The proposed technique is especially effective for embedded devices such as mobile phones running Java based virtual machine (e.g. Dalvik virtual machine). The proposed technique kicks in only when the default array-bound check is unable to optimize all the array-references in the given trace and this minimizes overhead of our technique. Proposed technique obtains average 30% speedup on array intensive application kernels.
FIG. 7 illustrates a computing environment implementing the application as disclosed in an embodiment herein. As depicted the computing environment comprises at least one processing unit 710 that is equipped with a control unit 711 and an Arithmetic Logic Unit (ALU) 713, a memory 730, a storage unit 750, plurality of networking devices 770, and a plurality Input output (I/O) devices 790. The processing unit 710 is responsible for processing the instructions of the algorithm. The processing unit 710 receives commands from the control unit 711 in order to perform its processing. Further, any logical and arithmetic operations involved in the execution of the instructions are computed with the help of the ALU 713. Processing unit 710 can support more than one threads.
The overall computing environment can be composed of multiple homogeneous and/or heterogeneous cores, multiple GPUs of different kinds, special media and other accelerators. The processing unit 710 is responsible for processing the instructions of the algorithm. The processing unit 710 receives commands from the control unit 711 in order to perform its processing. Further, any logical and arithmetic operations involved in the execution of the instructions are computed with the help of the ALU 713. Further, the plurality of process units may be located on a single chip or over multiple chips.
The instructions and codes required for the implementation are stored in either the memory unit 730 or the storage 750 or both. At the time of execution, the instructions may be fetched from the corresponding memory 730 and/or storage 750, and executed by the processing unit 710.
In case of any hardware implementations various networking devices 770 or external I/O devices 790 may be connected to the computing environment to support the implementation through the networking unit and the I/O device unit 790.
The embodiments disclosed herein can be implemented through at least one software program running on at least one hardware device and performing network management functions to control the elements. The elements shown in Figs. 1 include blocks which can be at least one of a hardware device, or a combination of hardware device and software module.
Certain exemplary embodiments of the present invention can also be embodied as computer-readable codes on a computer-readable recording medium. The computer-readable recording medium is any data storage device that can store data which can thereafter be read by a computer system. Examples of the computer-readable recording medium include, but are not limited to, read-only memory (ROM), random-access memory (RAM), CD-ROMs, magnetic tapes, floppy disks, optical data storage devices, and carrier waves (such as data transmission through the Internet). The computer-readable recording medium can also be distributed over network-coupled computer systems so that the computer-readable code is stored and executed in a distributed fashion. Also, functional programs, codes, and code segments for accomplishing the present invention can be easily construed as within the scope of the invention by programmers skilled in the art to which the present invention pertains.
The foregoing description of the specific embodiments will so fully reveal the general nature of the embodiments herein that others can, by applying current knowledge, readily modify and/or adapt for various applications such specific embodiments without departing from the generic concept, and, therefore, such adaptations and modifications should and are intended to be comprehended within the meaning and range of equivalents of the disclosed embodiments. It is to be understood that the phraseology or terminology employed herein is for the purpose of description and not of limitation. Therefore, while the embodiments herein have been described in terms of preferred embodiments, those skilled in the art will recognize that the embodiments herein can be practiced with modification within the spirit and scope of the embodiments as described herein.

Claims (13)

  1. A method for optimizing array bounds checks in JIT complier by hoisting said checks outside a loop, said method comprising:
    checking for array references for optimization;
    creating a valid expression tree table (VETT) employing pre-defined definitions for said array references;
    analyzing said array references in view of said VETT; and
    hoisting said array references outside said loop for performing said check only once during execution of said loop.
  2. The method as in claim 1, wherein said creating comprises:
    generating expression tree information from said pre-defined definitions; and
    storing said expression tree information in static single assignment (SSA) register for generating said VETT table.
  3. The method as in claim 2, wherein said expression tree information comprises: pre-defined relationships among at least one of basic induction variable, loop invariant variable, literals, derived independent variable, and derived dependent variable.
  4. The method as in claim 2, wherein said expression tree information is stored as attribute in said SSA registers.
  5. A system for optimizing array bounds checks in a JIT complier by hoisting said checks outside loop, said system configured for performing steps as claimed in at least one of claims 1 to 4.
  6. The system as in claim 5, wherein said system operates in a Java based Dalvik virtual machine environment.
  7. A computer program product embodied in a computer readable medium including program instructions which when executed by a processor cause the processor to perform a method for optimizing array bounds checks in JIT complier by hoisting said checks outside a loop, said method comprising:
    checking for array references for optimization;
    creating a valid expression tree table (VETT) employing pre-defined definitions for said array references;
    analyzing said array references in view of said VETT; and
    hoisting said array references outside said loop for performing said check only once during execution of said loop.
  8. The method as in claim 1 or the computer program product as in claim 7, wherein said checking comprises analyzing instructions in the code for array references and checking if said references are not optimized.
  9. The computer program product as in claim 7, wherein said creating comprises:
    generating expression tree information from said pre-defined definitions; and
    storing said expression tree information in static single assignment (SSA) register for generating said VETT table.
  10. The computer program product as in claim 9, wherein said expression tree information comprises: pre-defined relationships among at least one of basic induction variable, loop invariant variable, literals, derived independent variable, and derived dependent variable.
  11. The computer program product as in claim 9, wherein said expression tree information is stored as attribute in said SSA registers.
  12. The method as in claim 1 or the computer program product as in claim 7, wherein said analyzing comprises determining code hoisting possibilities for said array bounds checks.
  13. The method as in claim 1 or the computer program product as in claim 7, wherein said hoisting comprises checking for attributes of array indexing SSA registers and their corresponding actions for hoisting said checks.
PCT/KR2012/002147 2011-03-26 2012-03-23 Method and apparatus for eliminating partially redundant array bounds checks in an embedded compiler WO2012134122A2 (en)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
IN951CH2011 2011-03-26
IN951/CHE/2011 2011-03-26

Publications (2)

Publication Number Publication Date
WO2012134122A2 true WO2012134122A2 (en) 2012-10-04
WO2012134122A3 WO2012134122A3 (en) 2012-12-27

Family

ID=46932086

Family Applications (1)

Application Number Title Priority Date Filing Date
PCT/KR2012/002147 WO2012134122A2 (en) 2011-03-26 2012-03-23 Method and apparatus for eliminating partially redundant array bounds checks in an embedded compiler

Country Status (1)

Country Link
WO (1) WO2012134122A2 (en)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2019061783A1 (en) * 2017-09-29 2019-04-04 武汉斗鱼网络科技有限公司 Data test method and apparatus, electronic device and computer-readable storage medium
CN110083337A (en) * 2019-04-03 2019-08-02 江苏梦立渊软件技术有限公司 A kind of software development optimization method
WO2022269396A1 (en) * 2021-06-21 2022-12-29 International Business Machines Corporation Increasing index availability in databases

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020029332A1 (en) * 2000-03-08 2002-03-07 Ashley Saulsbury Processing architecture having an array bounds check capability
US6519765B1 (en) * 1998-07-10 2003-02-11 International Business Machines Corporation Method and apparatus for eliminating redundant array range checks in a compiler
EP1387265A1 (en) * 2002-08-02 2004-02-04 Telefonaktiebolaget L M Ericsson (Publ) Optimised code generation
US20050257096A1 (en) * 2004-04-26 2005-11-17 International Business Machines Corporation Modification of array access checking in AIX

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6519765B1 (en) * 1998-07-10 2003-02-11 International Business Machines Corporation Method and apparatus for eliminating redundant array range checks in a compiler
US20020029332A1 (en) * 2000-03-08 2002-03-07 Ashley Saulsbury Processing architecture having an array bounds check capability
EP1387265A1 (en) * 2002-08-02 2004-02-04 Telefonaktiebolaget L M Ericsson (Publ) Optimised code generation
US20050257096A1 (en) * 2004-04-26 2005-11-17 International Business Machines Corporation Modification of array access checking in AIX

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2019061783A1 (en) * 2017-09-29 2019-04-04 武汉斗鱼网络科技有限公司 Data test method and apparatus, electronic device and computer-readable storage medium
CN110083337A (en) * 2019-04-03 2019-08-02 江苏梦立渊软件技术有限公司 A kind of software development optimization method
CN110083337B (en) * 2019-04-03 2023-01-03 江苏梦立渊软件技术有限公司 Software development optimization method
WO2022269396A1 (en) * 2021-06-21 2022-12-29 International Business Machines Corporation Increasing index availability in databases

Also Published As

Publication number Publication date
WO2012134122A3 (en) 2012-12-27

Similar Documents

Publication Publication Date Title
US11385872B2 (en) Extending a virtual machine instruction set architecture
US20190243623A1 (en) Handling value types
US9104449B2 (en) Optimized execution of dynamic languages
US6412108B1 (en) Method and apparatus for speeding up java methods prior to a first execution
US7124407B1 (en) Method and apparatus for caching native code in a virtual machine interpreter
CN106033370B (en) Method and device for realizing 64-bit Java virtual machine
US10042621B2 (en) Migration of executing processes
Grimmer et al. Trufflec: Dynamic execution of c on a java virtual machine
US7065755B2 (en) Method and apparatus for removing class initialization barriers from shared compiled methods
US7739674B2 (en) Method and apparatus for selectively optimizing interpreted language code
Rossberg Webassembly specification
WO2012134122A2 (en) Method and apparatus for eliminating partially redundant array bounds checks in an embedded compiler
Aslam et al. Optimized java binary and virtual machine for tiny motes
US7032230B2 (en) Efficient virtual function calls for compiled/interpreted environments
US11379195B2 (en) Memory ordering annotations for binary emulation
Coffin et al. MicroJIT: a case for templated just-in-time compilation in constrained environments
Goss Machine code optimization-improving executable object code
Zhang et al. RegCPython: A Register-based Python Interpreter for Better Performance
Absar et al. Eliminating partially-redundant array-bounds check in the Android Dalvik JIT compiler
JP2022522880A (en) How to generate representations of program logic, decompilers, recompile systems and computer program products
Mohan Comparative Analysis Of JavaScript And WebAssembly In The Browser Environment
US20130173682A1 (en) Floating-point error propagation in dataflow
US20240134666A1 (en) Hybrid just in time load module compiler with performance optimizations
Brunthaler Speculative staging for interpreter optimization
Pammer Fast Machine-code generation for stack-based languages

Legal Events

Date Code Title Description
121 Ep: the epo has been informed by wipo that ep was designated in this application

Ref document number: 12764264

Country of ref document: EP

Kind code of ref document: A2

NENP Non-entry into the national phase in:

Ref country code: DE

122 Ep: pct application non-entry in european phase

Ref document number: 12764264

Country of ref document: EP

Kind code of ref document: A2