This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[tree-ssa] Another DFA fix
- From: law at redhat dot com
- To: gcc-patches at gcc dot gnu dot org
- Date: Wed, 30 Apr 2003 11:26:33 -0600
- Subject: [tree-ssa] Another DFA fix
- Reply-to: law at redhat dot com
Oh how I wish I had gotten involved in this code earlier, then I might
know why we have this tendency to ignore operands of ADDR_EXPRs....
While analyzing testsuite failures for my useless crud removal pass
I ran into this little gem.... Consider this code:
bar (d)
{
struct foo * u.1;
struct foo u;
u.d = d_1;
u.1_4 = &u_3;
return (int)u.1_4;
}
The statement u.1_4 = &u_3 has no uses or vuses because the DFA code
ignores most ADDR_EXPR expressions. That seems, well, wrong.
Anyway, since the statement in question has no operands, there uses of
u, so DCE deleted the u.d = d1 statement. Also since there were no uses
of u, the crud zapper deleted struct foo u.
This triggered an abort because, well, we'd removed the variable u,
but it still had a use in the program.
This fixes the problem, but I'd really like Diego to chime in with
the original rationale behind ignoring operands of ADDR_EXPRs so that
we can:
1. See if the rationale makes sense
2. Document whatever behavior we implement.
* tree-dfa.c (get_expr_operands): Do not ignore operands of an
an ADDR_EXPR if it is a PARM_DECL or VAR_DECL.
Index: tree-dfa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-dfa.c,v
retrieving revision 1.1.4.102
diff -c -3 -p -r1.1.4.102 tree-dfa.c
*** tree-dfa.c 30 Apr 2003 16:30:59 -0000 1.1.4.102
--- tree-dfa.c 30 Apr 2003 17:22:07 -0000
*************** get_expr_operands (stmt, expr_p, flags,
*** 337,343 ****
of interest. */
if (subcode != COMPONENT_REF
&& subcode != INDIRECT_REF
! && subcode != ARRAY_REF)
return;
/* Avoid recursion. */
--- 337,345 ----
of interest. */
if (subcode != COMPONENT_REF
&& subcode != INDIRECT_REF
! && subcode != ARRAY_REF
! && subcode != PARM_DECL
! && subcode != VAR_DECL)
return;
/* Avoid recursion. */