Closed JasonFengJ9 closed 3 years ago
This issue is same as https://github.com/eclipse-openj9/openj9/issues/13502 https://github.com/eclipse/omr/pull/6179 will fix this.
The crash occurs at OMR::ARM64::Machine::freeBestRegister
and the reason is that there are no available registers to free.
#13 OMR::ARM64::Machine::freeBestRegister (this=this@entry=0xffff604065a0,
currentInstruction=currentInstruction@entry=0xffff60816060, virtualRegister=virtualRegister@entry=0xffff60811730,
forced=forced@entry=0x0)
at /home/jenkins/workspace/Build_JDK17_aarch64_linux_Personal/omr/compiler/aarch64/codegen/OMRMachine.cpp:314
#14 0x0000ffffb3d7a948 in OMR::ARM64::Machine::assignOneRegister (this=this@entry=0xffff604065a0,
currentInstruction=currentInstruction@entry=0xffff60816060, virtualRegister=virtualRegister@entry=0xffff60811730)
at /home/jenkins/workspace/Build_JDK17_aarch64_linux_Personal/omr/compiler/aarch64/codegen/OMRMachine.cpp:632
#15 0x0000ffffb3d55640 in TR::ARM64CompareBranchInstruction::assignRegisters (this=0xffff60816060,
kindToBeAssigned=TR_GPR)
at /home/jenkins/workspace/Build_JDK17_aarch64_linux_Personal/omr/compiler/aarch64/codegen/ARM64Instruction.cpp:746
(gdb) up 13
#13 OMR::ARM64::Machine::freeBestRegister (this=this@entry=0xffff604065a0,
currentInstruction=currentInstruction@entry=0xffff60816060, virtualRegister=virtualRegister@entry=0xffff60811730,
forced=forced@entry=0x0)
at /home/jenkins/workspace/Build_JDK17_aarch64_linux_Personal/omr/compiler/aarch64/codegen/OMRMachine.cpp:314
(gdb) p candidates[0]
$1 = (TR::Register *) 0x0
The register dependency of the instruction has 25 integer register entries which means there are no more available integer registers.
Because https://github.com/eclipse/omr/pull/6178 changed TR::ARM64CompareBranchInstruction::assignRegisters
to block virtual regs in register dependency before assigning source1Register,
it now crashes when the register dependency has too many registers. Previously, the register assigned to the register dependency was spilled and incorrect code was generated (as in https://github.com/eclipse-openj9/openj9/issues/13502).
https://github.com/eclipse/omr/pull/6179 prevents too many registers are added to the register dependency for compare branch instructions.
(gdb) up
#15 0x0000ffffb3d55640 in TR::ARM64CompareBranchInstruction::assignRegisters (this=0xffff60816060,
kindToBeAssigned=TR_GPR)
at /home/jenkins/workspace/Build_JDK17_aarch64_linux_Personal/omr/compiler/aarch64/codegen/ARM64Instruction.cpp:746
746 /home/jenkins/workspace/Build_JDK17_aarch64_linux_Personal/omr/compiler/aarch64/codegen/ARM64Instruction.cpp: N$
such file or directory.
(gdb) p this
$2 = (TR::ARM64CompareBranchInstruction * const) 0xffff60816060
(gdb) p *this->_conditions
$5 = {<OMR::ARM64::RegisterDependencyConditions> = {<OMR::RegisterDependencyConditions> = {<No data fields>},
_preConditions = 0xffff608155a0, _postConditions = 0xffff60815840, _numPreConditions = 28, _addCursorForPre = 28,
_numPostConditions = 28, _addCursorForPost = 28}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[0]
$7 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080de10,
_realRegister = OMR::RealRegister::x15}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[1]
$8 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080dc50,
_realRegister = OMR::RealRegister::x14}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[2]
$9 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff60815b00,
_realRegister = OMR::RealRegister::x13}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[3]
$10 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff60815c00,
_realRegister = OMR::RealRegister::x12}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[4]
$11 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff60810ed0,
_realRegister = OMR::RealRegister::x11}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[5]
$12 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff60815d10,
_realRegister = OMR::RealRegister::x10}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[6]
$13 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080dcc0,
_realRegister = OMR::RealRegister::x9}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[7]
$14 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080dd30,
_realRegister = OMR::RealRegister::x8}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[8]
$15 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080dda0,
_realRegister = OMR::RealRegister::x18}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[9]
$16 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff60815e40,
_realRegister = OMR::RealRegister::x28}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[10]
$17 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080de80,
_realRegister = OMR::RealRegister::x27}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[11]
$18 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080def0,
_realRegister = OMR::RealRegister::x26}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[12]
$19 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080df60,
_realRegister = OMR::RealRegister::x25}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[13]
$20 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080dfd0,
_realRegister = OMR::RealRegister::x24}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[14
A syntax error in expression, near `'.
(gdb) p this->_conditions->_postConditions->_dependencies[14]
$21 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e040,
_realRegister = OMR::RealRegister::x23}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[15]
$22 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e0b0,
_realRegister = OMR::RealRegister::x22}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[16]
$23 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e120,
_realRegister = OMR::RealRegister::x21}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[17]
$24 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e190,
_realRegister = OMR::RealRegister::x7}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[18]
$25 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e200,
_realRegister = OMR::RealRegister::x6}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[19]
$26 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e270,
_realRegister = OMR::RealRegister::x5}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[20]
$27 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e2e0,
_realRegister = OMR::RealRegister::x4}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[21]
$28 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e350,
_realRegister = OMR::RealRegister::x3}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[22]
$29 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e3c0,
_realRegister = OMR::RealRegister::x2}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[23]
$30 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e430,
_realRegister = OMR::RealRegister::x1}, <No data fields>}
(gdb) p this->_conditions->_postConditions->_dependencies[24]
$31 = {<OMR::RegisterDependency> = {_flags = 3 '\003', _virtualRegister = 0xffff6080e4a0,
_realRegister = OMR::RealRegister::x0}, <No data fields>}
The corresponding IL in jitdump seems to be
n2510n ( 0) ificmpeq --> block_208 BBStart at n2519n () [ 0xffff91272050] bci=[18,25,3545
] rc=0 vc=5277 vn=- li=85 udi=- nc=3 flg=0x20
n2508n ( 0) instanceof jitInstanceOf[#87 helper Method] [flags 0x400 0x0 ] (in GPR_ 0xffff917c1a20) [ 0xffff91021fa0] bci=
[18,25,3545] rc=0 vc=5277 vn=- li=85 udi=6688 nc=2
n2911n ( 3) ==>aRegLoad (in &GPR_ 0xffff917bb8e0) (X!=0 SeenRealReference sharedMemory )
n2507n ( 0) aloadi <vft-symbol>[#250 Shadow] [flags 0x18607 0x0 ] (in GPR_ 0xffff917c1c60) (X!=0 sharedMemory ) [ 0xffff
91021f50] bci=[18,27,3545] rc=0 vc=5277 vn=- li=85 udi=7264 nc=1 flg=0x4
n2907n ( 6) ==>aRegLoad (in &GPR_ 0xffff917bb720) (X!=0 X>=0 SeenRealReference sharedMemory )
n1429n ( 1) ==>iconst 0 (X==0 X>=0 X<=0 )
n2945n ( 0) GlRegDeps () [ 0xffff9127a840] bci=[18,25,3545
] rc=0 vc=5277 vn=- li=85 udi=- nc=28 flg=0x20
n2939n ( 0) PassThrough x15 [ 0xffff9127a660] bci=[18,29,3545
] rc=0 vc=5277 vn=- li=85 udi=47328 nc=1
n2911n ( 3) ==>aRegLoad (in &GPR_ 0xffff917bb8e0) (X!=0 SeenRealReference sharedMemory )
n2940n ( 0) PassThrough x14 [ 0xffff9127a6b0] bci=[18,10,3543
] rc=0 vc=5277 vn=- li=85 udi=46880 nc=1
n2907n ( 6) ==>aRegLoad (in &GPR_ 0xffff917bb720) (X!=0 X>=0 SeenRealReference sharedMemory )
n2941n ( 0) PassThrough x13 [ 0xffff9127a700] bci=[18,29,3545
] rc=0 vc=5277 vn=- li=85 udi=47328 nc=1
n2911n ( 3) ==>aRegLoad (in &GPR_ 0xffff917bb8e0) (X!=0 SeenRealReference sharedMemory )
n2942n ( 0) PassThrough x12 [ 0xffff9127a750] bci=[18,10,3543
] rc=0 vc=5277 vn=- li=85 udi=46880 nc=1
n2907n ( 6) ==>aRegLoad (in &GPR_ 0xffff917bb720) (X!=0 X>=0 SeenRealReference sharedMemory )
n2943n ( 0) PassThrough x11 [ 0xffff9127a7a0] bci=[18,32,3546
] rc=0 vc=5277 vn=- li=85 udi=1360 nc=1
n2438n ( 1) ==>lshl (in GPR_ 0xffff917c0550) (X>=0 cannotOverflow )
n2944n ( 0) PassThrough x10 [ 0xffff9127a7f0] bci=[18,10,3543
] rc=0 vc=5277 vn=- li=85 udi=46880 nc=1
n2907n ( 6) ==>aRegLoad (in &GPR_ 0xffff917bb720) (X!=0 X>=0 SeenRealReference sharedMemory )
n2908n ( 1) ==>iRegLoad (in GPR_ 0xffff917bb790) (X>=0 cannotOverflow SeenRealReference )
n2909n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bb800)
n2910n ( 2) ==>aRegLoad (in &GPR_ 0xffff917bb870) (X!=0 X>=0 SeenRealReference sharedMemory )
n2911n ( 3) ==>aRegLoad (in &GPR_ 0xffff917bb8e0) (X!=0 SeenRealReference sharedMemory )
n2912n ( 1) ==>iRegLoad (in GPR_ 0xffff917bb950)
n2913n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bb9c0)
n2914n ( 1) ==>iRegLoad (in GPR_ 0xffff917bba30)
n2915n ( 2) ==>aRegLoad (in &GPR_ 0xffff917bbaa0)
n2916n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbb10)
n2917n ( 2) ==>aRegLoad (in &GPR_ 0xffff917bbb80)
n2918n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbbf0)
n2919n ( 2) ==>iRegLoad (in GPR_ 0xffff917bbc60)
n2920n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbcd0)
n2921n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbd40)
n2922n ( 1) ==>lRegLoad (in GPR_ 0xffff917bbdb0)
n2923n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbe20)
n2924n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbe90)
n2925n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbf00)
n2926n ( 1) ==>aRegLoad (in &GPR_ 0xffff917bbf70)
n2927n ( 1) ==>dRegLoad (in FPR_ 0xffff917bbfe0)
n2928n ( 1) ==>dRegLoad (in FPR_ 0xffff917bc050)
n2929n ( 1) ==>dRegLoad (in FPR_ 0xffff917bc0c0)
Closing as dup of 13502.
Failure link
From an internal build
job/Test_openjdk17_j9_sanity.openjdk_aarch64_linux_Personal/28/consoleFull
:Rerun in Grinder - Change TARGET to run only the failed test targets.
Optional info
Failure output (captured from console output)
fyi @Akira1Saitoh