RFR: 8341834: C2 compilation fails with "bad AD file" due to Replicate

Emanuel Peter epeter at openjdk.org
Thu Oct 24 06:05:10 UTC 2024


On Wed, 23 Oct 2024 15:32:05 GMT, Vladimir Kozlov <kvn at openjdk.org> wrote:

>> Superword creates a `Replicate` node at a `ConvL2I` node and uses the
>> type of the result of the `ConvL2I` to pick the type of the
>> `Replicate` instead of the type of the input to the `ConvL2I`.
>
> src/hotspot/share/opto/superwordVTransformBuilder.cpp line 231:
> 
>> 229:     } else {
>> 230:       // Replicate the scalar same_input to every vector element.
>> 231:       BasicType element_type = p0->is_Convert() ? p0->in(1)->bottom_type()->basic_type() : _vloop_analyzer.types().velt_basic_type(p0);
> 
> What vectors are generated (or not) with this change? The array in the test ins `int[]` but the element_type will be Long now. Will it bailout vectorization?

@vnkozlov You can very easily see how it goes with my `Test4` above, I split the things onto different lines so we can see what is from where easily.

The pack that `p0` belongs to is a `ConvL2I` pack. In my case, I have an `short[]`, just to make things even more interesting. Since the type is propagated from use -> def, the output of the `ConvL2I` is interpreted as a `short`, it is essentially a truncated `int`. `velt_basic_type(p0) == T_SHORT`. The vector node should be a `VectorCastL2X  === _ 873  [[ ]]  #vectors<S,2>`, i.e. casting from long-vector to short-vector.

But now we see that the input to the pack of `p0` is all the same, and so we want to introduce a `Replicate`. We should of course replicate for `long`. But `velt_basic_type(p0) == T_SHORT` - so you get a `Replicate  === _ 717  [[ ]]  #vectorx<S,2>`, and then eventually a `VectorCastS2X  === _ 890  [[ ]]  #vectors<S,2>`... but of course the AD file has no matching node for a VectorCast from short to short -> `bad AD file`.

The issue is really that `velt_basic_type(p0)` gives us the output-type, but we actually would need the input-type. In almost all cases input-type == output-type. But of course that does not hold with Convert.

With Roland's fix, we now ask for the output-type of the `ConvL2I`'s input. That is the same as asking for the `ConvL2I`'s input-type. That way, we know what type to Replicate for - the `element_type`.

@rwestrel given that @vnkozlov also did not right away understand what is going on, I think you need to properly explain what happens in the comments ;)

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/21660#discussion_r1814315631


More information about the hotspot-compiler-dev mailing list