C2: Compiler scheduling oddity
Vladimir Kozlov
vladimir.kozlov at oracle.com
Fri Jun 17 00:02:15 UTC 2016
Hi Andrew,
One thing I notice is that there are 2 stores to the same address (Node 195) but they are treated as different addresses with different offsets: TransTypes+12 vs TransTypes+60
294 storeN === 1326 282 195 295 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+12 * [narrow], name=result, idx=17; !jvms: ################
TreeTranslator::translate @ bci:18 ################# TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
293 storeN === 1326 282 195 278 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+60 * [narrow], name=pt, idx=16; !jvms: TransTypes::translate @ bci:19
TransTypes::visitSelect @ bci:162
first stores NULL and second stores previous load result:
278 loadN === _ 269 195 [[ 277 293 803 273 103 ]] narrowoop: com/sun/tools/javac/code/Type * needs_anti_dependence_check !jvms: TransTypes::translate @ bci:1 TransTypes::visitSelect @ bci:162
"After ScheduleLate" looks to me as "After schedule_early()" because nodes are near their definitions.
There is schedule_local() (after schedule_late()) which scheduled nodes in each block. Based on your output load node was cloned (172loadN !orig=[281]) into store's block semms due to
PhaseCFG::call_catch_cleanup(). But nodes inserted at the beginning of block:
// It is safe here to clone a node with anti_dependence
// since clones dominate on each path.
And nodes order looks correct in your "After GCM" output.
It actually surprise to me that "After RA" nodes were reordered. RA should not do that. Usually you will see new MSC nodes or node's clones inserted. But in your case preexisting (before RA) nodes
were reordered. It invalidates the above assumption in LCM.
I would suggest to narrow down the phase in RA where it happens.
Regards,
Vladimir
On 6/16/16 8:38 AM, Andrew Haley wrote:
> I have an interesting problem with opto scheduling. At the moment I
> only see this with the AArch64 back-end in jdk8u, but I'm asking here
> because as far as I can see it could happen anywhere.
>
> I have a load and a store of the same field. The load must come
> before the store. The code looks like this:
>
> tree.accept(this);
> JCTree tmpResult = this.result;
> this.result = null;
>
> public <T extends com.sun.tools.javac.tree.JCTree> T translate(T);
> Code:
> 0: aload_1
> 1: ifnonnull 6
> 4: aconst_null
> 5: areturn
> 6: aload_1
> 7: aload_0
> 8: invokevirtual #2 // Method com/sun/tools/javac/tree/JCTree.accept:(Lcom/sun/tools/javac/tree/JCTree$Visitor;)V
> 11: aload_0
> 12: getfield #3 // Field result:Lcom/sun/tools/javac/tree/JCTree;
> 15: astore_2
> 16: aload_0
> 17: aconst_null
> 18: putfield #3 // Field result:Lcom/sun/tools/javac/tree/JCTree;
> 21: aload_2
> 22: areturn
>
> Occasionally I get a segfault because the store (of NULL) at bci 18 is
> scheduled before the load. It only happens when the method is deeply
> inlined, and it only happens about 1 time in 30.
>
> Here's what happens:
>
> PhaseCFG::insert_anti_dependences notices that the load must be
> scheduled before the store. However, it does not insert a precedence
> link because the store is in a different basic block from the load,
> and that basic block is going to be executed after the load. As far
> as I can see the load is in a different basic block from the store
> because the load has an implicit null check.
>
> Later, the blocks containing the load and the store are merged, but
> there is nothing to stop the store from rising above the load, and
> occasionally it does.
>
> So, it's clear to me what is happening, but how to fix it? I don't
> know why this doesn't happen all the time. Does any of this sound
> familiar?
>
> I have appended the basic blocks in three phases. These are only the
> mach nodes, in order to keep the dumps reasonably small.
>
> Thanks,
>
> Andrew.
>
>
>
> The dumps: @@@@@@@@@@@@@@@@@@@@@ marks the load, ################# the
> store.
>
>
> ---- After ScheduleLate ----
>
> B40: # B42 B41 <- N1329 N264 Freq: 0.999885
> 280 decodeHeapOop === _ 281 [[ 99 284 292 1063 ]] com/sun/tools/javac/tree/JCTree * Oop:com/sun/tools/javac/tree/JCTree * !jvms: @@@@@@@@@@@@@@@@@@ TreeTranslator::translate @ bci:12 @@@@@@@@@@@@@@@@@@@@@ TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 281 loadN === _ 282 195 [[ 280 ]] narrowoop: com/sun/tools/javac/tree/JCTree * needs_anti_dependence_check !jvms: @@@@@@@@@@@@@@@@@@ TreeTranslator::translate @ bci:12 @@@@@@@@@@@@@@@@@@@@@ TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 103 CallDynamicJavaDirect === 105 267 268 14 0 241 195 195 11 0 11 195 0 0 277 0 0 195 0 0 | 278 [[ 104 102 279 282 ]] Dynamic com.sun.tools.javac.tree.JCTree::accept # void ( com/sun/tools/javac/tree/JCTree:NotNull *, com/sun/tools/javac/tree/JCTree$Visitor * ) TreeTranslator::translate @ bci:8 TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162 !jvms: TreeTranslator::translate @ bci:8 TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 271 storeimmB0 === 105 269 229 272 [[ 268 ]] memory Memory: @rawptr:BotPTR, idx=Raw; !jvms: TransTypes::translate @ bci:7 TransTypes::visitSelect @ bci:162
> 272 urShiftP_reg_imm === 105 195 [[ 271 ]] #9/0x00000009
> 273 storeN === 105 269 195 274 | 278 [[ 268 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+60 * [narrow], name=pt, idx=16; !jvms: TransTypes::translate @ bci:7 TransTypes::visitSelect @ bci:162
> 274 encodeHeapOop_not_null === 105 275 [[ 273 ]] narrowoop: com/sun/tools/javac/code/Type:NotNull *
> 277 decodeHeapOop === _ 278 [[ 103 ]] com/sun/tools/javac/code/Type * Oop:com/sun/tools/javac/code/Type * !jvms: TransTypes::translate @ bci:1 TransTypes::visitSelect @ bci:162
> 278 loadN === _ 269 195 [[ 277 293 803 273 103 ]] narrowoop: com/sun/tools/javac/code/Type * needs_anti_dependence_check !jvms: TransTypes::translate @ bci:1 TransTypes::visitSelect @ bci:162
>
> B42: # B44 B43 <- N105 Freq: 0.999865
> 288 storeimmB0 === 1326 282 229 289 [[ 286 1059 1066 ]] memory Memory: @rawptr:BotPTR, idx=Raw; !jvms: TransTypes::translate @ bci:19 TransTypes::visitSelect @ bci:162
> 289 urShiftP_reg_imm === 1326 195 [[ 288 ]] #9/0x00000009
> 293 storeN === 1326 282 195 278 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+60 * [narrow], name=pt, idx=16; !jvms: TransTypes::translate @ bci:19 TransTypes::visitSelect @ bci:162
> 294 storeN === 1326 282 195 295 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+12 * [narrow], name=result, idx=17; !jvms: ################ TreeTranslator::translate @ bci:18 ################# TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 295 loadConN0 === 1 [[ 294 ]] narrowoop: NULL
> 99 cmpP_imm0_branch === 1326 280 [[ 98 1058 ]] P=0.999999, C=-1.000000 !jvms: TransTypes::visitSelect @ bci:165
>
> ---- After GCM ----
>
> B42: # B44 B43 <- N105 Freq: 0.999865
> 1720 loadN === _ 282 195 [[ 1719 ]] narrowoop: com/sun/tools/javac/tree/JCTree * needs_anti_dependence_check !orig=[281] !jvms: @@@@@@@@@@@@@@@@@@ TreeTranslator::translate @ bci:12 @@@@@@@@@@@@@@@@@@@@@ TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 1719 decodeHeapOop === _ 1720 [[ 1063 284 292 ]] com/sun/tools/javac/tree/JCTree * Oop:com/sun/tools/javac/tree/JCTree * !orig=[280] !jvms: @@@@@@@@@@@@@@@@@@ TreeTranslator::translate @ bci:12 @@@@@@@@@@@@@@@@@@@@@ TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 295 loadConN0 === 1 [[ 294 ]] narrowoop: NULL
> 289 urShiftP_reg_imm === 1326 195 [[ 288 ]] #9/0x00000009
> 288 storeimmB0 === 1326 282 229 289 [[ 286 1059 1066 ]] memory Memory: @rawptr:BotPTR, idx=Raw; !jvms: TransTypes::translate @ bci:19 TransTypes::visitSelect @ bci:162
> 294 storeN === 1326 282 195 295 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+12 * [narrow], name=result, idx=17; !jvms: ################ TreeTranslator::translate @ bci:18 ################# TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 293 storeN === 1326 282 195 278 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+60 * [narrow], name=pt, idx=16; !jvms: TransTypes::translate @ bci:19 TransTypes::visitSelect @ bci:162
> 284 loadNKlass === 1326 13 1719 [[ 283 1625 ]] narrowklass: klass com/sun/tools/javac/tree/JCTree: 0x0000007e89553d20 * !jvms: TransTypes::visitSelect @ bci:165
> 1625 NullCheck === 1326 284 [[ 1058 98 ]]
>
> ---- After Reg Alloc ----
>
> B31: # B180 B32 <- N105 Freq: 0.999865
> 295 loadConN0 === 1 [[ 294 ]] narrowoop: NULL
> 1878 MachSpillCopy === _ 1859 [[ 1720 289 294 293 1883 ]] Oop:com/sun/tools/javac/comp/TransTypes:NotNull *
> 289 urShiftP_reg_imm === 1326 1878 [[ 288 ]] #9/0x00000009
> 294 storeN === 1326 282 1878 295 [[ 285 1059 1066 1880 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+12 * [narrow], name=result, idx=17; !jvms: ################ TreeTranslator::translate @ bci:18 ################# TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 1879 loadByteMapBase === 10 [[ 288 286 ]] 0x0000007f7a940000
> 1720 loadN === _ 282 1878 [[ 1719 ]] narrowoop: com/sun/tools/javac/tree/JCTree * needs_anti_dependence_check !orig=[281] !jvms: @@@@@@@@@@@@@@@@@@ TreeTranslator::translate @ bci:12 @@@@@@@@@@@@@@@@@@@@@ TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 1880 MachSpillCopy === _ 1875 | 294 [[ 293 ]]
> 288 storeimmB0 === 1326 282 1879 289 [[ 286 1059 1066 ]] memory Memory: @rawptr:BotPTR, idx=Raw; !jvms: TransTypes::translate @ bci:19 TransTypes::visitSelect @ bci:162
> 1719 decodeHeapOop === _ 1720 [[ 1813 284 292 ]] com/sun/tools/javac/tree/JCTree * Oop:com/sun/tools/javac/tree/JCTree * !orig=[280] !jvms: @@@@@@@@@@@@@@@@@@ TreeTranslator::translate @ bci:12 @@@@@@@@@@@@@@@@@@@@@ TransTypes::translate @ bci:12 TransTypes::visitSelect @ bci:162
> 293 storeN === 1326 282 1878 1880 [[ 285 1059 1066 ]] memory Memory: @com/sun/tools/javac/comp/TransTypes:NotNull+60 * [narrow], name=pt, idx=16; !jvms: TransTypes::translate @ bci:19 TransTypes::visitSelect @ bci:162
> 284 loadNKlass === 1326 13 1719 [[ 283 1625 ]] narrowklass: klass com/sun/tools/javac/tree/JCTree: 0x0000007e89553d20 * !jvms: TransTypes::visitSelect @ bci:165
> 1625 NullCheck === 1326 284 [[ 1058 98 ]]
>
>
>
>
>
> 0x0000007f7135a660: bl 0x0000007f7135b4d0 ; OopMap{[0]=Oop [8]=Oop [16]=NarrowOop [32]=Oop off=804}
> ;*invokevirtual accept
> ; - com.sun.tools.javac.tree.TreeTranslator::translate at 8 (line 58)
> ; - com.sun.tools.javac.comp.TransTypes::translate at 12 (line 490)
> ; - com.sun.tools.javac.comp.TransTypes::visitSelect at 162 (line 825)
> ; {virtual_call}
> ;; B31: # B180 B32 <- B30 Freq: 0.999865
>
> 0x0000007f7135a664: mov x11, xzr
> 0x0000007f7135a668: ldr x13, [sp,#32]
> 0x0000007f7135a66c: lsr x12, x13, #9
> 0x0000007f7135a670: str w11, [x13,#12] ;*putfield result
> ; - com.sun.tools.javac.tree.TreeTranslator::translate at 18 (line 60)
> ; - com.sun.tools.javac.comp.TransTypes::translate at 12 (line 490)
> ; - com.sun.tools.javac.comp.TransTypes::visitSelect at 162 (line 825)
>
> 0x0000007f7135a674: adrp x14, word_map_base ; {external_word}
> 0x0000007f7135a678: ldr w10, [x13,#12] ;*getfield result
> ; - com.sun.tools.javac.tree.TreeTranslator::translate at 12 (line 59)
> ; - com.sun.tools.javac.comp.TransTypes::translate at 12 (line 490)
> ; - com.sun.tools.javac.comp.TransTypes::visitSelect at 162 (line 825)
>
More information about the hotspot-compiler-dev
mailing list