Closed connglli closed 2 years ago
This is easily reproducible, on 0.32 and the latest.
@0xdaryl fyi
vmState [0x522ff]: {J9VMSTATE_JIT} {tacticalGlobalRegisterAllocator}
@a7ehuo : could you investigate this reproducible crash please? Note that it has been labeled a blocker for the 0.33 release so please give it higher priority.
The crash happened when the method Test.vMeth1()V
is compiled at scorching
. The crash is reproducible with JDK11 and other JDKs. The crash reason is that it access a removed/invalid block when traversing predecessor blocks in TR_RegisterCandidate::extendLiveRangesForLiveOnExit
[1].
In my reproduced case, when it extends live ranges due to live on exits for block_39
, one of the predecessor blocks is block_14
[2]. However block_14
has already been removed in redundantGotoElimination
[3]. Setting disableRedundantGotoElimination
also makes the crash to go away (the test app runs for a long time to complete). I'm continuing my investigation in redundantGotoElimination
on how blocks are removed.
[1]
Thread 4 "JIT Compilation" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffd4cb8700 (LWP 12408)]
TR_RegisterCandidate::extendLiveRangesForLiveOnExit (this=this@entry=0x7fffcdb8b780, comp=comp@entry=0x7fffcdb82000,
blocks=blocks@entry=0x7fffd4cae4b0, startOfExtendedBBForBB=...)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/RegisterCandidate.cpp:1680
1680 blocksVisited.set(currBlock->getNumber());
(gdb) bt
#0 TR_RegisterCandidate::extendLiveRangesForLiveOnExit (this=this@entry=0x7fffcdb8b780, comp=comp@entry=0x7fffcdb82000,
blocks=blocks@entry=0x7fffd4cae4b0, startOfExtendedBBForBB=...)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/RegisterCandidate.cpp:1680
#1 0x00007fffef93e8c2 in TR_RegisterCandidate::processLiveOnEntryBlocks (this=this@entry=0x7fffcdb8b780,
blocks=<optimized out>, blockStructureWeight=<optimized out>, comp=<optimized out>, blockGPRCount=...,
blockFPRCount=..., blockVRFCount=..., referencedBlocks=<optimized out>, startOfExtendedBBForBB=...,
callToRemoveUnusedLoops=<optimized out>)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/RegisterCandidate.cpp:1383
#2 0x00007fffef9406cd in TR_RegisterCandidate::setWeight (this=0x7fffcdb8b780, blocks=<optimized out>,
blockStructureWeight=<optimized out>, comp=<optimized out>, blockGPRCount=..., blockFPRCount=..., blockVRFCount=...,
referencedBlocks=<optimized out>, startOfExtendedBBForBB=..., firstBlocks=..., isExtensionOfPreviousBlock=...)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/RegisterCandidate.cpp:632
#3 0x00007fffef941ad7 in TR_RegisterCandidates::assign (this=0x7fffcdb8b3e0, cfgBlocks=cfgBlocks@entry=0x7fffd4cae4b0,
numberOfBlocks=numberOfBlocks@entry=48, lowestNumber=@0x7fffcdc9214c: 2147483647, highestNumber=@0x7fffcdc92150: -1)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/RegisterCandidate.cpp:2333
#4 0x00007fffef7c58b2 in TR_GlobalRegisterAllocator::perform (this=0x7fffcdc92120)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/GlobalRegisterAllocator.cpp:475
#5 0x00007fffef8f4d37 in OMR::Optimizer::performOptimization (this=this@entry=0x7fffcdc2d8b0,
optimization=optimization@entry=0x7fffefc33b28 <tacticalGlobalRegisterAllocatorOpts+40>,
firstOptIndex=firstOptIndex@entry=0, lastOptIndex=lastOptIndex@entry=2147483647, doTiming=doTiming@entry=0)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/OMROptimizer.cpp:2053
#6 0x00007fffef8f52c9 in OMR::Optimizer::performOptimization (this=this@entry=0x7fffcdc2d8b0,
optimization=optimization@entry=0x7fffefbc5b38 <scorchingStrategyOpts+408>, firstOptIndex=firstOptIndex@entry=0,
lastOptIndex=lastOptIndex@entry=2147483647, doTiming=doTiming@entry=0)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/OMROptimizer.cpp:1600
#7 0x00007fffef8f667b in OMR::Optimizer::optimize (this=0x7fffcdc2d8b0)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/optimizer/OMROptimizer.cpp:1128
#8 0x00007fffef6e5a97 in OMR::Compilation::performOptimizations (this=this@entry=0x7fffcdb82000)
at /root/home/ahuo/src/openj9-openjdk-jdk11/omr/compiler/compile/OMRCompilation.cpp:1267
...
[2]
Extending live ranges due to live on exits
extendLiveRangesForLiveOnExit: block_39
extendLiveRangesForLiveOnExit: e 00007FFFD4CAD6E8 *e 00007FFFCDBA3CC0 CFGNode 00007FFFCDBD2C20 pred block_14 (0x00007FFFCDBD2C20) isValid 0
extendLiveRangesForLiveOnExit: pred block_14 (0x00007FFFCDBD2C20) isValid 0. extPred block_-1 (0x0000000000000000) isValid -1
extendLiveRangesForLiveOnExit: currBlock block_-1 (0x0000000000000000) isValid -1
[3]
before redundantGotoElimination
8 [0x7fffcdc239c0] BBStart at 0x7fffcdbd7c00, frequency = 10000
in = [45(6) 39(10000) 14(6) ]
out = [39(10000) ]
exception in = []
exception out = [15(6) 14(6) ]
12 [0x7fffcdc232a0] BBStart at 0x7fffcdbd7840, frequency = 6
in = [40(6) ]
out = [4(6) 13(6) ]
exception in = []
exception out = []
13 [0x7fffcdc23170] BBStart at 0x7fffcdbd77a0, frequency = 6
in = [12(6) ]
out = [1(6) ]
exception in = []
exception out = []
14 [0x7fffcdc23c20] BBStart at 0x7fffcdbd7d40, frequency = 6
in = []
out = [8(6) 41(6) ]
exception in = [8(6) ]
exception out = []
15 [0x7fffcdc23d50] BBStart at 0x7fffcdbd7de0, frequency = 6
in = []
out = [1(6) ]
exception in = [8(6) ]
exception out = []
36 [0x7fffcdd62cf0] BBStart at 0x7fffcdc56520, frequency = 6
in = [6(6) ]
out = [44(6) ]
exception in = []
exception out = []
...
39 [0x7fffcde842d0] BBStart at 0x7fffcdc571f0, frequency = 10000
in = [8(10000) ]
out = [40(6) 8(10000) ]
exception in = []
exception out = []
after redundantGotoElimination
12 [0x7fffcdc232a0] BBStart at 0x7fffcdbd7840, frequency = 6
in = [40(6) ]
out = [4(6) 13(6) ]
exception in = []
exception out = []
13 [0x7fffcdc23170] BBStart at 0x7fffcdbd77a0, frequency = 6
in = [12(6) ]
out = [1(6) ]
exception in = []
exception out = []
36 [0x7fffcdd62cf0] BBStart at 0x7fffcdc56520, frequency = 6
in = [6(6) ]
out = [44(6) ]
exception in = []
exception out = []
...
39 [0x7fffcde842d0] BBStart at 0x7fffcdc571f0, frequency = 10000
in = [45(6) 39(10000) 14(6) ] <---- block_14 is removed already
out = [39(10000) 40(6) ]
exception in = []
exception out = []
I think I found the root cause why the removed block (block_14
) has an edge to block_39
after redundantGotoElimination
.
In TR_EliminateRedundantGotos::process, it fist pushes all IN edges of the block being removed (block_8
) into fixablePreds
[1]. In this case, the edges are: block_45 -> block_8
, block_39 -> block_8
, block_14 -> block_8
are stored into fixablePreds
.
Then it removes exception edges for block_8
[2] which are block_8 -> block_15
, block_8 -> block_14
. During this process, block_14
becomes unreachable and removed.
Next, redirectPredecessors
is called to fix up all the CFGEdges that goes into destBlock
(block_39
) [3]. Because fixablePreds
contains an edge block_14 -> block_8
. It ends up adding an edge from block_14--> block_39
. It looks to me fixablePreds
needs to be updated to remove the edges that contain removed nodes after the exception edges are removed. I'm looking at a fix next.
[1] https://github.com/eclipse/omr/blob/0aa4535f4ecf8c588b6ba0e09c0913fe9f2e9246/compiler/optimizer/LocalOpts.cpp#L3489 [2] https://github.com/eclipse/omr/blob/0aa4535f4ecf8c588b6ba0e09c0913fe9f2e9246/compiler/optimizer/LocalOpts.cpp#L3539-3540 [3] https://github.com/eclipse/omr/blob/0aa4535f4ecf8c588b6ba0e09c0913fe9f2e9246/compiler/optimizer/LocalOpts.cpp#L3602
Opened https://github.com/eclipse/omr/pull/6576 for a fix. Currently testing the update based on PR review comments.
This is not a 0.33 regression. It fails at least as far back as 0.24 with JDK 11.
Reopen until omr promotes and we consider if we want the fix in 0.33
@a7ehuo will open a 0.33 PR for this.
Created https://github.com/eclipse-openj9/openj9-omr/pull/152 for openj9-omr v0.33 release
Java -version output
Summary of problem
The following test case crashes OpenJ9's JIT compiler
Diagnostic files
By issuing
the following crash log is given:
Please also check openj9-bug-62.tar.gz for all the logs (jitdump, snap, etc.) and the testcase (Test.java, Test.class).