Ping 3: Add a LOAD_SEQUENCE_POINT ISDOpcode
Richard Sandiford
rsandifo at linux.vnet.ibm.com
Fri Dec 6 09:59:52 PST 2013
Evan Cheng <evan.cheng at apple.com> writes:
> On Dec 6, 2013, at 1:24 AM, Richard Sandiford
> <rsandifo at linux.vnet.ibm.com> wrote:
>
>> Evan Cheng <evan.cheng at apple.com> writes:
>>> On Dec 5, 2013, at 3:07 AM, Richard Sandiford
>>> <rsandifo at linux.vnet.ibm.com> wrote:
>>>
>>>> Hi Evan,
>>>>
>>>> Thanks for the review.
>>>>
>>>> Evan Cheng <evan.cheng at apple.com> writes:
>>>>> I'm not very comfortable with adding a generic opcode. Can't you use a
>>>>> target specific intrinsic?
>>>>
>>>> If the opcode's out, is it still OK to have a TargetLowering hook that
>>>> gets called before atomic and volatile loads, as in the patch below?
>>>> This replaces the getInsertLoadSequencePoints() function from the first
>>>> patch but should be a bit more general (and hopefully a bit more intuitive,
>>>> since it's named after the situations in which it's used).
>>>
>>> Ideally I'd like to see the code for dealing with these loads in the
>>> target specific isel lowering code. Until we have other targets needing
>>> similar features, it's a bit difficult to understand whether a opcode
>>> and / or target hooks are needed. Do you think that's possible?
>>
>> I think doing it in LowerOperation() means that either (a) we just
>> insert a serialiasing instruction before the load or (b) we also replace
>> the load with a different representation, to indicate that it's properly
>> protected by a serialising instruction.
>>
>> The problem with (a) is that the meaning of a volatile load node then
>> depends on whether we're looking at it before or after lowering. It seems
>> bad to have that kind of phase-dependent interpretation.
>>
>> The problem with (b) is that, once protected, the load really is just
>> a normal load. The architecture has many register-memory instructions
>> and I think it would be quite difficult to go through and make sure
>> that everything that handles memory operands is also able to handle the
>> lowered form.
>
> I'm not sure if I completely follow you. But if the concern is to
> distinguish the loads, would it be cleaner to add a property to
> MemSDNode? And is this property related to SynchronizationScope property
> that's already on MemSDNode?
SynchronizationScope is only defined for atomics rather than normal
volatile loads though. I don't think it would make sense to "lower"
a volatile load to an atomic one. For one thing (at least AIUI)
all atomic loads are volatile at the DAG level, so in a sense they're
"higher" rather than "lower" than volatile loads. Also, it's useful to
allow volatile SEXTLOADs and ZEXTLOADs, which I don't think is possible
with atomics.
(FWIW I have a target-local follow-on patch for atomic loads and stores
and it goes the other way: lowering an atomic operation to a normal
volatile one once it has been properly protected.)
It's not really the load instruction itself that's special. I want
to match the load exactly as it's matched now and just make sure that
a separate instruction is emitted before it in the chain. For atomic
fences we do that at the IR->DAG boundary, and that seemed like the
cleanest place to handle this case too.
Thanks,
Richard
More information about the llvm-commits
mailing list