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