RFR (S): 8021898: Broken JIT compiler optimization for loop unswitching

Vladimir Kozlov vladimir.kozlov at oracle.com
Tue Aug 13 16:15:53 PDT 2013


The problem is not in loop unswitching. Loop unswitching creates 
particular code shape (partialSubtypeCheck_vs_Zero mach node followed by 
cmovI_reg node) with which we hit the problem in RA.

RA clones the node producing flag (partialSubtypeCheck_vs_Zero) and 
place it near user (cmovI_reg) in split_Rematerialize(). When a node is 
cloned RA also should clone related MachProj nodes which indicate KILLed 
flags and registers (effect(KILL rcx, KILL result)). The problem is RA 
clones only one MachProj node in  PhaseChaitin::clone_projs_shared().

The fixed is to clone all related MachProj nodes. The method 
clone_projs() returns number of cloned MachProj nodes.

The increment of max_lrg_id is moved inside clone_projs_shared() which 
is renamed to clone_projs() since we don't need second version of 

I also fixed/modified output in hs_err file in case VM crash in compiled 

Compiled frame output now has compile_id, compiler name, bytecode size, 
and offset in the code is hex:

# J 61 C2 
t;)Ljava/util/List; (116 bytes) @ 0xfffffd7ff8f26907 


# J 
@ 0xfffffd7ff8f2a837 [0xfffffd7ff8f29280+5559]

I also added java frames prints in "Native frames:" during error report 
(hs_err). Before it printed only last compiled frame and stopped because 
C2 compiled frame trash EBP. Note: hs_err file does not have "Java 
frames:" in such case because it is guarded by has_last_Java_frame() and 
error reporting is called from signal processing code so last frame is 
native, I assume it is the reason - I did not investigated it in deap.


More information about the hotspot-compiler-dev mailing list