RFR(S): 8201367: assert(current != first_mem) failed: corrupted memory graph in superword code

Roland Westrelin rwestrel at redhat.com
Tue Apr 10 14:42:04 UTC 2018


http://cr.openjdk.java.net/~roland/8201367/webrev.00/

Memory edges of loads of a pack form a chain. The current logic expects
the RPO walk over the nodes in the loop to order the loads of the pack
so the first load in RPO order has the first memory edge of the chain
and the last load in RPO order has the last memory edge of the
chain. RPO doesn't give this guarantee.

In the test case, the pack of loads is:

    0-->  394   LoadD   ===  229  396  395  [[ 393 ]]  @double[int:>=0]:exact+any *, idx=5; #double !orig=344,153 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
    1-->  379   LoadD   ===  229  380  386  [[ 378 ]]  @double[int:>=0]:exact+any *, idx=5; #double !orig=153 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
    2-->  344   LoadD   ===  229  346  345  [[ 343 ]]  @double[int:>=0]:exact+any *, idx=5; #double !orig=153 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
    3-->  153   LoadD   ===  229  132  151  [[ 154 ]]  @double[int:>=0]:exact+any *, idx=5; #double !jvms: TestUnexpectedLoadOrdering::test @ bci:23

And RPO walk of the loop body is:

0  411  CountedLoop     ===  411  331  167  [[ 380  396  408  409  410  411  346  132  187 ]] inner stride: 4 main of N411 !orig=[360],[188],[182],[88] !jvms: TestUnexpectedLoadOrdering::test @ bci:12
1  408  Phi     ===  411  319  184  [[ 392  402  404  406  407  184  342 ]]  #int:<=max-1:www #tripcount !orig=[359],92 !jvms: TestUnexpectedLoadOrdering::test @ bci:12
2  392  AddI    === _  408  61  [[ 385  390  391 ]]  !orig=342,184,[155] !jvms: TestUnexpectedLoadOrdering::test @ bci:26
3  385  CastII  ===  211  392  [[ 384 ]]  #int:0..max-1:www range check dependency !orig=126 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
4  384  ConvI2L === _  385  [[ 383 ]]  #long:0..maxint-1:www !orig=127 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
5  383  LShiftL === _  384  128  [[ 382 ]]  !orig=129 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
6  382  AddP    === _  108  108  383  [[ 381 ]]  !orig=131 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
7  381  AddP    === _  108  382  124  [[ 380 ]]  !orig=130 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
8  390  CastII  ===  229  392  [[ 389 ]]  #int:0..max-1:www range check dependency !orig=148 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
9  389  ConvI2L === _  390  [[ 388 ]]  #long:0..maxint-1:www !orig=149 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
10  388 LShiftL === _  389  128  [[ 387 ]]  !orig=150 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
11  387 AddP    === _  39  39  388  [[ 386 ]]  !orig=152 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
12  386 AddP    === _  39  387  124  [[ 379 ]]  !orig=151 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
13  391 ConvI2D === _  392  [[ 380 ]]  !orig=95 !jvms: TestUnexpectedLoadOrdering::test @ bci:17
14  402 AddI    === _  408  370  [[ 358  357  355 ]]  !orig=184,[155] !jvms: TestUnexpectedLoadOrdering::test @ bci:26
15  358 ConvI2D === _  402  [[ 346 ]]  !orig=95 !jvms: TestUnexpectedLoadOrdering::test @ bci:17
16  357 CastII  ===  211  402  [[ 356 ]]  #int:0..max-1:www range check dependency !orig=126 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
17  356 ConvI2L === _  357  [[ 349 ]]  #long:0..maxint-1:www !orig=127 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
18  349 LShiftL === _  356  128  [[ 348 ]]  !orig=129 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
19  348 AddP    === _  108  108  349  [[ 347 ]]  !orig=131 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
20  347 AddP    === _  108  348  124  [[ 346 ]]  !orig=130 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
21  355 CastII  ===  229  402  [[ 354 ]]  #int:0..max-1:www range check dependency !orig=148 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
22  354 ConvI2L === _  355  [[ 351 ]]  #long:0..maxint-1:www !orig=149 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
23  351 LShiftL === _  354  128  [[ 350 ]]  !orig=150 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
24  350 AddP    === _  39  39  351  [[ 345 ]]  !orig=152 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
25  345 AddP    === _  39  350  124  [[ 344 ]]  !orig=151 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
26  404 CastII  ===  229  408  [[ 403 ]]  #int:0..max-1:www range check dependency !orig=355,148 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
27  403 ConvI2L === _  404  [[ 401 ]]  #long:0..maxint-1:www !orig=354,149 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
28  401 LShiftL === _  403  128  [[ 400 ]]  !orig=351,150 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
29  400 AddP    === _  39  39  401  [[ 395 ]]  !orig=350,152 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
30  395 AddP    === _  39  400  124  [[ 394 ]]  !orig=345,151 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
31  406 CastII  ===  211  408  [[ 405 ]]  #int:0..max-1:www range check dependency !orig=357,126 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
32  405 ConvI2L === _  406  [[ 399 ]]  #long:0..maxint-1:www !orig=356,127 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
33  399 LShiftL === _  405  128  [[ 398 ]]  !orig=349,129 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
34  398 AddP    === _  108  108  399  [[ 397 ]]  !orig=348,131 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
35  397 AddP    === _  108  398  124  [[ 396 ]]  !orig=347,130 !jvms: TestUnexpectedLoadOrdering::test @ bci:18
36  407 ConvI2D === _  408  [[ 396 ]]  !orig=358,95 !jvms: TestUnexpectedLoadOrdering::test @ bci:17
37  184 AddI    === _  408  423  [[ 408  185  306 ]]  !orig=[155] !jvms: TestUnexpectedLoadOrdering::test @ bci:26
38  185 CmpI    === _  184  375  [[ 186 ]]  !orig=[164] !jvms: TestUnexpectedLoadOrdering::test @ bci:9
39  186 Bool    === _  185  [[ 187 ]] [lt] !orig=[165] !jvms: TestUnexpectedLoadOrdering::test @ bci:9
40  342 AddI    === _  408  128  [[ 126  148  95 ]]  !orig=184,[155] !jvms: TestUnexpectedLoadOrdering::test @ bci:26
41  126 CastII  ===  211  342  [[ 127 ]]  #int:0..max-1:www range check dependency !jvms: TestUnexpectedLoadOrdering::test @ bci:18
42  127 ConvI2L === _  126  [[ 129 ]]  #long:0..maxint-1:www !jvms: TestUnexpectedLoadOrdering::test @ bci:18
43  129 LShiftL === _  127  128  [[ 131 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:18
44  131 AddP    === _  108  108  129  [[ 130 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:18
45  130 AddP    === _  108  131  124  [[ 132 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:18
46  148 CastII  ===  229  342  [[ 149 ]]  #int:0..max-1:www range check dependency !jvms: TestUnexpectedLoadOrdering::test @ bci:23
47  149 ConvI2L === _  148  [[ 150 ]]  #long:0..maxint-1:www !jvms: TestUnexpectedLoadOrdering::test @ bci:23
48  150 LShiftL === _  149  128  [[ 152 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:23
49  152 AddP    === _  39  39  150  [[ 151 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:23
50  151 AddP    === _  39  152  124  [[ 153 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:23
51  95  ConvI2D === _  342  [[ 132 ]]  !jvms: TestUnexpectedLoadOrdering::test @ bci:17
52  409 Phi     ===  411  287  132  [[ 396 ]]  #memory  Memory: @double[int:>=0]:exact+any *, idx=5; !orig=[352],[181],[179],[90] !jvms: TestUnexpectedLoadOrdering::test @ bci:12
53  396 StoreD  ===  411  409  397  407  [[ 380  394 ]]  @double[int:>=0]:exact+any *, idx=5;  Memory: @double[int:>=0]:NotNull:exact+any *, idx=5; !orig=346,132,[367] !jvms: TestUnexpectedLoadOrdering::test @ bci:18
54  380 StoreD  ===  411  396  381  391  [[ 379  346 ]]  @double[int:>=0]:exact+any *, idx=5;  Memory: @double[int:>=0]:NotNull:exact+any *, idx=5; !orig=132,[367] !jvms: TestUnexpectedLoadOrdering::test @ bci:18
55  379 LoadD   ===  229  380  386  [[ 378 ]]  @double[int:>=0]:exact+any *, idx=5; #double !orig=153 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
56  394 LoadD   ===  229  396  395  [[ 393 ]]  @double[int:>=0]:exact+any *, idx=5; #double !orig=344,153 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
57  410 Phi     ===  411  284  154  [[ 393 ]]  #double !orig=[353],[91] !jvms: TestUnexpectedLoadOrdering::test @ bci:12
58  393 AddD    === _  410  394  [[ 378 ]]  !orig=343,154,[366] !jvms: TestUnexpectedLoadOrdering::test @ bci:24
59  378 AddD    === _  393  379  [[ 343 ]]  !orig=154,[366] !jvms: TestUnexpectedLoadOrdering::test @ bci:24
60  346 StoreD  ===  411  380  347  358  [[ 344  312  132 ]]  @double[int:>=0]:exact+any *, idx=5;  Memory: @double[int:>=0]:NotNull:exact+any *, idx=5; !orig=132,[367] !jvms: TestUnexpectedLoadOrdering::test @ bci:18
61  344 LoadD   ===  229  346  345  [[ 343 ]]  @double[int:>=0]:exact+any *, idx=5; #double !orig=153 !jvms: TestUnexpectedLoadOrdering::test @ bci:23
62  343 AddD    === _  378  344  [[ 154 ]]  !orig=154,[366] !jvms: TestUnexpectedLoadOrdering::test @ bci:24
63  132 StoreD  ===  411  346  130  95  [[ 409  153  310 ]]  @double[int:>=0]:exact+any *, idx=5;  Memory: @double[int:>=0]:NotNull:exact+any *, idx=5; !orig=[367] !jvms: TestUnexpectedLoadOrdering::test @ bci:18
64  153 LoadD   ===  229  132  151  [[ 154 ]]  @double[int:>=0]:exact+any *, idx=5; #double !jvms: TestUnexpectedLoadOrdering::test @ bci:23
65  154 AddD    === _  343  153  [[ 308  410 ]]  !orig=[366] !jvms: TestUnexpectedLoadOrdering::test @ bci:24

I propose we don't rely on the RPO order to find the "first" and "last"
loads of the pack.

Roland.


More information about the hotspot-compiler-dev mailing list