RFR[M]: 8151779: Some intrinsic flags could be replaced with one general flag
Nils Eliasson
nils.eliasson at oracle.com
Thu Jun 11 21:24:27 UTC 2020
Hi Xin,
In general I think the patch looks good.
I am missing strict name checking. (I want to see an error on startup if
the user has specified unknown intrinsic names.) I see that the lazy
initialization of the intrinsic name tables might make it non-trivial to
find a good place to do that. I am ok if you follow up on that in a
future patch.
Best regards,
Nils Eliasson
> Incremental diff: http://cr.openjdk.java.net/~xliu/8151779/r4_to_r5.diff
>
> I verified it in submit repo a week ago. I also double-check the patch still can patch to TIP and pass both hotspot:tier1 and gtest:all.
>
> Here is log message I got from mach-5.
> Job: mach5-one-phh-JDK-8151779-1-20200513-1821-11015755
>
> BuildId: 2020-05-13-1820211.hohensee.source
>
> No failed tests
>
> Tasks Summary
>
> EXECUTED_WITH_FAILURE: 0
> NOTHING_TO_RUN: 0
> KILLED: 0
> HARNESS_ERROR: 0
> FAILED: 0
> PASSED: 101
> UNABLE_TO_RUN: 0
> NA: 0
>
>
> Thanks,
> --lx
>
>
>
> On 5/13/20, 12:03 AM, "hotspot-compiler-dev on behalf of Liu, Xin" <hotspot-compiler-dev-bounces at openjdk.java.net on behalf of xxinliu at amazon.com> wrote:
>
> Hi, Vladimir,
>
> > 2. add +/- UseCRC32Intrinsics to IntrinsicAvailableTest.java
> > The purpose of that test is not to generate a CRC32 intrinsic. Its purpose is to check if compilers determine to intrinsify _updateCRC32 or not.
> > Mathematically, "UseCRC32Intrinsics" is a set = [_updateCRC32, _updateBytesCRC32, _updateByteBufferCRC32].
> > "-XX:-UseCRC32Intrinsics" disables all 3 of them. If users use -XX:ControlIntrinsic=+_updateCRC32 and -XX:-UseCRC32Intrinsics, _updateCRC32 should be enabled individually.
>
> No, I think we should preserve current behavior when UseCRC32Intrinsics is off then all corresponding intrinsics are
> also should be off. This is the purpose of such flags - to be able control several intrinsics with one flag.
> Otherwise you have to check each individual intrinsic if CPU does not support them. Even if code for some of these
> intrinsics can be generated on this CPU. We should be consistent, otherwise code can become very complex to support.
> ----
> If -XX:ControlIntrinsic=+_updateBytesCRC32 can't win over -XX:-UseCRC32Intrinsics, it will come back the justification of JBS-8151779:
> Why do we need to support the usage -XX:ControlIntrinsic=+_updateBytesCRC32? If a user doesn't set +updateBytesCRC32, it's still enabled.
>
> I read the description of "JBS-8235981" and "JBS-8151779" again. I try to understand in this way. The option 'UseCRC32Intrinsics' is the consolidation of 3 real intrinsics [_updateCRC32, _updateBytesCRC32, _updateByteBufferCRC32]. It represents some sorta hardware capabilities to make those intrinsics optimal. If UseCRC32Intrinsics is OFF, it will not make sense to intrinsify them anymore because inliner can deliver the similar result.
>
> Quote from JBS-8235981 "Right now, there's no way to introduce experimental intrinsics which are turned off by default and let users enable them on their side. "
> Currently, once a user declares one new intrinsics in VM_INTRINSICS_DO, it's enabled. It might not be true in the future.
> i.e. A develop can declare an intrinsic but mark it turn-off by default. He will try it out by -XX:ControlIntrinsic=+_myNewIntrinsic in his development stage.
>
> Do I catch up your intention this time? if yes, could you take a look at this new revision? I think I meet the requirement.
> Webrev: http://cr.openjdk.java.net/~xliu/8151779/05/webrev/
> Incremental diff: http://cr.openjdk.java.net/~xliu/8151779/r4_to_r5.diff
>
> Here is the change log from rev04.
> 1) An intrinsic is enabled if and only if neither ControlIntrinsic nor the corresponding UseXXXIntrinsics disables it.
> The implementation is still in vmIntrinsics::is_disabled_by_flags(vmIntrinsics::ID id).
>
> 2) I introduce a compact data structure TriBoolArray. It compresses an array of Tribool. Each tribool only takes 2 bits now.
> I also took Coleen's suggestion to put TriBool and TriBoolArray in a standalone file "utilities/tribool.hpp". A new gtest is attached.
>
> 3) Correct some typos. Thank you David pointed them out.
>
> Thanks,
> --lx
>
>
> On 5/12/20, 12:59 AM, "David Holmes" <david.holmes at oracle.com> wrote:
>
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you can confirm the sender and know the content is safe.
>
>
>
> Hi,
>
> Sorry for the delay in getting back to this.
>
> On 5/05/2020 7:37 pm, Liu, Xin wrote:
> > Hello, David and Nils
> >
> > Thank you to review the patch. I went to brush up my English grammar and then update my patch to rev04.
> > https://cr.openjdk.java.net/~xliu/8151779/04/webrev/
> > Here is the incremental diff: https://cr.openjdk.java.net/~xliu/8151779/r3_to_r4.diff It reflect changes based on David's feedbacks. I really appreciate that you review so carefully and found so many invaluable suggestions. TBH, I don't understand Amazon's copyright header neither. I choose the simple way to dodge that problem.
>
> In vmSymbols.hpp
>
> + // 1. Disable/Control Intrinsic accept a list of intrinsic IDs.
>
> s/accept/accepts/
>
> + // their final value are subject to hardware inspection
> (VM_Version::initialize).
>
> s/value/values/
>
> Otherwise all my nits have been addressed - thanks.
>
> I don't need to see a further webrev.
>
> Thanks,
> David
> -----
>
> > Nils points out a very tricky question. Yes, I also notice that each TriBool takes 4 bytes on x86_64. It's a natural machine word and supposed to be the most efficient form. As a result, the vector control_words take about 1.3Kb for all intrinsics. I thought it's not a big deal, but Nils brought up that each DirectiveSet will increase from 128b to 1440b. Theoretically, the user may provide a CompileCommandFile which consists of hundreds of directives. Will hotspot have hundreds of DirectiveSet in that case?
> >
> > Actually, I do have a compacted container of TriBool. It's like a vector<bool> specialization.
> > https://cr.openjdk.java.net/~xliu/8151779/TriBool.cpp
> >
> > The reason I didn't include it because I still feel that a few KiloBytes memories are not a big deal. Nowadays, hotspot allows Java programmers allocate over 100G heap. Is it wise to increase software complexity to save KBs?
> >
> > If you think it matters, I can integrate it. May I update TriBoolArray in a standalone JBS? I have made a lot of changes. I hope I can verify them using KitchenSink?
> >
> > For the second problem, I think it's because I used 'memset' to initialize an array of objects in rev01. Previously, I had code like this:
> > memset(&_intrinsic_control_words[0], 0, sizeof(_intrinsic_control_words));
> >
> > This kind of usage will be warned as -Werror=class-memaccess in g++-8. I have fixed it since rev02. I use DirectiveSet::fill_in(). Please check out.
> >
> > Thanks,
> > --lx
> >
>
>
More information about the hotspot-compiler-dev
mailing list