This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
RFC: failure of gcc.dg/funcorder.c on hppa64
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- To: gcc at gcc dot gnu dot org
- Date: Sun, 21 Mar 2004 00:25:52 -0500 (EST)
- Subject: RFC: failure of gcc.dg/funcorder.c on hppa64
I'm wondering if a "middle-end" expert comment on this optimization problem.
The funcorder.c test fails on hppa64 because in the following function
static int q()
{
int t=mem,r;
r=e();
if (t!=mem)
link_error();
return r;
}
the `if' is not eliminated. `e()' is pure, so it should be eliminated.
On hppa64, `t' is promoted to long with a zero extend. The `if' is a
SI mode comparison involving a subreg of `t'. Only combine is able to
combine zero extends with a subreg in an `if', but this can't occur
across a function call. The combine pass occurs after the final flow
graph analysis so even if combine were allowed to combine across pure
functions, the test would still fail because `q()' isn't recognized
as pure. On ports where `t' isn't promoted, the `if' is eliminated
in the cse pass and `q()' is recognized as being pure.
Is there any hope of enhancing cse/gcse to deal with promoted variables
in a better way?
Dave
--
J. David Anglin dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada (613) 990-0752 (FAX: 952-6602)