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