On Fri, Mar 6, 2015 at 12:48 PM, Bernd Edlinger <bernd.edlin...@hotmail.de> wrote: > Hi Richard, > > here is my new proposal, it addresses your objections and generates > "better" code for this test case: > > main: > .LFB0: > .cfi_startproc > pushq %rbp > .cfi_def_cfa_offset 16 > .cfi_offset 6, -16 > movq %rsp, %rbp > .cfi_def_cfa_register 6 > movl global+1(%rip), %eax > orl $2147483647, %eax > movl %eax, global+1(%rip) > movl global+1(%rip), %eax > andl $2147483647, %eax > cmpl $2147483647, %eax > je .L2 > call abort > .L2: > movl $0, %eax > popq %rbp > .cfi_def_cfa 7, 8 > ret > .cfi_endproc > > > I also tried to fix the comments. > > Reg-tested on x86_64 successfully and ARM is still running. > > Is it OK for trunk?
Looks ok to me apart from /* Check for cases of unaligned fields that must be split. */ - if (bitnum % BITS_PER_UNIT + bitsize > modesize - || (STRICT_ALIGNMENT - && bitnum % GET_MODE_ALIGNMENT (fieldmode) + bitsize > modesize)) + if (bitnum % (STRICT_ALIGNMENT ? modesize : BITS_PER_UNIT) + + bitsize > modesize + || (STRICT_ALIGNMENT && MEM_ALIGN (op0) < modesize)) return false; where I'd use GET_MODE_ALIGNMENT (fieldmode) rather than modesize (in both places). Please leave Eric the chance to comment. Thanks, Richard. > > > Thanks > Bernd. >