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