public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call
@ 2013-10-31 16:00 Dimitar.Peikov at gmail dot com
  2013-11-04 14:10 ` [Bug c/58943] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Dimitar.Peikov at gmail dot com @ 2013-10-31 16:00 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 58943
           Summary: wrong calculation of indirect structure member
                    arithmetic via function call
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: critical
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Dimitar.Peikov at gmail dot com

Created attachment 31124
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=31124&action=edit
example for failed structure propagation

In attached file there is an example of invalid calculation where, a structure
with integer is manipulated inside a function call which takes struct as
pointer and same integer member is part of arithmetic result operation.
The issue was tested on several compilers 4.6.3, 4.7.2, 4.8.1 on different
platforms Linux and Windows with same result.


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
@ 2013-11-04 14:10 ` rguenth at gcc dot gnu.org
  2013-11-19 10:41 ` rguenth at gcc dot gnu.org
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-11-04 14:10 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-11-04
      Known to work|                            |3.3.6
   Target Milestone|---                         |4.7.4
            Summary|wrong calculation of        |[4.7/4.8/4.9 Regression]
                   |indirect structure member   |wrong calculation of
                   |arithmetic via function     |indirect structure member
                   |call                        |arithmetic via function
                   |                            |call
     Ever confirmed|0                           |1

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
  2013-11-04 14:10 ` [Bug c/58943] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
@ 2013-11-19 10:41 ` rguenth at gcc dot gnu.org
  2013-12-03 15:02 ` jakub at gcc dot gnu.org
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-11-19 10:41 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P2
           Severity|critical                    |normal


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
  2013-11-04 14:10 ` [Bug c/58943] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
  2013-11-19 10:41 ` rguenth at gcc dot gnu.org
@ 2013-12-03 15:02 ` jakub at gcc dot gnu.org
  2013-12-03 16:57 ` joseph at codesourcery dot com
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-12-03 15:02 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org,
                   |                            |jsm28 at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
If anything, this would be a C FE request for a change like PR45437 that made
into the C++ FE.  The question is if we want to do this only for flag_isoc11,
or also older.  Handling it during gimplification or later is impossible,
because
the difference between x[0] |= x[0] | f (); and x[0] = x[0] | f (); is already
lost there.


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (2 preceding siblings ...)
  2013-12-03 15:02 ` jakub at gcc dot gnu.org
@ 2013-12-03 16:57 ` joseph at codesourcery dot com
  2013-12-04 11:04 ` jakub at gcc dot gnu.org
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: joseph at codesourcery dot com @ 2013-12-03 16:57 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from joseph at codesourcery dot com <joseph at codesourcery dot com> ---
I think it should be fixed for all C standard versions, not just C11 (that 
is, the front end should produce something like (save (rhs), save (lhs) = 
save (lhs) op save (rhs)) to get the right order of evaluation).

As it's reported for at least 4.6 onwards and earlier versions didn't 
claim any C11 support and only C11 defined things sufficiently precisely 
for this to be a bug, I don't see this as a regression.


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (3 preceding siblings ...)
  2013-12-03 16:57 ` joseph at codesourcery dot com
@ 2013-12-04 11:04 ` jakub at gcc dot gnu.org
  2013-12-04 17:01 ` joseph at codesourcery dot com
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-12-04 11:04 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So something like:
--- gcc/c/c-typeck.c.jj    2013-12-03 08:27:22.000000000 +0100
+++ gcc/c/c-typeck.c    2013-12-04 11:53:57.160894632 +0100
@@ -5192,6 +5192,7 @@ build_modify_expr (location_t location,
 {
   tree result;
   tree newrhs;
+  tree rhseval = NULL_TREE;
   tree rhs_semantic_type = NULL_TREE;
   tree lhstype = TREE_TYPE (lhs);
   tree olhstype = lhstype;
@@ -5253,8 +5254,17 @@ build_modify_expr (location_t location,
       /* Construct the RHS for any non-atomic compound assignemnt. */
       if (!is_atomic_op)
         {
+      /* If in LHS op= RHS the RHS has side-effects, ensure they
+         are preevaluated before the rest of the assignment expression's
+         side-effects, because RHS could contain e.g. function calls
+         that modify LHS.  */
+      if (TREE_SIDE_EFFECTS (rhs))
+        {
+          newrhs = c_save_expr (rhs);
+          rhseval = newrhs;
+        }
       newrhs = build_binary_op (location,
-                    modifycode, lhs, rhs, 1);
+                    modifycode, lhs, newrhs, 1);

       /* The original type of the right hand side is no longer
          meaningful.  */
@@ -5268,7 +5278,7 @@ build_modify_expr (location_t location,
      if so, we need to generate setter calls.  */
       result = objc_maybe_build_modify_expr (lhs, newrhs);
       if (result)
-    return result;
+    goto return_result;

       /* Else, do the check that we postponed for Objective-C.  */
       if (!lvalue_or_else (location, lhs, lv_assign))
@@ -5362,7 +5372,7 @@ build_modify_expr (location_t location,
       if (result)
     {
       protected_set_expr_location (result, location);
-      return result;
+      goto return_result;
     }
     }

@@ -5383,11 +5393,15 @@ build_modify_expr (location_t location,
      as the LHS argument.  */

   if (olhstype == TREE_TYPE (result))
-    return result;
+    goto return_result;

   result = convert_for_assignment (location, olhstype, result, rhs_origtype,
                    ic_assign, false, NULL_TREE, NULL_TREE, 0);
   protected_set_expr_location (result, location);
+
+return_result:
+  if (rhseval)
+    result = build2 (COMPOUND_EXPR, TREE_TYPE (result), rhseval, result);
   return result;
 }


?  In any case, it will have various consequences on OpenMP and perhaps
vectorization.


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (4 preceding siblings ...)
  2013-12-04 11:04 ` jakub at gcc dot gnu.org
@ 2013-12-04 17:01 ` joseph at codesourcery dot com
  2014-01-15  8:04 ` jakub at gcc dot gnu.org
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: joseph at codesourcery dot com @ 2013-12-04 17:01 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #6 from joseph at codesourcery dot com <joseph at codesourcery dot com> ---
Yes, something like that.


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

* [Bug c/58943] [4.7/4.8/4.9 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (5 preceding siblings ...)
  2013-12-04 17:01 ` joseph at codesourcery dot com
@ 2014-01-15  8:04 ` jakub at gcc dot gnu.org
  2014-06-12 13:46 ` [Bug c/58943] [4.7/4.8 " rguenth at gcc dot gnu.org
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 11+ messages in thread
From: jakub at gcc dot gnu.org @ 2014-01-15  8:04 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Author: jakub
Date: Wed Jan 15 08:03:53 2014
New Revision: 206620

URL: http://gcc.gnu.org/viewcvs?rev=206620&root=gcc&view=rev
Log:
    PR c/58943
    * c-typeck.c (build_modify_expr): For lhs op= rhs, if rhs has side
    effects, preevaluate rhs using SAVE_EXPR first.

    * c-omp.c (c_finish_omp_atomic): Set in_late_binary_op around
    build_modify_expr with non-NOP_EXPR opcode.  Handle return from it
    being COMPOUND_EXPR.
    (c_finish_omp_for): Handle incr being COMPOUND_EXPR with first
    operand a SAVE_EXPR and second MODIFY_EXPR.

    * gcc.c-torture/execute/pr58943.c: New test.
    * gcc.dg/tree-ssa/ssa-fre-33.c (main): Avoid using += in the test.

Added:
    trunk/gcc/testsuite/gcc.c-torture/execute/pr58943.c
Modified:
    trunk/gcc/c-family/ChangeLog
    trunk/gcc/c-family/c-omp.c
    trunk/gcc/c/ChangeLog
    trunk/gcc/c/c-typeck.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-33.c


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

* [Bug c/58943] [4.7/4.8 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (6 preceding siblings ...)
  2014-01-15  8:04 ` jakub at gcc dot gnu.org
@ 2014-06-12 13:46 ` rguenth at gcc dot gnu.org
  2014-12-19 13:40 ` [Bug c/58943] [4.8 " jakub at gcc dot gnu.org
  2015-06-23  8:46 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2014-06-12 13:46 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58943

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|4.7.4                       |4.8.4

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
The 4.7 branch is being closed, moving target milestone to 4.8.4.


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

* [Bug c/58943] [4.8 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (7 preceding siblings ...)
  2014-06-12 13:46 ` [Bug c/58943] [4.7/4.8 " rguenth at gcc dot gnu.org
@ 2014-12-19 13:40 ` jakub at gcc dot gnu.org
  2015-06-23  8:46 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: jakub at gcc dot gnu.org @ 2014-12-19 13:40 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58943

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|4.8.4                       |4.8.5

--- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
GCC 4.8.4 has been released.


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

* [Bug c/58943] [4.8 Regression] wrong calculation of indirect structure member arithmetic via function call
  2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
                   ` (8 preceding siblings ...)
  2014-12-19 13:40 ` [Bug c/58943] [4.8 " jakub at gcc dot gnu.org
@ 2015-06-23  8:46 ` rguenth at gcc dot gnu.org
  9 siblings, 0 replies; 11+ messages in thread
From: rguenth at gcc dot gnu.org @ 2015-06-23  8:46 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58943

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |FIXED
   Target Milestone|4.8.5                       |4.9.0
      Known to fail|                            |4.8.5

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


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

end of thread, other threads:[~2015-06-23  8:44 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-10-31 16:00 [Bug c/58943] New: wrong calculation of indirect structure member arithmetic via function call Dimitar.Peikov at gmail dot com
2013-11-04 14:10 ` [Bug c/58943] [4.7/4.8/4.9 Regression] " rguenth at gcc dot gnu.org
2013-11-19 10:41 ` rguenth at gcc dot gnu.org
2013-12-03 15:02 ` jakub at gcc dot gnu.org
2013-12-03 16:57 ` joseph at codesourcery dot com
2013-12-04 11:04 ` jakub at gcc dot gnu.org
2013-12-04 17:01 ` joseph at codesourcery dot com
2014-01-15  8:04 ` jakub at gcc dot gnu.org
2014-06-12 13:46 ` [Bug c/58943] [4.7/4.8 " rguenth at gcc dot gnu.org
2014-12-19 13:40 ` [Bug c/58943] [4.8 " jakub at gcc dot gnu.org
2015-06-23  8:46 ` 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).