public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above
@ 2013-05-16 15:59 dhazeghi at yahoo dot com
  2013-05-16 16:18 ` [Bug tree-optimization/57303] " glisse at gcc dot gnu.org
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: dhazeghi at yahoo dot com @ 2013-05-16 15:59 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

            Bug ID: 57303
           Summary: struct miscompiled at -O1 and above
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dhazeghi at yahoo dot com

With current gcc trunk, the code below is miscompiled at -O1 and higher
optimization levels on x86_64-linux-gnu, outputting '1' instead of '0' as
expected.  This behavior appears in gcc 4.8.x and 4.7.x as well, but not in
4.6.x or earlier.  It occurs in both 32-bit and 64-bit compiles.

$ gcc-trunk -v
Target: x86_64-unknown-linux-gnu
Configured with: ../gcc-trunk/configure
--enable-languages=c,c++,objc,obj-c++,fortran,lto --disable-checking
--with-gmp=/usr/local/gcc-trunk --with-mpfr=/usr/local/gcc-trunk
--with-mpc=/usr/local/gcc-trunk --with-cloog=/usr/local/gcc-trunk
--prefix=/usr/local/gcc-trunk
Thread model: posix
gcc version 4.9.0 20130516 (experimental) [trunk revision 198967] (GCC) 
$ gcc-trunk -O0 small.c
$ ./a.out 
0
$ gcc-4.6 -O1 small.c
$ ./a.out 
0
$ gcc-trunk -O1 small.c
$ ./a.out 
1
$
-----------------------------

int printf(const char *, ...);

struct S0
{
    int f0;
};
struct S1
{
    struct S0 f0;
};

struct S1 x = { {0} };
struct S1 y = { {1} };

static void
foo (struct S0 p)
{
    struct S0 *l = &y.f0;
    *l = x.f0;
    if (p.f0)
        *l = *l;
}

int
main ()
{
    foo(y.f0);
    printf("%d\n", y.f0.f0);
    return 0;
}


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
@ 2013-05-16 16:18 ` glisse at gcc dot gnu.org
  2013-05-17  8:44 ` [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: glisse at gcc dot gnu.org @ 2013-05-16 16:18 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

Marc Glisse <glisse at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-05-16
          Component|rtl-optimization            |tree-optimization
     Ever confirmed|0                           |1

--- Comment #1 from Marc Glisse <glisse at gcc dot gnu.org> ---
Seems to come from the "sink" pass. But it is suspicious that nothing in gcc
removes the following long before we get there:
  MEM[(struct S0 *)&y] = MEM[(struct S0 *)&y];


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
  2013-05-16 16:18 ` [Bug tree-optimization/57303] " glisse at gcc dot gnu.org
@ 2013-05-17  8:44 ` rguenth at gcc dot gnu.org
  2013-05-17  9:05 ` rguenth at gcc dot gnu.org
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-05-17  8:44 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot gnu.org
   Target Milestone|---                         |4.7.4

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Mine.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
  2013-05-16 16:18 ` [Bug tree-optimization/57303] " glisse at gcc dot gnu.org
  2013-05-17  8:44 ` [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
@ 2013-05-17  9:05 ` rguenth at gcc dot gnu.org
  2013-05-20 16:05 ` glisse at gcc dot gnu.org
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-05-17  9:05 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
DSE has

          /* If use_stmt is or might be a nop assignment, e.g. for
             struct { ... } S a, b, *p; ...
             b = a; b = b;
             or
             b = a; b = *p; where p might be &b,
             or
             *p = a; *p = b; where p might be &b,
             or
             *p = *u; *p = *v; where p might be v, then USE_STMT
             acts as a use as well as definition, so store in STMT
             is not dead.  */
          if (stmt != use_stmt
              && ref_maybe_used_by_stmt_p (use_stmt, gimple_assign_lhs (stmt)))
            return;

for this very reason.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (2 preceding siblings ...)
  2013-05-17  9:05 ` rguenth at gcc dot gnu.org
@ 2013-05-20 16:05 ` glisse at gcc dot gnu.org
  2013-05-21  7:57 ` rguenther at suse dot de
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: glisse at gcc dot gnu.org @ 2013-05-20 16:05 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

--- Comment #6 from Marc Glisse <glisse at gcc dot gnu.org> ---
I wonder if, in addition to fixing the sink pass, we should add an optimization
like the following (it passes bootstrap+testsuite, but I am not so sure where
it should go and what it should look like exactly).

--- gimple-fold.c    (revision 199093)
+++ gimple-fold.c    (working copy)
@@ -1174,20 +1174,27 @@ fold_stmt_1 (gimple_stmt_iterator *gsi,
     if ((commutative_tree_code (subcode)
          || commutative_ternary_tree_code (subcode))
         && tree_swap_operands_p (gimple_assign_rhs1 (stmt),
                      gimple_assign_rhs2 (stmt), false))
       {
         tree tem = gimple_assign_rhs1 (stmt);
         gimple_assign_set_rhs1 (stmt, gimple_assign_rhs2 (stmt));
         gimple_assign_set_rhs2 (stmt, tem);
         changed = true;
       }
+    /* Remove *p = *p.  */
+    if (!inplace && TREE_CODE_CLASS (subcode) == tcc_reference
+        && operand_equal_p (lhs, gimple_assign_rhs1 (stmt), 0))
+      {
+        gsi_remove (gsi, true);
+        return true;
+      }
     new_rhs = fold_gimple_assign (gsi);
     if (new_rhs
         && !useless_type_conversion_p (TREE_TYPE (lhs),
                        TREE_TYPE (new_rhs)))
       new_rhs = fold_convert (TREE_TYPE (lhs), new_rhs);
     if (new_rhs
         && (!inplace
         || get_gimple_rhs_num_ops (TREE_CODE (new_rhs)) < old_num_ops))
       {
         gimple_assign_set_rhs_from_tree (gsi, new_rhs);


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (3 preceding siblings ...)
  2013-05-20 16:05 ` glisse at gcc dot gnu.org
@ 2013-05-21  7:57 ` rguenther at suse dot de
  2013-05-21  8:38 ` [Bug tree-optimization/57303] [4.7/4.8 " rguenth at gcc dot gnu.org
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenther at suse dot de @ 2013-05-21  7:57 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

--- Comment #7 from rguenther at suse dot de <rguenther at suse dot de> ---
On Mon, 20 May 2013, glisse at gcc dot gnu.org wrote:

> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303
> 
> --- Comment #6 from Marc Glisse <glisse at gcc dot gnu.org> ---
> I wonder if, in addition to fixing the sink pass, we should add an optimization
> like the following (it passes bootstrap+testsuite, but I am not so sure where
> it should go and what it should look like exactly).
> 
> --- gimple-fold.c    (revision 199093)
> +++ gimple-fold.c    (working copy)
> @@ -1174,20 +1174,27 @@ fold_stmt_1 (gimple_stmt_iterator *gsi,
>      if ((commutative_tree_code (subcode)
>           || commutative_ternary_tree_code (subcode))
>          && tree_swap_operands_p (gimple_assign_rhs1 (stmt),
>                       gimple_assign_rhs2 (stmt), false))
>        {
>          tree tem = gimple_assign_rhs1 (stmt);
>          gimple_assign_set_rhs1 (stmt, gimple_assign_rhs2 (stmt));
>          gimple_assign_set_rhs2 (stmt, tem);
>          changed = true;
>        }
> +    /* Remove *p = *p.  */
> +    if (!inplace && TREE_CODE_CLASS (subcode) == tcc_reference
> +        && operand_equal_p (lhs, gimple_assign_rhs1 (stmt), 0))
> +      {
> +        gsi_remove (gsi, true);
> +        return true;
> +      }

The obvious place would be dead store elimination.  But beware that
the above, if not _literally_ being *p = *p can be changing the
effective type of the memory location and thus might be not dead
in terms of type-based aliasing rules (which basically means that
we need to do sth more clever than just removing the store).


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7/4.8 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (4 preceding siblings ...)
  2013-05-21  7:57 ` rguenther at suse dot de
@ 2013-05-21  8:38 ` rguenth at gcc dot gnu.org
  2013-05-21 14:00 ` glisse at gcc dot gnu.org
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-05-21  8:38 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |4.9.0
            Summary|[4.7/4.8/4.9 Regression]    |[4.7/4.8 Regression] struct
                   |struct miscompiled at -O1   |miscompiled at -O1 and
                   |and above                   |above

--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> ---
Author: rguenth
Date: Tue May 21 08:11:23 2013
New Revision: 199135

URL: http://gcc.gnu.org/viewcvs?rev=199135&root=gcc&view=rev
Log:
2013-05-21  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/57303
    * tree-ssa-sink.c (statement_sink_location): Improve killing
    stmt detection and properly handle self-assignments.

    * gcc.dg/torture/pr57303.c: New testcase.

Added:
    trunk/gcc/testsuite/gcc.dg/torture/pr57303.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/tree-ssa-sink.c


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7/4.8 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (5 preceding siblings ...)
  2013-05-21  8:38 ` [Bug tree-optimization/57303] [4.7/4.8 " rguenth at gcc dot gnu.org
@ 2013-05-21 14:00 ` glisse at gcc dot gnu.org
  2013-05-22  8:08 ` [Bug tree-optimization/57303] [4.7 " rguenth at gcc dot gnu.org
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: glisse at gcc dot gnu.org @ 2013-05-21 14:00 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

--- Comment #9 from Marc Glisse <glisse at gcc dot gnu.org> ---
(In reply to rguenther@suse.de from comment #7)
> On Mon, 20 May 2013, glisse at gcc dot gnu.org wrote:
> > +    /* Remove *p = *p.  */
> > +    if (!inplace && TREE_CODE_CLASS (subcode) == tcc_reference
> > +        && operand_equal_p (lhs, gimple_assign_rhs1 (stmt), 0))
> > +      {
> > +        gsi_remove (gsi, true);
> > +        return true;
> > +      }
> 
> The obvious place would be dead store elimination.  But beware that
> the above, if not _literally_ being *p = *p can be changing the
> effective type of the memory location and thus might be not dead
> in terms of type-based aliasing rules (which basically means that
> we need to do sth more clever than just removing the store).

So operand_equal_p on a tcc_reference is not enough? Aliasing is complicated, I
guess I'll open a PR about this optimization.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (6 preceding siblings ...)
  2013-05-21 14:00 ` glisse at gcc dot gnu.org
@ 2013-05-22  8:08 ` rguenth at gcc dot gnu.org
  2014-03-17 14:39 ` rguenth at gcc dot gnu.org
  2014-03-17 14:39 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-05-22  8:08 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |4.8.1
            Summary|[4.7/4.8 Regression] struct |[4.7 Regression] struct
                   |miscompiled at -O1 and      |miscompiled at -O1 and
                   |above                       |above
      Known to fail|                            |4.7.3, 4.8.0

--- Comment #10 from Richard Biener <rguenth at gcc dot gnu.org> ---
Author: rguenth
Date: Wed May 22 07:50:40 2013
New Revision: 199179

URL: http://gcc.gnu.org/viewcvs?rev=199179&root=gcc&view=rev
Log:
2013-05-22  Richard Biener  <rguenther@suse.de>

    Backport from mainline
    2013-05-21  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/57318
    * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Do not
    estimate stmts with side-effects as likely eliminated.

    2013-05-21  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/57330
    * cgraph.c (cgraph_redirect_edge_call_stmt_to_callee): Properly
    preserve the call stmts fntype.

    * gcc.dg/torture/pr57330.c: New testcase.

    2013-05-21  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/57303
    * tree-ssa-sink.c (statement_sink_location): Properly handle
    self-assignments.

    * gcc.dg/torture/pr57303.c: New testcase.

Added:
    branches/gcc-4_8-branch/gcc/testsuite/gcc.dg/torture/pr57303.c
    branches/gcc-4_8-branch/gcc/testsuite/gcc.dg/torture/pr57330.c
Modified:
    branches/gcc-4_8-branch/gcc/ChangeLog
    branches/gcc-4_8-branch/gcc/cgraph.c
    branches/gcc-4_8-branch/gcc/testsuite/ChangeLog
    branches/gcc-4_8-branch/gcc/tree-ssa-loop-ivcanon.c
    branches/gcc-4_8-branch/gcc/tree-ssa-sink.c


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (7 preceding siblings ...)
  2013-05-22  8:08 ` [Bug tree-optimization/57303] [4.7 " rguenth at gcc dot gnu.org
@ 2014-03-17 14:39 ` rguenth at gcc dot gnu.org
  2014-03-17 14:39 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2014-03-17 14:39 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|---                         |FIXED

--- Comment #12 from Richard Biener <rguenth at gcc dot gnu.org> ---
Fixed.


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Bug tree-optimization/57303] [4.7 Regression] struct miscompiled at -O1 and above
  2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
                   ` (8 preceding siblings ...)
  2014-03-17 14:39 ` rguenth at gcc dot gnu.org
@ 2014-03-17 14:39 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2014-03-17 14:39 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57303

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
Author: rguenth
Date: Mon Mar 17 14:38:55 2014
New Revision: 208618

URL: http://gcc.gnu.org/viewcvs?rev=208618&root=gcc&view=rev
Log:
2014-03-17  Richard Biener  <rguenther@suse.de>

    Backport from mainline
    2013-05-21  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/57303
    * tree-ssa-sink.c (statement_sink_location): Properly handle
    self-assignments.

    * gcc.dg/torture/pr57303.c: New testcase.

    2013-12-02  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/59139
    * tree-ssa-loop-niter.c (chain_of_csts_start): Properly match
    code in get_val_for.
    (get_val_for): Use gcc_checking_asserts.

    * gcc.dg/torture/pr59139.c: New testcase.

    2014-02-14  Richard Biener  <rguenther@suse.de>

    PR tree-optimization/60183
    * tree-ssa-phiprop.c (propagate_with_phi): Avoid speculating
    loads.
    (tree_ssa_phiprop): Calculate and free post-dominators.

    * gcc.dg/torture/pr60183.c: New testcase.

Added:
    branches/gcc-4_7-branch/gcc/testsuite/gcc.dg/torture/pr57303.c
    branches/gcc-4_7-branch/gcc/testsuite/gcc.dg/torture/pr59139.c
    branches/gcc-4_7-branch/gcc/testsuite/gcc.dg/torture/pr60183.c
Modified:
    branches/gcc-4_7-branch/gcc/ChangeLog
    branches/gcc-4_7-branch/gcc/testsuite/ChangeLog
    branches/gcc-4_7-branch/gcc/tree-ssa-loop-niter.c
    branches/gcc-4_7-branch/gcc/tree-ssa-phiprop.c
    branches/gcc-4_7-branch/gcc/tree-ssa-sink.c


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2014-03-17 14:39 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-16 15:59 [Bug rtl-optimization/57303] New: struct miscompiled at -O1 and above dhazeghi at yahoo dot com
2013-05-16 16:18 ` [Bug tree-optimization/57303] " glisse at gcc dot gnu.org
2013-05-17  8:44 ` [Bug tree-optimization/57303] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
2013-05-17  9:05 ` rguenth at gcc dot gnu.org
2013-05-20 16:05 ` glisse at gcc dot gnu.org
2013-05-21  7:57 ` rguenther at suse dot de
2013-05-21  8:38 ` [Bug tree-optimization/57303] [4.7/4.8 " rguenth at gcc dot gnu.org
2013-05-21 14:00 ` glisse at gcc dot gnu.org
2013-05-22  8:08 ` [Bug tree-optimization/57303] [4.7 " rguenth at gcc dot gnu.org
2014-03-17 14:39 ` rguenth at gcc dot gnu.org
2014-03-17 14:39 ` rguenth at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).