[Bug c++/35836] New: Wrong instruction generated for comparison with zero on PPC 64 bit
oder at eleks dot lviv dot ua
gcc-bugzilla@gcc.gnu.org
Sat Apr 5 19:44:00 GMT 2008
MacOS 10.5
============= begin of test.cpp =================
#include <stdio.h>
#include <libkern/OSAtomic.h>
typedef int32_t atomicord32;
static inline atomicord32 __attribute__((always_inline))
/*atomicord32 */AtomicIncrement(volatile atomicord32 *paoDestination)
{
return OSAtomicIncrement32Barrier(paoDestination);
}
bool TestAtomic_Increment()
{
bool bResult = false;
do
{
volatile atomicord32 aoStorage = (atomicord32)(-1);
if (AtomicIncrement(&aoStorage) != (atomicord32)0 || aoStorage
!= (atomicord32)0)
{
break;
}
if (AtomicIncrement(&aoStorage) != (atomicord32)1 || aoStorage
!= (atomicord32)1)
{
break;
}
bResult = true;
}
while (false);
return bResult;
}
int main()
{
bool bTestResult = TestAtomic_Increment();
printf("%d\n", (int)(bTestResult ? 1 : 0));
return 0;
}
============= end of test.cpp =================
with "-m64" TestAtomic_Increment compiles to
================
0x00000001000026e0 <_Z20TestAtomic_Incrementv+0>: mflr r0
0x00000001000026e4 <_Z20TestAtomic_Incrementv+4>: std r30,-16(r1)
0x00000001000026e8 <_Z20TestAtomic_Incrementv+8>: std r0,16(r1)
0x00000001000026ec <_Z20TestAtomic_Incrementv+12>: stdu r1,-160(r1)
0x00000001000026f0 <_Z20TestAtomic_Incrementv+16>: mr r30,r1
0x00000001000026f4 <_Z20TestAtomic_Incrementv+20>: li r0,0
0x00000001000026f8 <_Z20TestAtomic_Incrementv+24>: stb r0,112(r30)
0x00000001000026fc <_Z20TestAtomic_Incrementv+28>: li r0,-1
0x0000000100002700 <_Z20TestAtomic_Incrementv+32>: stw r0,116(r30)
0x0000000100002704 <_Z20TestAtomic_Incrementv+36>: addi r0,r30,116
0x0000000100002708 <_Z20TestAtomic_Incrementv+40>: mr r3,r0
0x000000010000270c <_Z20TestAtomic_Incrementv+44>: bl 0x1000017c4
<AtomicIncrement>
0x0000000100002710 <_Z20TestAtomic_Incrementv+48>: mr r0,r3
0x0000000100002714 <_Z20TestAtomic_Incrementv+52>: cmpdi cr7,r0,0
0x0000000100002718 <_Z20TestAtomic_Incrementv+56>: bne- cr7,0x10000272c
<_Z20TestAtomic_Incrementv+76>
0x000000010000271c <_Z20TestAtomic_Incrementv+60>: lwz r0,116(r30)
0x0000000100002720 <_Z20TestAtomic_Incrementv+64>: extsw r0,r0
0x0000000100002724 <_Z20TestAtomic_Incrementv+68>: cmpdi cr7,r0,0
0x0000000100002728 <_Z20TestAtomic_Incrementv+72>: beq- cr7,0x100002738
<_Z20TestAtomic_Incrementv+88>
0x000000010000272c <_Z20TestAtomic_Incrementv+76>: li r0,1
0x0000000100002730 <_Z20TestAtomic_Incrementv+80>: std r0,136(r30)
0x0000000100002734 <_Z20TestAtomic_Incrementv+84>: b 0x100002740
<_Z20TestAtomic_Incrementv+96>
0x0000000100002738 <_Z20TestAtomic_Incrementv+88>: li r0,0
0x000000010000273c <_Z20TestAtomic_Incrementv+92>: std r0,136(r30)
0x0000000100002740 <_Z20TestAtomic_Incrementv+96>: ld r0,136(r30)
0x0000000100002744 <_Z20TestAtomic_Incrementv+100>: cmpdi cr7,r0,0
0x0000000100002748 <_Z20TestAtomic_Incrementv+104>: bne- cr7,0x10000279c
<_Z20TestAtomic_Incrementv+188>
0x000000010000274c <_Z20TestAtomic_Incrementv+108>: addi r0,r30,116
0x0000000100002750 <_Z20TestAtomic_Incrementv+112>: mr r3,r0
0x0000000100002754 <_Z20TestAtomic_Incrementv+116>: bl 0x1000017c4
<AtomicIncrement>
0x0000000100002758 <_Z20TestAtomic_Incrementv+120>: mr r0,r3
0x000000010000275c <_Z20TestAtomic_Incrementv+124>: cmpwi cr7,r0,1
0x0000000100002760 <_Z20TestAtomic_Incrementv+128>: bne- cr7,0x100002774
<_Z20TestAtomic_Incrementv+148>
0x0000000100002764 <_Z20TestAtomic_Incrementv+132>: lwz r0,116(r30)
0x0000000100002768 <_Z20TestAtomic_Incrementv+136>: extsw r0,r0
0x000000010000276c <_Z20TestAtomic_Incrementv+140>: cmpwi cr7,r0,1
0x0000000100002770 <_Z20TestAtomic_Incrementv+144>: beq- cr7,0x100002780
<_Z20TestAtomic_Incrementv+160>
0x0000000100002774 <_Z20TestAtomic_Incrementv+148>: li r0,1
0x0000000100002778 <_Z20TestAtomic_Incrementv+152>: std r0,128(r30)
0x000000010000277c <_Z20TestAtomic_Incrementv+156>: b 0x100002788
<_Z20TestAtomic_Incrementv+168>
0x0000000100002780 <_Z20TestAtomic_Incrementv+160>: li r0,0
0x0000000100002784 <_Z20TestAtomic_Incrementv+164>: std r0,128(r30)
0x0000000100002788 <_Z20TestAtomic_Incrementv+168>: ld r0,128(r30)
0x000000010000278c <_Z20TestAtomic_Incrementv+172>: cmpdi cr7,r0,0
0x0000000100002790 <_Z20TestAtomic_Incrementv+176>: bne- cr7,0x10000279c
<_Z20TestAtomic_Incrementv+188>
0x0000000100002794 <_Z20TestAtomic_Incrementv+180>: li r0,1
0x0000000100002798 <_Z20TestAtomic_Incrementv+184>: stb r0,112(r30)
0x000000010000279c <_Z20TestAtomic_Incrementv+188>: lbz r0,112(r30)
0x00000001000027a0 <_Z20TestAtomic_Incrementv+192>: clrldi r0,r0,56
0x00000001000027a4 <_Z20TestAtomic_Incrementv+196>: mr r3,r0
0x00000001000027a8 <_Z20TestAtomic_Incrementv+200>: ld r1,0(r1)
0x00000001000027ac <_Z20TestAtomic_Incrementv+204>: ld r0,16(r1)
0x00000001000027b0 <_Z20TestAtomic_Incrementv+208>: mtlr r0
0x00000001000027b4 <_Z20TestAtomic_Incrementv+212>: ld r30,-16(r1)
0x00000001000027b8 <_Z20TestAtomic_Incrementv+216>: blr
================
For comparison of first AtomicIncrement() invocation result with zero "cmpdi
cr7,r0,0" instruction has been generated at 0x0000000100002714, which is
incorrect.
For comparison of second AtomicIncrement() invocation result with one "cmpwi
cr7,r0,1" instruction has been generated at 0x000000010000275c, which is
correct.
On exit from first call to AtomicIncrement() cr3 equals to 0x100000000
(naturally, 0x0FFFFFFFF + 1) and 8 byte comparison with zero yields incorrect
result.
osx-leopard:build oder$ g++ -m64 -o test test.cpp
osx-leopard:build oder$ ./test
0
--
Summary: Wrong instruction generated for comparison with zero on
PPC 64 bit
Product: gcc
Version: 4.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: oder at eleks dot lviv dot ua
GCC build triplet: ppc
GCC host triplet: ppc
GCC target triplet: ppc
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35836
More information about the Gcc-bugs
mailing list