public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86
@ 2013-05-20 21:38 dhazeghi at yahoo dot com
  2013-05-21  8:19 ` [Bug middle-end/57344] [4.8/4.9 Regression] " jakub at gcc dot gnu.org
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: dhazeghi at yahoo dot com @ 2013-05-20 21:38 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 57344
           Summary: wrong code with pragma pack(1) and -O1 on x86
           Product: gcc
           Version: 4.9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dhazeghi at yahoo dot com

The following code produces wrong output on x86_64-linux-gnu in 32-bit mode,
when compiled at -O1 or higher optimizations.  It appears that the behavior
changed between gcc 4.6 which works at all optimization levels, and 4.7 which
does not.

$ gcc-trunk -v
gcc version 4.9.0 20130520 (experimental) [trunk revision 199099] (GCC) 
$ gcc-trunk -O0 -m32 wrong.c 
$ ./a.out 
-3161
$ gcc-trunk -O1 -m64 wrong.c 
$ ./a.out 
-3161
$ gcc-4.6 -O1 -m32 wrong.c 
$ ./a.out 
-3161
$ gcc-trunk -O1 -m32 wrong.c 
$ ./a.out 
2093991
$
--------------------------
int printf(const char *, ...);

#pragma pack(1)
struct S0
{
    int f0:11;
    int f1:22;
    char f2;
    int:0;
}
s[2];
int i;
int
main ()
{
    struct S0 tmp = { 0, -3161L };
    s[1] = tmp;
    for (; i < 1; i++)
        printf ("%d\n", s[1].f1);
    return 0;
}


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

* [Bug middle-end/57344] [4.8/4.9 Regression] wrong code with pragma pack(1) and -O1 on x86
  2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
@ 2013-05-21  8:19 ` jakub at gcc dot gnu.org
  2013-05-21  9:08 ` [Bug rtl-optimization/57344] [4.7/4.8/4.9 " rguenth at gcc dot gnu.org
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-05-21  8:19 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-05-21
                 CC|                            |jakub at gcc dot gnu.org
          Component|target                      |middle-end
   Target Milestone|---                         |4.8.1
            Summary|wrong code with pragma      |[4.8/4.9 Regression] wrong
                   |pack(1) and -O1 on x86      |code with pragma pack(1)
                   |                            |and -O1 on x86
     Ever confirmed|0                           |1

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Weird, bisect tells me this regressed with r186825, but that change wasn't a
trunk change at all.  *.optimized dump is the same, *.expand already looks
buggy.


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

* [Bug rtl-optimization/57344] [4.7/4.8/4.9 Regression] wrong code with pragma pack(1) and -O1 on x86
  2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
  2013-05-21  8:19 ` [Bug middle-end/57344] [4.8/4.9 Regression] " jakub at gcc dot gnu.org
@ 2013-05-21  9:08 ` rguenth at gcc dot gnu.org
  2013-05-21  9:15 ` jakub at gcc dot gnu.org
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2013-05-21  9:08 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|middle-end                  |rtl-optimization
      Known to work|                            |4.7.0
   Target Milestone|4.8.1                       |4.7.4
            Summary|[4.8/4.9 Regression] wrong  |[4.7/4.8/4.9 Regression]
                   |code with pragma pack(1)    |wrong code with pragma
                   |and -O1 on x86              |pack(1) and -O1 on x86
      Known to fail|                            |4.7.1, 4.7.3, 4.8.0, 4.9.0

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
Bi-secting on the 4.7 branch should reveal the offending patch.  Tree
optimizers
look good, so the issue is on the RTL or target side.


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

* [Bug rtl-optimization/57344] [4.7/4.8/4.9 Regression] wrong code with pragma pack(1) and -O1 on x86
  2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
  2013-05-21  8:19 ` [Bug middle-end/57344] [4.8/4.9 Regression] " jakub at gcc dot gnu.org
  2013-05-21  9:08 ` [Bug rtl-optimization/57344] [4.7/4.8/4.9 " rguenth at gcc dot gnu.org
@ 2013-05-21  9:15 ` jakub at gcc dot gnu.org
  2013-05-21 10:18 ` jakub at gcc dot gnu.org
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-05-21  9:15 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Yeah, the problem is definitely in store_split_bit_field.

One possible fix is:

--- gcc/expmed.c.jj    2013-05-14 10:54:58.000000000 +0200
+++ gcc/expmed.c    2013-05-21 10:54:59.707793889 +0200
@@ -1094,10 +1094,15 @@ store_split_bit_field (rtx op0, unsigned
       thispos = (bitpos + bitsdone) % unit;

       /* When region of bytes we can touch is restricted, decrease
-     UNIT close to the end of the region as needed.  */
+     UNIT close to the end of the region as needed.
+     Don't do this if op0 is a REG or SUBREG, there won't be any
+     data races on registers and the code assumes unit is
+     BITS_PER_WORD.  */
       if (bitregion_end
       && unit > BITS_PER_UNIT
-      && bitpos + bitsdone - thispos + unit > bitregion_end + 1)
+      && bitpos + bitsdone - thispos + unit > bitregion_end + 1
+      && !REG_P (op0)
+      && GET_CODE (op0) != SUBREG)
     {
       unit = unit / 2;
       continue;

Another one I'm currently testing is just not assuming unit is BITS_PER_WORD in
the SUBREG/REG handling code, and another one a mixture of both.

I don't know if we can actually end up with a SUBREG of MEM, if yes, then the
above patch is wrong, because it could introduce a data race in that case.  The
other fix on the other side might pessimize the case where we e.g. have a real
REG or SUBREG of some REG and store some bits in a first word and bitregion_end
tells us that we must not touch the last byte in the second word, but we need
to touch the rest.  On REGs there should be no data races.  So I'm probably
going with both changes together.


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

* [Bug rtl-optimization/57344] [4.7/4.8/4.9 Regression] wrong code with pragma pack(1) and -O1 on x86
  2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
                   ` (2 preceding siblings ...)
  2013-05-21  9:15 ` jakub at gcc dot gnu.org
@ 2013-05-21 10:18 ` jakub at gcc dot gnu.org
  2013-05-23  9:21 ` [Bug rtl-optimization/57344] [4.7 " jakub at gcc dot gnu.org
  2014-06-12 13:27 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-05-21 10:18 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |jakub at gcc dot gnu.org

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Created attachment 30151
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30151&action=edit
gcc49-pr57344.patch

Untested fix.


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

* [Bug rtl-optimization/57344] [4.7 Regression] wrong code with pragma pack(1) and -O1 on x86
  2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
                   ` (3 preceding siblings ...)
  2013-05-21 10:18 ` jakub at gcc dot gnu.org
@ 2013-05-23  9:21 ` jakub at gcc dot gnu.org
  2014-06-12 13:27 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: jakub at gcc dot gnu.org @ 2013-05-23  9:21 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Known to work|                            |4.8.1, 4.9.0
            Summary|[4.7/4.8/4.9 Regression]    |[4.7 Regression] wrong code
                   |wrong code with pragma      |with pragma pack(1) and -O1
                   |pack(1) and -O1 on x86      |on x86
      Known to fail|4.9.0                       |

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Author: jakub
Date: Thu May 23 09:17:34 2013
New Revision: 199238

URL: http://gcc.gnu.org/viewcvs?rev=199238&root=gcc&view=rev
Log:
    PR middle-end/57344
    * expmed.c (store_split_bit_field): If op0 is a REG or
    SUBREG of a REG, don't lower unit.  Handle unit not being
    always BITS_PER_WORD.

    * gcc.c-torture/execute/pr57344-1.c: New test.
    * gcc.c-torture/execute/pr57344-2.c: New test.
    * gcc.c-torture/execute/pr57344-3.c: New test.
    * gcc.c-torture/execute/pr57344-4.c: New test.

Added:
    trunk/gcc/testsuite/gcc.c-torture/execute/pr57344-1.c
    trunk/gcc/testsuite/gcc.c-torture/execute/pr57344-2.c
    trunk/gcc/testsuite/gcc.c-torture/execute/pr57344-3.c
    trunk/gcc/testsuite/gcc.c-torture/execute/pr57344-4.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/expmed.c
    trunk/gcc/testsuite/ChangeLog

Author: jakub
Date: Thu May 23 09:18:57 2013
New Revision: 199239

URL: http://gcc.gnu.org/viewcvs?rev=199239&root=gcc&view=rev
Log:
    PR middle-end/57344
    * expmed.c (store_split_bit_field): If op0 is a REG or
    SUBREG of a REG, don't lower unit.  Handle unit not being
    always BITS_PER_WORD.

    * gcc.c-torture/execute/pr57344-1.c: New test.
    * gcc.c-torture/execute/pr57344-2.c: New test.
    * gcc.c-torture/execute/pr57344-3.c: New test.
    * gcc.c-torture/execute/pr57344-4.c: New test.

Added:
    branches/gcc-4_8-branch/gcc/testsuite/gcc.c-torture/execute/pr57344-1.c
    branches/gcc-4_8-branch/gcc/testsuite/gcc.c-torture/execute/pr57344-2.c
    branches/gcc-4_8-branch/gcc/testsuite/gcc.c-torture/execute/pr57344-3.c
    branches/gcc-4_8-branch/gcc/testsuite/gcc.c-torture/execute/pr57344-4.c
Modified:
    branches/gcc-4_8-branch/gcc/ChangeLog
    branches/gcc-4_8-branch/gcc/expmed.c
    branches/gcc-4_8-branch/gcc/testsuite/ChangeLog

Fixed for 4.8/4.9+ so far.


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

* [Bug rtl-optimization/57344] [4.7 Regression] wrong code with pragma pack(1) and -O1 on x86
  2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
                   ` (4 preceding siblings ...)
  2013-05-23  9:21 ` [Bug rtl-optimization/57344] [4.7 " jakub at gcc dot gnu.org
@ 2014-06-12 13:27 ` rguenth at gcc dot gnu.org
  5 siblings, 0 replies; 7+ messages in thread
From: rguenth at gcc dot gnu.org @ 2014-06-12 13:27 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
         Resolution|---                         |FIXED
   Target Milestone|4.7.4                       |4.8.1
      Known to fail|                            |4.7.4

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


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

end of thread, other threads:[~2014-06-12 13:27 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-05-20 21:38 [Bug target/57344] New: wrong code with pragma pack(1) and -O1 on x86 dhazeghi at yahoo dot com
2013-05-21  8:19 ` [Bug middle-end/57344] [4.8/4.9 Regression] " jakub at gcc dot gnu.org
2013-05-21  9:08 ` [Bug rtl-optimization/57344] [4.7/4.8/4.9 " rguenth at gcc dot gnu.org
2013-05-21  9:15 ` jakub at gcc dot gnu.org
2013-05-21 10:18 ` jakub at gcc dot gnu.org
2013-05-23  9:21 ` [Bug rtl-optimization/57344] [4.7 " jakub at gcc dot gnu.org
2014-06-12 13:27 ` 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).