public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem
@ 2012-07-18  6:35 amodra at gmail dot com
  2012-07-18  6:36 ` [Bug target/54009] " amodra at gmail dot com
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: amodra at gmail dot com @ 2012-07-18  6:35 UTC (permalink / raw)
  To: gcc-bugs

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

             Bug #: 54009
           Summary: incorrect code generated for DFmode lo_sum mem
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: amodra@gmail.com


/* -O2 -m32 store to x.d in w uses
    lis 9,x+32764@ha
    stw 10,x+32764@l(9)
    stw 11,x+32768@l(9)  <--  wrap!  */

struct big {
  char a[32764];
  double d __attribute__ ((aligned (4)));
} __attribute__ ((packed));

extern struct big x;
double y;

void r (void)
{
  double tmp = x.d;
#if 1
  asm ("#": "+r" (tmp)
       : : "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
           "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
           "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
           "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31");
#endif
  y = tmp;
}

void w (void)
{
  double tmp = y;
#if 1
  asm ("#": "+r" (tmp)
       : : "fr0", "fr1", "fr2", "fr3", "fr4", "fr5", "fr6", "fr7",
           "fr8", "fr9", "fr10", "fr11", "fr12", "fr13", "fr14", "fr15",
           "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23",
           "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31");
#endif
  x.d = tmp;
}


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
@ 2012-07-18  6:36 ` amodra at gmail dot com
  2012-07-24  5:56 ` amodra at gcc dot gnu.org
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gmail dot com @ 2012-07-18  6:36 UTC (permalink / raw)
  To: gcc-bugs

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

Alan Modra <amodra at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|                            |powerpc-linux
             Status|UNCONFIRMED                 |ASSIGNED
   Last reconfirmed|                            |2012-07-18
         AssignedTo|unassigned at gcc dot       |amodra at gmail dot com
                   |gnu.org                     |
     Ever Confirmed|0                           |1


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
  2012-07-18  6:36 ` [Bug target/54009] " amodra at gmail dot com
@ 2012-07-24  5:56 ` amodra at gcc dot gnu.org
  2012-07-24 12:43 ` amodra at gmail dot com
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gcc dot gnu.org @ 2012-07-24  5:56 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #1 from Alan Modra <amodra at gcc dot gnu.org> 2012-07-24 05:55:56 UTC ---
Author: amodra
Date: Tue Jul 24 05:55:50 2012
New Revision: 189801

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=189801
Log:
    PR target/53914
    PR target/54009
    * config/rs6000/constraints.md (Y): Use mem_operand_gpr.
    * config/rs6000/predicates.md (word_offset_memref_operand): Delete.
    Adjust all rs6000_legitimate_offset_address_p calls.
    * config/rs6000/rs6000-protos.h (mem_operand_gpr): Declare.
    (rs6000_secondary_reload_gpr): Declare.
    (rs6000_legitimate_offset_address_p): Update prototype.
    (rs6000_offsettable_memref_p): Delete.
    (rs6000_secondary_reload_ppc64): Delete.
    * config/rs6000/rs6000.c (address_offset): New function.
    (mem_operand_gpr): Likewise.
    (rs6000_legitimate_offset_address_p): Add worst_case param.  When
    not worst_case assume class of regs with least restrictive offsets.
    Adjust all calls.
    (legitimate_lo_sum_address_p): Simplify register mode tests.
    (rs6000_legitimize_address): Likewise.  Assume best case offset
    addressing.  Combine ELF and MACHO lo_sum code.
    (rs6000_mode_dependent_address): Correct offset addressing limits.
    (rs6000_offsettable_memref_p): Make static, add reg_mode param.
    Use reg_mode to help rs6000_legitimate_offset_address_p.
    (rs6000_secondary_reload): Use address_offset.  Handle 32-bit multi
    gpr load/store when offset too large.
    (rs6000_secondary_reload_gpr): Renamed rs6000_secondary_reload_ppc64.
    (rs6000_split_multireg_move): Adjust rs6000_offsettable_memref_p calls.
    * config/rs6000/rs6000.md (movdf_hardfloat32): Use 'Y' constraint
    for gpr load/store.  Order alternatives as r->Y,Y->r,r->r and
    d->m,m->d,d->d.  Correct size of gpr load/store.
    (movdf_softfloat32): Use 'Y' constraint for gpr load/store.  Order
    alternatives.
    (movti_ppc64): Likewise.
    (movdi_internal32): Likewise.  Also disparage fprs.
    (movdi_mfpgpr, movdi_internal64): Likewise.
    (movtf_internal): Use 'm' for fpr load/store.  Order alternatives.
    (movtf_softfloat): Order alternatives.
    (extenddftf2_internal): Use 'm' and 'Y' for store.
    (movti_power, movti_string): Use 'Y' for gpr load/store.  Order.
    (stack_protect_setdi, stack_protect_testdi): Likewise.
    (movdf_hardfloat64_mfpgpr, movdf_hardfloat64): Order alternatives.
    (movdf_softfloat64): Likewise.
    (reload_<mode>_store): Adjust reload_di_store to provide
    reload_si_store as well.
    (reload_<mode>_load): Likewise.


Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/rs6000/constraints.md
    trunk/gcc/config/rs6000/predicates.md
    trunk/gcc/config/rs6000/rs6000-protos.h
    trunk/gcc/config/rs6000/rs6000.c
    trunk/gcc/config/rs6000/rs6000.md


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
  2012-07-18  6:36 ` [Bug target/54009] " amodra at gmail dot com
  2012-07-24  5:56 ` amodra at gcc dot gnu.org
@ 2012-07-24 12:43 ` amodra at gmail dot com
  2012-07-24 12:54 ` amodra at gmail dot com
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gmail dot com @ 2012-07-24 12:43 UTC (permalink / raw)
  To: gcc-bugs

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

Alan Modra <amodra at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |4.8.0

--- Comment #2 from Alan Modra <amodra at gmail dot com> 2012-07-24 12:43:23 UTC ---
The x+32768 assembly is fixed, but errors remain.  If you change the testcase
slightly, substituting 32764 with a smaller value, 2764 say, then r() accesses
x.d with an indirect address while w() does so using a lo_sum with an offset. 
This is wrong if the extern x is such that d straddles a 32k boundary.  In the
case of r(), the indirect address is generated in rs6000_split_multireg_move. 
It seems the fix for pr42427 specifically excluded lo_sum addresses, but if I
read the diff correctly, before that patch they were split.


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
                   ` (2 preceding siblings ...)
  2012-07-24 12:43 ` amodra at gmail dot com
@ 2012-07-24 12:54 ` amodra at gmail dot com
  2013-02-06 13:05 ` amodra at gmail dot com
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gmail dot com @ 2012-07-24 12:54 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Alan Modra <amodra at gmail dot com> 2012-07-24 12:53:35 UTC ---
No, I was mistaken.  The pr42427 patch isn't at fault here.


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
                   ` (3 preceding siblings ...)
  2012-07-24 12:54 ` amodra at gmail dot com
@ 2013-02-06 13:05 ` amodra at gmail dot com
  2013-02-07  2:38 ` amodra at gcc dot gnu.org
  2013-02-07  2:47 ` amodra at gmail dot com
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gmail dot com @ 2013-02-06 13:05 UTC (permalink / raw)
  To: gcc-bugs


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

--- Comment #4 from Alan Modra <amodra at gmail dot com> 2013-02-06 13:04:43 UTC ---
Regressed due to pr54131 fix.


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
                   ` (4 preceding siblings ...)
  2013-02-06 13:05 ` amodra at gmail dot com
@ 2013-02-07  2:38 ` amodra at gcc dot gnu.org
  2013-02-07  2:47 ` amodra at gmail dot com
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gcc dot gnu.org @ 2013-02-07  2:38 UTC (permalink / raw)
  To: gcc-bugs


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

--- Comment #5 from Alan Modra <amodra at gcc dot gnu.org> 2013-02-07 02:37:49 UTC ---
Author: amodra
Date: Thu Feb  7 02:37:37 2013
New Revision: 195836

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=195836
Log:
gcc/
    PR target/54009
    * config/rs6000/rs6000.c (mem_operand_gpr): Check that LO_SUM
    addresses won't wrap when offsetting.
    (rs6000_secondary_reload): Provide secondary reloads needed for
    wrapping LO_SUM addresses.

gcc/testsuite/
    PR target/54009
    * gcc.target/powerpc/pr54009.c: New test.


Added:
    trunk/gcc/testsuite/gcc.target/powerpc/pr54009.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/rs6000/rs6000.c
    trunk/gcc/testsuite/ChangeLog


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

* [Bug target/54009] incorrect code generated for DFmode lo_sum mem
  2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
                   ` (5 preceding siblings ...)
  2013-02-07  2:38 ` amodra at gcc dot gnu.org
@ 2013-02-07  2:47 ` amodra at gmail dot com
  6 siblings, 0 replies; 8+ messages in thread
From: amodra at gmail dot com @ 2013-02-07  2:47 UTC (permalink / raw)
  To: gcc-bugs


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

Alan Modra <amodra at gmail dot com> changed:

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

--- Comment #6 from Alan Modra <amodra at gmail dot com> 2013-02-07 02:46:30 UTC ---
Fixed.


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

end of thread, other threads:[~2013-02-07  2:47 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-18  6:35 [Bug target/54009] New: incorrect code generated for DFmode lo_sum mem amodra at gmail dot com
2012-07-18  6:36 ` [Bug target/54009] " amodra at gmail dot com
2012-07-24  5:56 ` amodra at gcc dot gnu.org
2012-07-24 12:43 ` amodra at gmail dot com
2012-07-24 12:54 ` amodra at gmail dot com
2013-02-06 13:05 ` amodra at gmail dot com
2013-02-07  2:38 ` amodra at gcc dot gnu.org
2013-02-07  2:47 ` amodra at gmail dot com

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).