With Unsafe, you can create arbitrary array pointers, and some of them seem to lead to wrong results with the MergeStores optimization JDK-8318446.
The easiest way for now is to disable Unsafe accesses, and then redesign the ArrayPointer class from the ground up, to be more powerful and safe in all cases (incl proofs). JDK-8335392
./java --add-modules java.base --add-exports java.base/jdk.internal.misc=ALL-UNNAMED --add-exports java.base/jdk.internal.util=ALL-UNNAMED -XX:CompileCommand=compileonly,TestMergeStores*::test* -XX:CompileCommand=printcompilation,TestMergeStores*::test* -Xbatch -XX:+TraceMergeStores -XX:+MergeStores TestMergeStoresUnsafeArrayPointer.java
CompileCommand: compileonly TestMergeStores*.test* bool compileonly = true
CompileCommand: PrintCompilation TestMergeStores*.test* bool PrintCompilation = true
Allocate big array of SIZE = 1073741924
test1
7583   99    b  3       TestMergeStoresUnsafeArrayPointer::testClear (72 bytes)
7585  100    b  3       TestMergeStoresUnsafeArrayPointer::testSum (84 bytes)
7586  101 %  b  4       TestMergeStoresUnsafeArrayPointer::testClear @ 2 (72 bytes)
7612  102    b  4       TestMergeStoresUnsafeArrayPointer::testClear (72 bytes)
7651  103 %  b  4       TestMergeStoresUnsafeArrayPointer::testSum @ 4 (84 bytes)
7674  104    b  4       TestMergeStoresUnsafeArrayPointer::testSum (84 bytes)
7695  105    b  3       TestMergeStoresUnsafeArrayPointer::test1 (38 bytes)
7696  106    b  4       TestMergeStoresUnsafeArrayPointer::test1 (38 bytes)
[TraceMergeStores]: Replace
 54  StoreI  === 41 7 52 32  [[ 63 ]]  @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=4; unsafe  Memory: @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=4; !jvms: TestMergeStoresUnsafeArrayPointer::test1 @ bci:20 (line 81)
 63  StoreI  === 41 54 61 58  [[ 18 ]]  @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=4; unsafe  Memory: @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=4; !jvms: TestMergeStoresUnsafeArrayPointer::test1 @ bci:34 (line 82)
[TraceMergeStores]: with
 66  ConL  === 0  [[ 67 ]]  #long:7378697628877472322
 67  StoreL  === 41 7 52 66  [[ ]]  @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=4; mismatched  Memory: @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=4;
test2
7720  107    b  3       TestMergeStoresUnsafeArrayPointer::test2 (55 bytes)
7722  108    b  4       TestMergeStoresUnsafeArrayPointer::test2 (55 bytes)
[TraceMergeStores]: Replace
 63  StoreI  === 51 7 61 42  [[ 78 ]]  @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=5; unsafe  Memory: @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; !jvms: TestMergeStoresUnsafeArrayPointer::test2 @ bci:30 (line 87)
 78  StoreI  === 51 63 76 73  [[ 18 ]]  @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):exact+any *, idx=5; unsafe  Memory: @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; !jvms: TestMergeStoresUnsafeArrayPointer::test2 @ bci:51 (line 88)
[TraceMergeStores]: with
 81  ConL  === 0  [[ 82 ]]  #long:7378697628877472322
 82  StoreL  === 51 7 61 81  [[ ]]  @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5; mismatched  Memory: @int[int:>=0] (java/lang/Cloneable,java/io/Serializable):NotNull:exact+any *, idx=5;
ERROR: test2 had wrong value: 216504268185 != 217578010009
Exception in thread "main" java.lang.RuntimeException: ERRORS: 1
	at TestMergeStoresUnsafeArrayPointer.main(TestMergeStoresUnsafeArrayPointer.java:60)