-
Notifications
You must be signed in to change notification settings - Fork 6.1k
8370481: C2 SuperWord: Long/Integer.compareUnsigned return wrong value in SLP #27942
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
👋 Welcome back mli! A progress list of the required criteria for merging this PR into |
❗ This change is not yet ready to be integrated. |
@Hamlin-Li The following label will be automatically applied to this pull request:
When this pull request is ready to be reviewed, an "RFR" email will be sent to the corresponding mailing list. If you would like to change these labels, use the /label pull request command. |
Webrevs
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Hamlin-Li That looks like a great improvement :)
All I am missing are some test cases. And if possible: IR rules 😉
Thank you for having a look! :)
Yes, I also added some tests and IR rules of course. :) |
/solves JDK-8370481 |
@Hamlin-Li |
@Hamlin-Li If you are fixing a bug here, we should focus on the bug only. After all, we may want to backport the bugfix. |
Please check the added test cases, if it's run with JDK master, the test cases will fail on x86.
Yes. In fact at first I did not realise the existence of the bug. After read your previous question, I did more investigation and found out that I'm working a bug fix at the same time. I can change the title of this pr to "8370481: C2 SuperWord: Long/Integer.compareUnsigned return wrong value in SLP" if you wish. |
@Hamlin-Li Nice, thanks for filing JDK-8370481. I now extracted a reproducer from your PR here, and attached it to the JIRA issue. Yes, I think it would be better if you changed the title to: I think you could already close JDK-8370454 as a duplicate of the bug report :) Thanks very much for finding this, and even more for fixing it 😊 |
You should also change the PR description, especially you should describe what went wrong at what point. Well, you mostly already explain. I think the issue is that we don't really carry the "unsigned-ness" of the comparison, and then end up doing signed instead of unsigned comparison... |
Thank you for doing it!
It's done!
Thank you! :) |
@eme64 I just keep Op_CmpI/L. |
Co-authored-by: Emanuel Peter <emanuel.peter@oracle.com>
Co-authored-by: Emanuel Peter <emanuel.peter@oracle.com>
"testCMoveUIGTforI", | ||
"testCMoveUIGTforL", | ||
"testCMoveUIGTforF", | ||
"testCMoveUIGTforD", | ||
"testCMoveULGTforI", | ||
"testCMoveULGTforL", | ||
"testCMoveULGTforF", | ||
"testCMoveULGTforD", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just realized that we only have GT
cases. But what about GE,LE,LT
? Are those covered somewhere else?
Otherwise we only test a fraction of
static mask unsigned_mask(mask btm) { return mask(btm | unsigned_compare); }
What do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Make sense, I'll add more tests.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I ran all the tests under test/hotspot/jtreg/compiler on x86, the |
Hi,
Can you help to review the patch? @eme64
Issue
Currently, in SLP when transform from (Bool + CmpU + CMove) to (VectorMaskCmp + VectorBlend), the unsigned-ness in CmpU is lost, then end up doing a signed instead of unsigned comparison in VectorMaskCmp.
For details please check code at
SuperWordVTransformBuilder::make_vector_vtnode_for_pack
andPackSet::get_bool_test
.Fix
Currently,
BoolTest
does not support an unsigned construction (BoolTest( mask btm ) : _test(btm) { assert((btm & unsigned_compare) == 0, "unsupported");}
), seems to me a feasible solution would be get the unsigned information from CmpU (which could be an input of Bool) and pass it to VectorMaskCmp.Thanks
This pr could also lead to more optimizations, like: #25336 and #25341.
Progress
Issue
Reviewing
Using
git
Checkout this PR locally:
$ git fetch https://git.openjdk.org/jdk.git pull/27942/head:pull/27942
$ git checkout pull/27942
Update a local copy of the PR:
$ git checkout pull/27942
$ git pull https://git.openjdk.org/jdk.git pull/27942/head
Using Skara CLI tools
Checkout this PR locally:
$ git pr checkout 27942
View PR using the GUI difftool:
$ git pr show -t 27942
Using diff file
Download this PR as a diff file:
https://git.openjdk.org/jdk/pull/27942.diff
Using Webrev
Link to Webrev Comment