GCC Bugzilla – Bug 38287
[4.1/4.2/4.3 regression] segfault at -O2 -fPIC -mcpu=v8
Last modified: 2008-11-30 19:27:31 UTC
[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; }
Reproducible on Solaris as well (with -mcpu=v8 since -mcpu=v9 is the default).
Investigating.
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
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
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
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
Thanks for the reduced testcase.