[Bug middle-end/57748] [4.8/4.9 Regression] ICE when expanding assignment to unaligned zero-sized array
bernd.edlinger at hotmail dot de
gcc-bugzilla@gcc.gnu.org
Wed Sep 4 09:33:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57748
--- Comment #28 from Bernd Edlinger <bernd.edlinger at hotmail dot de> ---
(In reply to Richard Biener from comment #19)
> Barking up wrong trees. Hacky fix looks like:
>
> Index: gcc/expr.c
> ===================================================================
> --- gcc/expr.c (revision 202043)
> +++ gcc/expr.c (working copy)
> @@ -4753,6 +4753,9 @@ expand_assignment (tree to, tree from, b
> {
> enum machine_mode address_mode;
> rtx offset_rtx;
> + rtx saved_to_rtx = to_rtx;
> + if (misalignp)
> + to_rtx = mem;
>
> if (!MEM_P (to_rtx))
> {
> @@ -4785,6 +4788,11 @@ expand_assignment (tree to, tree from, b
> to_rtx = offset_address (to_rtx, offset_rtx,
> highest_pow2_factor_for_target (to,
> offset));
> + if (misalignp)
> + {
> + mem = to_rtx;
> + to_rtx = saved_to_rtx;
> + }
> }
>
> /* No action is needed if the target is not a memory and the field
>
>
this patch generates wrong code too:
foo:
.LFB9:
.cfi_startproc
pushq %rbx
.cfi_def_cfa_offset 16
.cfi_offset 3, -16
movq %rdi, %rbx
subq $16, %rsp
.cfi_def_cfa_offset 32
call get_i
movdqu (%rbx), %xmm0
cltq
movq .LC1(%rip), %xmm1
psrldq $8, %xmm0
punpcklqdq %xmm0, %xmm1
movdqu %xmm1, 16(%rbx,%rax,8)
addq $16, %rsp
.cfi_def_cfa_offset 16
popq %rbx
.cfi_def_cfa_offset 8
ret
.cfi_endproc
loads *s into xmm0, modifies low part,
writes back at s->b[0] and s->b[1].
More information about the Gcc-bugs
mailing list