RFR: 8354242: VectorAPI: combine vector not operation with compare [v3]
erifan
duke at openjdk.org
Wed May 7 02:10:56 UTC 2025
On Thu, 1 May 2025 07:32:22 GMT, erifan <duke at openjdk.org> wrote:
>> Yes, this discussion is down to `requires` vs `applyIf`. This is my argument for `applyIf`, quoted from above, I have not yet seen an argument against it:
>>
>>> If you use @require, then the person does not realize there is a test AND the test is not run. If you use applyIf, the person does not realize there is a test, but it is run at least for result verifiation - and then the person MIGHT realize if the test catches a wrong result / crash.
>>
>> In my understanding, `requires` should only be used if the test really **requires** a certain platform or feature. That can be because some flags are only available under certain platforms for example. But for IR tests, we should try to always use `applyIf`, because it allows testing on other platforms.
>>
>> Actually, I filed this RFE a while ago: https://bugs.openjdk.org/browse/JDK-8310891
>> We should try to move as many tests from using `requires` to `applyIf`, so that we have an increased test coverage.
>
> @eme64 @jatin-bhateja I have updated the test, thanks for your suggestion.
> @erifan thanks for updating the tests!
>
> Now I had a quick look at the VM code.
>
> My biggest observation is this:
>
> Wrapping `VectorNode::Ideal` somewhere in the middle of your new optimization is going to make future optimizations here much harder. How would they check their conditions next to yours? That would be quite a mess.
>
> I suggest you do this:
>
> * `XorVNode::Ideal` does
>
> * checks `in1 == in2` case
> * calls a method called `XorVNode::Ideal_XorV_VectorMaskCmp`. Check if it succeeded, i.e. returns `nullptr`.
> * ... future optimizations could go here ...
> * Finally, i.e. none of the optimizations above worked: call `VectorNode::Ideal`
>
> Then you pack all your new logic here into `XorVNode::Ideal_XorV_VectorMaskCmp`. You can also find a better name, it is just what I came up with just now.
>
> This gives us a much more **modular** design, and it is easier to add another new optimization to `XorVNode::Ideal`. It is easy to change the precedence of the optimizations by just changing the order, etc.
>
> Examples of this "modular" design:
>
> * `CMoveNode::Ideal` -> calls `TypeNode::Ideal` and `Ideal_minmax`.
> * `StoreBNode::Ideal` -> calls `StoreNode::Ideal_masked_input` and `StoreNode::Ideal_sign_extended_input`
> These are really nice, because you can quickly see what optimizations we already have, and in which order they are checked.
Yes, this is a good idea, I have changed it like this, thanks for your suggestion.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/24674#issuecomment-2856811448
More information about the core-libs-dev
mailing list