https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71779
--- Comment #10 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
(In reply to James Greenhalgh from comment #2)
>
> So I have two questions.
>
> First, where did the DImode paradoxical subreg come from in the first place,
> and why wasn't it a zero-extend?
>
> Second, why did reload decide it was safe to choose a memory location for a
> paradoxical subreg and widen the size of the memory access?
>
the memory access is to a spill slot, but lra is apparently confused by
the paradoxical subreg and does only save 32 bits there while it expects
to read back 64 bits (the widenend &isl_obj_map_vtable):
@@ -4256,29 +4256,28 @@
add w20, w25, :lo12:isl_obj_set_vtable
adrp x28, isl_obj_map_vtable
uxtw x20, w20
- add w0, w28, :lo12:isl_obj_map_vtable
+ add w28, w28, :lo12:isl_obj_map_vtable
mov x21, 0
- str w0, [x29, 112]
- uxtw x0, w0
- str x0, [x29, 96]
+ uxtw x0, w28
+ str x0, [x29, 104]
.p2align 2
...
.L903:
ldr w0, [x19]
- ldr x20, [x29, 112]
- stp w4, w3, [x29, 104]
+ ldr x20, [x29, 104]
+ str w4, [x29, 112]
+ str w3, [x29, 124]
orr x1, x20, x21, lsl 32
bl to_union
- = without patch
+ = with patch
so it looks as if the stack slot x29+112 was only half filled
then read back with stack content
and with the patch from comment#9 it uses less stack slots,
and does uxtw before saving the value to x29+104
So could someone try to boot-strap and reg-test my patch on an aarch64 please?