RFR: 8241438: Move IntelJccErratum mitigation code to platform-specific code
Erik Österlund
erik.osterlund at oracle.com
Wed Apr 1 10:24:20 UTC 2020
Hi Vladimir,
On 2020-03-30 21:14, Vladimir Kozlov wrote:
> But you at least can do static check at the beginning of method:
>
> int MachNode::pd_alignment_required() const {
> if (VM_Version::has_intel_jcc_erratum()) {
> PhaseOutput* output = Compile::current()->output();
> Block* block = output->block();
> int index = output->index();
> assert(output->mach() == this, "incorrect iterator state in
> PhaseOutput");
> if (IntelJccErratum::is_jcc_erratum_branch(block, this, index)) {
> // Conservatively add worst case padding. We assume that
> relocInfo::addr_unit() is 1 on x86.
> return IntelJccErratum::largest_jcc_size() + 1;
> }
> }
> return 1;
> }
That is equivalent to the compiler. I verified that by disassembling the
release bits before
and after your suggestion, and it is instruction by instruction the
same. In both cases it
first checks ifVM_Version::has_intel_jcc_erratum(), and if not, returns
before even building
a frame. I'd rather keep the not nested variant because it is
equivalent, yet easier to read.
>>
>>> In compute_padding() reads done under check so I have less concerns
>>> about it. But I also don't get why you use saved _mach instead of
>>> using MachNode 'this'.
>>
>> Good point. I changed to this + an assert checking that they are
>> indeed the same.
>
> Why do you need Output._mach at all if you use it only in this assert?
> Even logically it looks strange. In what case it could be different?
It should never be different; that was the point. The index and mach
node exposed by the
iterator are related and refer to the same entity. So if you use the
exposed index in code
in a mach node, you must know that this mach node is the same mach node
that the index refers
to, and it is. The assert was meant to enforce it so that if you were to
call either the
alignment or padding function in a new context, for whatever reason, and
don't happen to know
that you can't do that without having a consistent iteration state, you
would immediately catch
that in the assertions, instead of getting strange silent logic errors.
Having said that, I am okay with removing _mach if you prefer having one
seat belt less, it is up to you:
http://cr.openjdk.java.net/~eosterlund/8241438/webrev.03/
Incremental:
http://cr.openjdk.java.net/~eosterlund/8241438/webrev.02_03/
Thanks,
/Erik
> Thanks,
> Vladimir
>
>>
>> Here is an updated webrev with your concerns and Vladimir Ivanov's
>> concerns addressed:
>> http://cr.openjdk.java.net/~eosterlund/8241438/webrev.02/
>>
>> Incremental:
>> http://cr.openjdk.java.net/~eosterlund/8241438/webrev.01_02/
>>
>> Thanks,
>> /Erik
>>
>>> Thanks,
>>> Vladimir
>>>
>>>>
>>>>> In pd_alignment_required() you implicitly use knowledge that
>>>>> relocInfo::addr_unit() on x86 is 1.
>>>>> At least add comment about that.
>>>>
>>>> I can add a comment about that.
>>>>
>>>> New webrev:
>>>> http://cr.openjdk.java.net/~eosterlund/8241438/webrev.01/
>>>>
>>>> Incremental:
>>>> http://cr.openjdk.java.net/~eosterlund/8241438/webrev.00_01/
>>>>
>>>> Thanks,
>>>> /Erik
>>>>
>>>>> Thanks,
>>>>> Vladimir
>>>>>
>>>>> On 3/23/20 6:09 AM, Erik Österlund wrote:
>>>>>> Hi,
>>>>>>
>>>>>> There is some platform-specific code in PhaseOutput that deals
>>>>>> with the IntelJccErratum mitigation,
>>>>>> which is ifdef:ed in shared code. It should move to
>>>>>> platform-specific code.
>>>>>>
>>>>>> This patch exposes the iteration state of PhaseOutput, which
>>>>>> allows hiding the Intel-specific code
>>>>>> completely in x86-specific files.
>>>>>>
>>>>>> Webrev:
>>>>>> http://cr.openjdk.java.net/~eosterlund/8241438/webrev.00/
>>>>>>
>>>>>> Bug:
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8241438
>>>>>>
>>>>>> Thanks,
>>>>>> /Erik
>>>>
>>
More information about the hotspot-compiler-dev
mailing list