On Tue, Jul 7, 2015 at 8:07 AM, Jeff Law <l...@redhat.com> wrote: > On 06/29/2015 07:15 PM, Jim Wilson wrote: > So if these "copies" require a conversion, then isn't it fundamentally > wrong to have a PHI node which copies between them? That would seem to > implicate the eipa_sra pass as needing to be aware of these promotions and > avoid having these objects with different representations appearing on the > lhs/rhs of a PHI node.
My years at Cisco didn't give me a chance to work on the SSA passes, so I don't know much about how they work. But looking at this, I see that PHI nodes are eventually handed by emit_partition_copy in tree-outof-ssa.c, which calls convert_to_mode, so it appears that conversions between different (closely related?) types are OK in a PHI node. The problem in this case is that we have the exact same type for the src and dest. The only difference is that the ARM forces sign-extension for signed sub-word parameters and zero-extension for signed sub-word locals. Thus to detect the need for a conversion, you have to have the decls, and we don't have them here. There is also the problem that all of the SUBREG_PROMOTED_* stuff is in expand_expr and friends, which aren't used by the cfglayout/tree-outof-ssa.c code for PHI nodes. So we need to copy some of the SUBREG_PROMOTED_* handling into cfglyout/tree-outof-ssa, or modify them to call expand_expr for PHI nodes, and I haven't had any luck getting that to work yet. I still need to learn more about the code to figure out if this is possible. I also think that the ARM handling of PROMOTE_MODE is wrong. Treating a signed sub-word and unsigned can lead to inefficient code. This is part of the problem is much easier for me to fix. It may be hard to convince ARM maintainers that it should be changed though. I need more time to work on this too. I haven't looked at trying to forbid the optimizer from creating PHI nodes connecting parameters to locals. That just sounds like a strange thing to forbid, and seems likely to result in worse code by disabling too many optimizations. But maybe it is the right solution if neither of the other two options work. This should only be done when PROMOTE_MODE disagrees with TARGET_PROMOTE_FUNCTION_MODE, forcing the copy to require a conversion. Jim