> On Jul 11, 2017, at 2:00 PM, Eric Botcazou <[email protected]> wrote:
>
>> the problem I had is:
>>
>> 1. we added a new special_memory_constraint for misaligned memory access,
>> one important requirement for this new special_memory_constraint is, the
>> address of the memory access is misaligned.
>
> OK, it's the other way around from the usage of special_memory_constraint.
> In other words, I'm not sure that you really need to use it in this case,
> a standard memory_constraint could be sufficient.
A standard memory_constraint has the same handling on spilled code as
special_memory_constraint:
2250 case CT_MEMORY:
2251 if (MEM_P (op)
2252 && satisfies_memory_constraint_p (op, cn))
2253 win = true;
2254 else if (spilled_pseudo_p (op))
2255 win = true;
as a result, if the new misaligned memory access was defined as a standard
memory_constraint, will have the same issue.
>
>> 2. per the current code in lra-constraints.c:
>>
>> 2286 case CT_SPECIAL_MEMORY:
>> 2287 if (MEM_P (op)
>> 2288 && satisfies_memory_constraint_p (op, cn))
>> 2289 win = true;
>> 2290 else if (spilled_pseudo_p (op))
>> 2291 win = true;
>> 2292 break;
>>
>> if the op is a pseudo_p that can be spilled, then it's treated as a
>> PERFECT MATCH.
>>
>> the issue only can be exposed by the following kind of RTL:
>>
>> (insn 34 13 14 2 (set (reg:DI 122)
>> (reg:DI 129)) misalign-3.c:12 125 {*movdi_insn_sp64}
>> (nil))
>>
>> i.e.
>> (1). REG2 move to REG1
>> and. (2). REG2 is a virtual reg (> the max hard regno, on Sparc, its 103),
>> therefore, must be spilled to stack.
>>
>> the current interpretation of special memory treat such REG2 as a perfect
>> match to special memory, and then spill it.
>> however, such spilled memory RTL is NOT match the MISALIGN requirement,
>> (i.e, the address of the memory access for the spilled RTL is not
>> misaligned)
>
> Yes, spilling will automatically meet alignment requirements, that's why it's
> allowed for special_memory_constraint.
You mean, even for the mis-alignment requirement, the spilled memory access
will met the mis-alignment?
>
> Why do you absolutely need to have a misaligned address?
we need to generate misaligned load/store insns ONLY for misaligned memory
access, therefore need a new
constraints for misaligned address.
As I checked the GCC source code, the special_memory_constraints only were
defined in i386 and sparc target, not
used quite often.
Qing
> Can't you just avert
> your eyes and pretend that the address is misaligned? This will be
> suboptimal
> but presumably work. To be honest, I'm not even sure that you really need an
> additional constraint, but I haven't investigated the subject seriously.
>
> --
> Eric Botcazou