[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