On Wed, May 18, 2016 at 7:43 PM, Jeff Law <l...@redhat.com> wrote: > On 05/17/2016 06:28 AM, Richard Biener wrote: >> >> >> The following patch addresses PR71104 which shows verify-SSA ICEs >> after gimplify-into-SSA. The issue is that for returns-twice calls >> we gimplify register uses in the LHS before the actual call which leads to >> >> p.0_1 = p; >> _2 = vfork (); >> *p.0_1 = _2; >> >> when gimplifying *p = vfork (). That of course does not work - >> fortunately the C standard allows to evaluate operands in the LHS >> in unspecified order of the RHS. That also makes this order aligned >> with that scary C++ proposal of defined evaluation order. It also >> improves code-generation, avoiding spilling of the pointer load >> around the call. >> >> Exchanging the gimplify calls doesn't fix the issue fully as for >> aggregate returns we don't gimplify the call result into a >> temporary. So we need to make sure to not emit an SSA when >> gimplifying the LHS of a returns-twice call (this path only applies >> to non-register returns). >> >> A bootstrap with just the gimplification order exchange is building >> target libs right now, I'll re-bootstrap and test the whole thing >> again if that succeeds. >> >> Is this ok? I think it makes sense code-generation-wise. Code >> changes from GCC 6 >> >> bar: >> .LFB0: >> .cfi_startproc >> subq $24, %rsp >> .cfi_def_cfa_offset 32 >> call foo >> movq p(%rip), %rax >> movq %rax, 8(%rsp) >> call vfork >> movq 8(%rsp), %rdx >> movl %eax, (%rdx) >> addq $24, %rsp >> .cfi_def_cfa_offset 8 >> ret >> >> to >> >> bar: >> .LFB0: >> .cfi_startproc >> subq $8, %rsp >> .cfi_def_cfa_offset 16 >> call foo >> call vfork >> movq p(%rip), %rdx >> movl %eax, (%rdx) >> addq $8, %rsp >> .cfi_def_cfa_offset 8 >> ret >> >> Thanks, >> Richard. >> >> 2016-05-17 Richard Biener <rguent...@suse.de> >> >> PR middle-end/71104 >> * gimplify.c (gimplify_modify_expr): Gimplify the RHS before >> gimplifying the LHS. Make sure to gimplify a returning twice >> call LHS without using SSA names. >> >> * gcc.dg/pr71104-1.c: New testcase. >> * gcc.dg/pr71104-2.c: Likewise. > > LGTM.
Now after Jason applied a better solution for gimplifying the RHS before the LHS I have applied the following after bootstrap / regtest on x86_64-unknown-linux-gnu. Richard. > jeff >
fix-pr71104
Description: Binary data