This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Avoid -fcompare-debug differences caused by the inliner (PR tree-optimization/42645)
- From: Richard Guenther <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: Alexandre Oliva <aoliva at redhat dot com>, gcc-patches at gcc dot gnu dot org
- Date: Mon, 11 Jan 2010 17:20:23 +0100 (CET)
- Subject: Re: [PATCH] Avoid -fcompare-debug differences caused by the inliner (PR tree-optimization/42645)
- References: <20100111161651.GZ16723@hs20-bc2-1.build.redhat.com>
On Mon, 11 Jan 2010, Jakub Jelinek wrote:
> Hi!
>
> On the testcases below which lack return stmt -fcompare-debug fails, because
> remap_ssa_name called indirectly from copy_debug_stmt creates a SSA_NAME
> which obviously for -g0 isn't created, and differences in SSA_NAME versions
> are known to cause code differences. On these testcases remap_decl fails
> (returns just the passed in decl and sets processing_debug_stmt = -1,
> so the created SSA_NAME is completely useless, as the debug stmt is
> immediately reset, but even if remap_decl didn't fail, we don't want to
> create it.
>
> Bootstrapped/regtested on x86_64-linux, additionally tested with assert
> on cc1files/{MICO,FF3D,TRAMP3D} to make sure this sort of thing doesn't
> happen very often on real-world code (it didn't hit at all, except for
> the 2 testcases from this PR).
>
> Ok for trunk?
Ok.
Thanks,
Richard.
> 2010-01-11 Jakub Jelinek <jakub@redhat.com>
>
> PR tree-optimization/42645
> * tree-inline.c (processing_debug_stmt): Move earlier.
> (remap_ssa_name): If processing_debug_stmt and name wasn't found in
> decl_map, set processing_debug_stmt to -1 and return name without
> any remapping.
>
> * g++.dg/other/pr42645-1.C: New test.
> * g++.dg/other/pr42645-2.C: New test.
>
> --- gcc/tree-inline.c.jj 2010-01-08 20:48:10.000000000 +0100
> +++ gcc/tree-inline.c 2010-01-11 12:56:46.000000000 +0100
> @@ -171,6 +171,12 @@ insert_debug_decl_map (copy_body_data *i
> *pointer_map_insert (id->debug_map, key) = value;
> }
>
> +/* If nonzero, we're remapping the contents of inlined debug
> + statements. If negative, an error has occurred, such as a
> + reference to a variable that isn't available in the inlined
> + context. */
> +int processing_debug_stmt = 0;
> +
> /* Construct new SSA name for old NAME. ID is the inline context. */
>
> static tree
> @@ -185,6 +191,12 @@ remap_ssa_name (tree name, copy_body_dat
> if (n)
> return unshare_expr (*n);
>
> + if (processing_debug_stmt)
> + {
> + processing_debug_stmt = -1;
> + return name;
> + }
> +
> /* Do not set DEF_STMT yet as statement is not copied yet. We do that
> in copy_bb. */
> new_tree = remap_decl (SSA_NAME_VAR (name), id);
> @@ -244,12 +256,6 @@ remap_ssa_name (tree name, copy_body_dat
> return new_tree;
> }
>
> -/* If nonzero, we're remapping the contents of inlined debug
> - statements. If negative, an error has occurred, such as a
> - reference to a variable that isn't available in the inlined
> - context. */
> -int processing_debug_stmt = 0;
> -
> /* Remap DECL during the copying of the BLOCK tree for the function. */
>
> tree
> --- gcc/testsuite/g++.dg/other/pr42645-1.C.jj 2010-01-11 12:59:50.000000000 +0100
> +++ gcc/testsuite/g++.dg/other/pr42645-1.C 2010-01-11 13:00:40.000000000 +0100
> @@ -0,0 +1,26 @@
> +// PR tree-optimization/42645
> +// { dg-do compile }
> +// { dg-options "-fcompare-debug -O1" }
> +
> +extern void foo ();
> +
> +struct S
> +{
> + struct T
> + {
> + int t1;
> + char t2[4];
> + T *t3;
> + } t;
> + int m1 () const { return t.t3[0].t1; }
> + char *m2 () { foo (); }
> + void m3 (int x) { char *m = m2 (); if (m1 () > 0 && x > 0); }
> + void m4 () { if (m1 () > 0) for (int i = 0; i < 4; i++) t.t2[i] = 0; }
> +};
> +
> +void
> +f (S *a)
> +{
> + a->m3 (0);
> + a->m4 ();
> +}
> --- gcc/testsuite/g++.dg/other/pr42645-2.C.jj 2010-01-11 12:59:53.000000000 +0100
> +++ gcc/testsuite/g++.dg/other/pr42645-2.C 2010-01-11 13:00:55.000000000 +0100
> @@ -0,0 +1,34 @@
> +// PR tree-optimization/42645
> +// { dg-do compile }
> +// { dg-options "-fcompare-debug -O1" }
> +
> +struct C
> +{
> + bool b;
> + C ();
> +};
> +
> +static inline C *foo () {}
> +
> +extern void f4 ();
> +
> +static inline int
> +f3 ()
> +{
> + f4 ();
> +}
> +
> +static inline void
> +f2 (bool b)
> +{
> + int tmp = f3 ();
> + if (C ().b && b)
> + C ();
> +}
> +
> +void
> +f1 ()
> +{
> + C *c = foo ();
> + f2 (c->b);
> +}
>
> Jakub
>
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex