On Thu, 5 May 2022 01:42:48 GMT, Xiaohong Gong <[email protected]> wrote:
> > > Yeah, I agree that it's not good by adding a branch checking for
> > > `offsetInRange`. But actually I met the constant issue that passing the
> > > values all the way cannot guarantee the argument a constant in compiler
> > > at the compile time. Do you have any better idea to fixing this?
> >
> >
> > That's odd, `boolean` constants are passed that are then converted to `int`
> > constants. Did you try passing integer constants all the way through?
>
> I will try again. I remember the main cause is the calling of `fromArray0`
> from `fromArray`, it is not annotated with `ForceInline`. The arguments might
> not be compiled to a constant for cases that the offset is not in the array
> range like tail loop.
I tried to pass the integer constant all the way, and unfortunate that the
`offsetInRange` is not compiled to a constant. The following assertion in the
`vectorIntrinsics.cpp` will fail:
--- a/src/hotspot/share/opto/vectorIntrinsics.cpp
+++ b/src/hotspot/share/opto/vectorIntrinsics.cpp
@@ -1236,6 +1236,7 @@ bool
LibraryCallKit::inline_vector_mem_masked_operation(bool is_store) {
} else {
// Masked vector load with IOOBE always uses the predicated load.
const TypeInt* offset_in_range = gvn().type(argument(8))->isa_int();
+ assert(offset_in_range->is_con(), "not a constant");
if (!offset_in_range->is_con()) {
if (C->print_intrinsics()) {
tty->print_cr(" ** missing constant: offsetInRange=%s",
-------------
PR: https://git.openjdk.java.net/jdk/pull/8035