This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH]: Fix PR tree-optimization/21407
> It would seem rather dangerous to me to implement this optimization.
>
Again, it's been implemented and turned on for a couple months now, it's
not a proposal. :)
However, here is a patch to fully disable it and leave a note in it's
place for people who think of the same idea in the future.
I've added 21407 testcase to g++.dg/tree-ssa
Bootstrapped and regtested on i686-pc-linux-gnu
okay for mainline?
2005-05-09 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/21407
* tree-ssa-operands.c (note_addressable): Can't
use COMPONENT_REF target.
Index: tree-ssa-operands.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-operands.c,v
retrieving revision 2.82
diff -u -p -r2.82 tree-ssa-operands.c
--- tree-ssa-operands.c 6 May 2005 14:04:11 -0000 2.82
+++ tree-ssa-operands.c 10 May 2005 18:42:42 -0000
@@ -1886,35 +1886,14 @@ add_stmt_operand (tree *var_p, stmt_ann_
static void
note_addressable (tree var, stmt_ann_t s_ann)
{
- tree ref;
subvar_t svars;
- HOST_WIDE_INT offset;
- HOST_WIDE_INT size;
if (!s_ann)
return;
- /* If this is a COMPONENT_REF, and we know exactly what it touches, we only
- take the address of the subvariables it will touch.
- Otherwise, we take the address of all the subvariables, plus the real
- ones. */
-
- if (var && TREE_CODE (var) == COMPONENT_REF
- && (ref = okay_component_ref_for_subvars (var, &offset, &size)))
- {
- subvar_t sv;
- svars = get_subvars_for_var (ref);
-
- if (s_ann->addresses_taken == NULL)
- s_ann->addresses_taken = BITMAP_GGC_ALLOC ();
-
- for (sv = svars; sv; sv = sv->next)
- {
- if (overlap_subvar (offset, size, sv, NULL))
- bitmap_set_bit (s_ann->addresses_taken, var_ann (sv->var)->uid);
- }
- return;
- }
+ /* Note that it is *NOT OKAY* to use the target of a COMPONENT_REF
+ as the only thing we take the address of.
+ See PR 21407 and the ensuing mailing list discussion. */
var = get_base_address (var);
if (var && SSA_VAR_P (var))
Index: testsuite/g++.dg/tree-ssa/pr21407.C
===================================================================
RCS file: testsuite/g++.dg/tree-ssa/pr21407.C
diff -N testsuite/g++.dg/tree-ssa/pr21407.C
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/g++.dg/tree-ssa/pr21407.C 10 May 2005 18:42:42 -0000
@@ -0,0 +1,8 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+extern "C" void abort(void);
+struct T1 {int a, b; virtual void f(){}};
+struct T : T1 { struct T1 w; int b; };
+void foo (struct T1 *p) { struct T *q = dynamic_cast<T*>(p); if (q->b != 2) abort (); }
+/* We shouldn't kill the store to c.b, because foo uses it. */
+int main () { struct T c; c.b = 2; foo (&c); return 0; }