Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug
Bug#: 38287
Product:  
Component:  
Status: RESOLVED
Resolution: FIXED
Assigned To: Eric Botcazou <ebotcazou@gcc.gnu.org>
Host:
Reported against  
Priority:  
Severity:  
Target Milestone:  
 
 
Target:
Reporter: Debian GCC Maintainers <debian-gcc@lists.debian.org>
Add CC:
CC:
Remove selected CCs
Build:
Patch URL:
Summary:
Keywords:
Known to work:
Known to fail:

Attachment Description Type Created Size Actions
Create a New Attachment (proposed patch, testcase, etc.) View All

Bug 38287 depends on: Show dependency tree
Show dependency graph
Bug 38287 blocks:

Additional Comments:






View Bug Activity   |   Format For Printing   |   Clone This Bug


Description:   Last confirmed: 2008-11-27 21:20 Opened: 2008-11-27 13:05
[forwarded from http://bugs.debian.org/506713]

seen with 4.1, 4.2, 4.3 branches, not on the trunk

Functions compiled for SPARC with both -O2 and -fPIC options, which
return structures and require global data, may have incorrect code
generated for them.

The following example is based on Qt 3, which is affected by this bug
(see #490999).  The code should of course print "1 + 1 = 2" but when
compiled for SPARC with -O2 -fPIC it prints "1 + 1 = 0" (or may crash).
The first two instructions generated for QTime::addMSecs() are a save
using %sp and a load relative to %sp which depends on the *old* value of
%sp.

This example appears to be compiled correctly if I remove either option
or reduce the value of MSECS_PER_DAY such that it can be an immediate
constant.

Ben.

#include <iostream>

class QTime
{
public:
    explicit QTime(int ms = 0) : ds(ms) {}
    static QTime currentTime() { return QTime(); }
    QTime addMSecs(int ms) const;
    int msecs() const { return ds; }
private:
    unsigned ds;
};

static const unsigned MSECS_PER_DAY = 86400000;

QTime QTime::addMSecs( int ms ) const
{
    QTime t;
    if ( ms < 0 ) {
        // % not well-defined for -ve, but / is.
        int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY;
        t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY)
                % MSECS_PER_DAY;
    } else {
        t.ds = ((int)ds + ms) % MSECS_PER_DAY;
    }
    return t;
}

int main(int argc, char* argv[] )
{
    std::cout << "1 + 1 = " << QTime(1).addMSecs(1).msecs() << std::endl;
}

------- Comment #1 From Eric Botcazou 2008-11-27 21:14 -------
Reproducible on Solaris as well (with -mcpu=v8 since -mcpu=v9 is the default).

------- Comment #2 From Eric Botcazou 2008-11-27 21:20 -------
Investigating.

------- Comment #3 From Eric Botcazou 2008-11-30 19:20 -------
Subject: Bug 38287

Author: ebotcazou
Date: Sun Nov 30 19:19:06 2008
New Revision: 142295

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142295
Log:
        PR target/38287
        * config/sparc/sparc.md (divsi3 expander): Remove constraints.
        (divsi3_sp32): Add new alternative with 'K' for operand #2.
        (cmp_sdiv_cc_set): Factor common string.
        (udivsi3_sp32): Add new alternative with 'K' for operand #2.
        Add TARGET_V9 case.
        (cmp_udiv_cc_set): Factor common string.

Added:
    trunk/gcc/testsuite/g++.dg/opt/reload3.C
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/config/sparc/sparc.md
    trunk/gcc/testsuite/ChangeLog

------- Comment #4 From Eric Botcazou 2008-11-30 19:22 -------
Subject: Bug 38287

Author: ebotcazou
Date: Sun Nov 30 19:21:10 2008
New Revision: 142296

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142296
Log:
        PR target/38287
        * config/sparc/sparc.md (divsi3 expander): Remove constraints.
        (divsi3_sp32): Add new alternative with 'K' for operand #2.
        (cmp_sdiv_cc_set): Factor common string.
        (udivsi3_sp32): Add new alternative with 'K' for operand #2.
        Add TARGET_V9 case.
        (cmp_udiv_cc_set): Factor common string.

Added:
    branches/gcc-4_3-branch/gcc/testsuite/g++.dg/opt/reload3.C
Modified:
    branches/gcc-4_3-branch/gcc/ChangeLog
    branches/gcc-4_3-branch/gcc/config/sparc/sparc.md
    branches/gcc-4_3-branch/gcc/testsuite/ChangeLog

------- Comment #5 From Eric Botcazou 2008-11-30 19:23 -------
Subject: Bug 38287

Author: ebotcazou
Date: Sun Nov 30 19:22:40 2008
New Revision: 142297

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142297
Log:
        PR target/38287
        * config/sparc/sparc.md (divsi3 expander): Remove constraints.
        (divsi3_sp32): Add new alternative with 'K' for operand #2.
        (cmp_sdiv_cc_set): Factor common string.
        (udivsi3_sp32): Add new alternative with 'K' for operand #2.
        Add TARGET_V9 case.
        (cmp_udiv_cc_set): Factor common string.

Added:
    branches/gcc-4_2-branch/gcc/testsuite/g++.dg/opt/reload3.C
Modified:
    branches/gcc-4_2-branch/gcc/ChangeLog
    branches/gcc-4_2-branch/gcc/config/sparc/sparc.md
    branches/gcc-4_2-branch/gcc/testsuite/ChangeLog

------- Comment #6 From Eric Botcazou 2008-11-30 19:24 -------
Subject: Bug 38287

Author: ebotcazou
Date: Sun Nov 30 19:23:38 2008
New Revision: 142298

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=142298
Log:
        PR target/38287
        * config/sparc/sparc.md (divsi3 expander): Remove constraints.
        (divsi3_sp32): Add new alternative with 'K' for operand #2.
        (cmp_sdiv_cc_set): Factor common string.
        (udivsi3_sp32): Add new alternative with 'K' for operand #2.
        Add TARGET_V9 case.
        (cmp_udiv_cc_set): Factor common string.

Modified:
    branches/gcc-4_1-branch/gcc/ChangeLog
    branches/gcc-4_1-branch/gcc/config/sparc/sparc.md

------- Comment #7 From Eric Botcazou 2008-11-30 19:27 -------
Thanks for the reduced testcase.

Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug