RFR: 8204504: Fix for 8198285 breaks slowdebug builds

Erik Österlund erik.osterlund at oracle.com
Thu Jun 7 15:32:02 UTC 2018


Hi,

Recent changes to arraycopying (8198285) broke slowdebug builds on 
windows and solaris.

The problem is that the RawAccessBarrierArrayCopy::arraycopy<decorators> 
function is expanded for a whole bunch of different new cases after JNI 
code started using this API. The reported linking problems:

void 
AccessInternal::arraycopy_arrayof_conjoint<double>(__type_0*,__type_0*,unsigned 
long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void 
AccessInternal::arraycopy_arrayof_conjoint<float>(__type_0*,__type_0*,unsigned 
long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void AccessInternal::arraycopy_conjoint_atomic<unsigned 
short>(__type_0*,__type_0*,unsigned long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void AccessInternal::arraycopy_conjoint_atomic<unsigned 
char>(__type_0*,__type_0*,unsigned long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void 
AccessInternal::arraycopy_conjoint_atomic<float>(__type_0*,__type_0*,unsigned 
long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void 
AccessInternal::arraycopy_conjoint_atomic<double>(__type_0*,__type_0*,unsigned 
long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void AccessInternal::arraycopy_arrayof_conjoint<unsigned 
short>(__type_0*,__type_0*,unsigned long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o
void AccessInternal::arraycopy_arrayof_conjoint<unsigned 
char>(__type_0*,__type_0*,unsigned long) 
/work/shared/mirrors/src_clones/jdk/jdk_baseline/build/solaris-x86_64-normal-server-slowdebug/hotspot/variant-server/libjvm/objs/jni.o 


...are all variants that the backend does not yet support as there are 
no current uses of it. And there really are no current uses of these 
still - these are all false positives. However, the code that currently 
chooses whether to use arrayof, conjoing, disjoint heap words, with 
possibly atomic variations, is all checked with if statements. But each 
case of the if statements are compiled in the template expansion despite 
being statically known to be dead code in a whole bunch of template 
expansions. The optimized code generation is clever enough to just 
ignore that dead code, while the slowdebug builds on windows and solaris 
complain that this dead code (that was only spuriously expanded by 
accident but is never called) does not exist.

The solution I propose to this is to fold away the different cases the 
linker is complaining about using SFINAE instead of if statements. That 
way, they are never template expanded spuriously when it is statically 
known that they will not be called; they are never considered as valid 
overloads.

I have verified on a Solaris x86 machine that it did not build before, 
but builds fine with this patch applied.

Webrev:
http://cr.openjdk.java.net/~eosterlund/8204504/webrev.00/

Bug:
https://bugs.openjdk.java.net/browse/JDK-8204504

Thanks,
/Erik


More information about the hotspot-dev mailing list