This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/13511] New: Problem with compiler optimization -o2


We ran into a problem with compiler optimization -o2.
It is related to a macro which performs a variable bit shift and an assignment:
#define WRITE_TFI(x, value) { x[TFI_UPPER] = (char)(value >> 
SIZE_OF_BYTE_IN_BITS); x[TFI_LOWER] = (char)(value); }

The macro was used even in cases where SIZE_OF_BYTE_IN_BITS is 8 which means 
that a bit shift of 8 bits had to be performed.
This specific case seems to confuse GCC as the generated PowerPC assembler code 
lacks some instructions (see below).

Problem was initially observed with GCC 2.7.6.
Verification with GCC 2.95.3 showed the same problem.
Problem is independent of switch "-fstrict-aliasing".
Without optimization (i.e. -o0) everything is fine.

Sample code:

#define TFI_UPPER                       12
#define TFI_LOWER                       13
#define SIZE_OF_BYTE_IN_BITS          8
#define WRITE_TFI(x, value) { x[TFI_UPPER] = (char)(value >> 
SIZE_OF_BYTE_IN_BITS); x[TFI_LOWER] = (char)(value); }

char buffer[100];
char buffer2[100];

void test ()
{
	char *Frameptr = (char *) buffer;
	char *CEmsgArray = (char *)buffer2;

	Frameptr++;
	WRITE_TFI(CEmsgArray, *Frameptr);
	CEmsgArray[10]=(char) (*Frameptr);
	CEmsgArray[11]=(char) (*Frameptr);
}

With -o2 the instruction Frameptr is not being incremented at all!
With -o0 everything is fine.

---
Below 3 variants are given which show:
* -o2 bug
* -o2 without bug (bit shift 7 instead of 8)
* -o0 without bug

---
Example file with extended macro:
char buffer[100];
char buffer2[100];

void test2 ()
{
	char *Frameptr = (char *) buffer;
	char *CEmsgArray = (char *)buffer2;

	Frameptr++;

	CEmsgArray [12 ] = (char)(  *Frameptr  >> 8 );
	CEmsgArray [13 ] = (char)(  *Frameptr );

	CEmsgArray[10]=(char) (*Frameptr);
	CEmsgArray[11]=(char) (*Frameptr);
}

---
Assembler output (opt. enabled: -o2)
Instruction 'Frameptr++;' is missing:

void test2 ()
{
        char *Frameptr = (char *) buffer;
        char *CEmsgArray = (char *)buffer2;
   0:   3d 40 00 00     lis     r10,0
   4:   39 4a 00 00     addi    r10,r10,0

    
        Frameptr++;

        CEmsgArray [12 ] = (char)(  *Frameptr  >> 8 );  
   8:   38 00 00 00     li      r0,0
   c:   3d 60 00 00     lis     r11,0
  10:   98 0a 00 0c     stb     r0,12(r10)
  14:   39 6b 00 00     addi    r11,r11,0
        CEmsgArray [13 ] = (char)(  *Frameptr ); 
  18:   88 0b 00 00     lbz     r0,0(r11)
  1c:   98 0a 00 0d     stb     r0,13(r10)

        CEmsgArray[10]=(char) (*Frameptr);
  20:   89 2b 00 00     lbz     r9,0(r11)
  24:   99 2a 00 0a     stb     r9,10(r10)
        CEmsgArray[11]=(char) (*Frameptr);
  28:   88 0b 00 00     lbz     r0,0(r11)
  2c:   98 0a 00 0b     stb     r0,11(r10)
  30:   4e 80 00 20     blr

---
Assembler output (bit shift 7 instead of 8)
In this case everything is fine:
(Note: the main difference is the lbzu instruction in line 8)

void test2 ()
{
        char *Frameptr = (char *) buffer;
   0:   3d 40 00 00     lis     r10,0
   4:   39 4a 00 00     addi    r10,r10,0
        char *CEmsgArray = (char *)buffer2;

    
        Frameptr++;

        CEmsgArray [12 ] = (char)(  *Frameptr  >> 7 );  
   8:   8c 0a 00 01     lbzu    r0,1(r10)
   c:   3d 60 00 00     lis     r11,0
  10:   39 6b 00 00     addi    r11,r11,0
  14:   54 00 c9 fe     rlwinm  r0,r0,25,7,31
  18:   98 0b 00 0c     stb     r0,12(r11)
        CEmsgArray [13 ] = (char)(  *Frameptr ); 
  1c:   89 2a 00 00     lbz     r9,0(r10)
  20:   99 2b 00 0d     stb     r9,13(r11)

        CEmsgArray[10]=(char) (*Frameptr);
  24:   88 0a 00 00     lbz     r0,0(r10)
  28:   98 0b 00 0a     stb     r0,10(r11)
        CEmsgArray[11]=(char) (*Frameptr);
  2c:   89 2a 00 00     lbz     r9,0(r10)
  30:   99 2b 00 0b     stb     r9,11(r11)
  34:   4e 80 00 20     blr

---
Assembler output (without optimization, i.e. -o0):

void test2 ()
{
   0:	94 21 ff e0 	stwu	r1,-32(r1)
   4:	93 e1 00 1c 	stw	r31,28(r1)
   8:	7c 3f 0b 78 	mr	r31,r1
	char *Frameptr = (char *) buffer;
   c:	3d 20 00 00 	lis	r9,0
  10:	38 09 00 00 	addi	r0,r9,0
  14:	90 1f 00 08 	stw	r0,8(r31)
	char *CEmsgArray = (char *)buffer2;
  18:	3d 20 00 00 	lis	r9,0
  1c:	38 09 00 00 	addi	r0,r9,0
  20:	90 1f 00 0c 	stw	r0,12(r31)

    
	Frameptr++;
  24:	81 3f 00 08 	lwz	r9,8(r31)
  28:	38 09 00 01 	addi	r0,r9,1
  2c:	90 1f 00 08 	stw	r0,8(r31)
	
	CEmsgArray [12 ] = (char)(  *Frameptr  >> 8 );  
  30:	81 7f 00 0c 	lwz	r11,12(r31)
  34:	39 2b 00 0c 	addi	r9,r11,12
  38:	81 7f 00 08 	lwz	r11,8(r31)
  3c:	89 4b 00 00 	lbz	r10,0(r11)
  40:	55 40 06 3e 	clrlwi	r0,r10,24
  44:	7c 0b 46 70 	srawi	r11,r0,8
  48:	7d 60 5b 78 	mr	r0,r11
  4c:	98 09 00 00 	stb	r0,0(r9)
	CEmsgArray [13 ] = (char)(  *Frameptr ); 
  50:	81 7f 00 0c 	lwz	r11,12(r31)
  54:	39 2b 00 0d 	addi	r9,r11,13
  58:	81 7f 00 08 	lwz	r11,8(r31)
  5c:	88 0b 00 00 	lbz	r0,0(r11)
  60:	98 09 00 00 	stb	r0,0(r9)
	
	CEmsgArray[10]=(char) (*Frameptr);
  64:	81 7f 00 0c 	lwz	r11,12(r31)
  68:	39 2b 00 0a 	addi	r9,r11,10
  6c:	81 7f 00 08 	lwz	r11,8(r31)
  70:	88 0b 00 00 	lbz	r0,0(r11)
  74:	98 09 00 00 	stb	r0,0(r9)
	CEmsgArray[11]=(char) (*Frameptr);
  78:	81 7f 00 0c 	lwz	r11,12(r31)
  7c:	39 2b 00 0b 	addi	r9,r11,11
  80:	81 7f 00 08 	lwz	r11,8(r31)
  84:	88 0b 00 00 	lbz	r0,0(r11)
  88:	98 09 00 00 	stb	r0,0(r9)
  8c:	48 00 00 08 	b	94 <test2__Fv+0x94>
  90:	48 00 00 04 	b	94 <test2__Fv+0x94>

 

}
  94:	81 61 00 00 	lwz	r11,0(r1)
  98:	83 eb ff fc 	lwz	r31,-4(r11)
  9c:	7d 61 5b 78 	mr	r1,r11
  a0:	4e 80 00 20 	blr
  
  
---
Compiler commmand line:
/vobs/gnu/gcc/PPC.SunOS-5.8/gcc/bin/powerpc-wrs-vxworks-c++ -c 
tmp/__umc_vx_what.c -v \
-DOS_SunOS_5_8 -g -O0 -v -save-temps -fstrict-aliasing -Wall  -mcpu=603e -
DMODULE_TEST=off -DUMTS -DONEBTS -DFLEXENT \
-DMODCELL -DDM_PC -Dppc8260_TARGET -I.  -I../include \
-I/vobs/ubtssw_onecell_src/usl/pub/include \
-I/vobs/ubtssw_onecell_src/usl/pub/include/ssrv \
-I/vobs/ubtssw_onecell_src/usl/src/lcid \
-I/vobs/ubtssw_onecell_src/usl/include/bsp \
-I/vobs/ubtssw_onecell_src/usl/include/gdf \
-I/vobs/ubtssw_onecell_src/usl/include/osapi \
-I/vobs/ubtssw_onecell_src/usl/include/sim \
-I/vobs/ubtssw_onecell_src/usl/include/util -I/vobs/ubtssw_tornado/target/h \
-I/vobs/ubtssw_tools/codetest/include  \
-fkeep-inline-functions -DPPC_TARGET -DCPU=P603 \
-fvolatile -fno-for-scope -fdollars-in-identifiers -traditional -fno-builtin \
-nostdinc $1 

---
.ii file (-o2 with problem):

# 1 "test3.cc"
char buffer[100];
char buffer2[100];

void test2 ()
{
	char *Frameptr = (char *) buffer;
	char *CEmsgArray = (char *)buffer2;

    
	Frameptr++;
	
	CEmsgArray [12 ] = (char)(  *Frameptr  >> 8 );  
	CEmsgArray [13 ] = (char)(  *Frameptr ); 
	
	CEmsgArray[10]=(char) (*Frameptr);
	CEmsgArray[11]=(char) (*Frameptr);

 

}

---
Shell output of compiler:

powerpc-wrs-vxworks-c++: tmp/__umc_vx_what.c: No such file or directory
Reading specs from /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-
vxworks/2.95.3/specs
gcc version 2.95.3 20010315 (release)
 /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-vxworks/2.95.3/cpp0 -
lang-c++ -nostdinc -v -I. -I../include -
I/vobs/ubtssw_onecell_src/usl/pub/include -
I/vobs/ubtssw_onecell_src/usl/pub/include/ssrv -
I/vobs/ubtssw_onecell_src/usl/src/lcid -
I/vobs/ubtssw_onecell_src/usl/include/bsp -
I/vobs/ubtssw_onecell_src/usl/include/gdf -
I/vobs/ubtssw_onecell_src/usl/include/osapi -
I/vobs/ubtssw_onecell_src/usl/include/sim -
I/vobs/ubtssw_onecell_src/usl/include/util -I/vobs/ubtssw_tornado/target/h -
I/vobs/ubtssw_tools/codetest/include -iprefix /vobs/ubtssw_tornado/host/sun4-
solaris2/lib/gcc-lib/powerpc-wrs-vxworks/2.95.3/ -D__GNUC__=2 -D__GNUG__=2 -
D__GNUC_MINOR__=95 -D__cplusplus -D__vxworks -D__vxworks -Asystem(vxworks) -
Asystem(embedded) -Acpu(powerpc) -Amachine(powerpc) -D__EXCEPTIONS -
D__CHAR_UNSIGNED__ -D__OPTIMIZE__ -g -Wall -D_CALL_SYSV -D_BIG_ENDIAN -
D__BIG_ENDIAN__ -Amachine(bigendian) -D_ARCH_PPC -DOS_SunOS_5_8 -
DMODULE_TEST=off -DUMTS -DONEBTS -DFLEXENT -DMODCELL -DDM_PC -Dppc8260_TARGET -
DPPC_TARGET -DCPU=P603 test3.cc test3.ii
GNU CPP version 2.95.3 20010315 (release) (PowerPC System V.4)
#include "..." search starts here:
#include <...> search starts here:
 .
 /vobs/ubtssw_onecell_src/usl/pub/include
 /vobs/ubtssw_onecell_src/usl/pub/include/ssrv
 /vobs/ubtssw_onecell_src/usl/src/lcid
 /vobs/ubtssw_onecell_src/usl/include/bsp
 /vobs/ubtssw_onecell_src/usl/include/gdf
 /vobs/ubtssw_onecell_src/usl/include/util
 /vobs/ubtssw_tornado/target/h
End of search list.
The following default directories have been omitted from the search path:
 /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-
vxworks/2.95.3/../../../../include/g++-3
 /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-vxworks/2.95.3/include
 /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-
vxworks/2.95.3/../../../../powerpc-wrs-vxworks/sys-include
 /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-
vxworks/2.95.3/../../../../powerpc-wrs-vxworks/include
End of omitted list.
 /vobs/gnu/gcc/PPC.SunOS-5.8/gcc/lib/gcc-lib/powerpc-wrs-vxworks/2.95.3/cc1plus 
test3.ii -quiet -dumpbase test3.cc -mcpu=603e -g -O2 -Wall -version -fstrict-
aliasing -fkeep-inline-functions -fvolatile -fno-for-scope -fdollars-in-
identifiers -fno-builtin -o test3.s
GNU C++ version 2.95.3 20010315 (release) (powerpc-wrs-vxworks) compiled by GNU 
C version 2.95.3 20010315 (release).
 /vobs/gnu/gcc/PPC.SunOS-5.8/binutils/bin/powerpc-wrs-vxworks-as -mppc -V -Qy -
o test3.o test3.s
GNU assembler version 2.10 (powerpc-wrs-vxworks) using BFD version 2.10

-- 
           Summary: Problem with compiler optimization -o2
           Product: gcc
           Version: 2.95.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: osoentgen at lucent dot com
                CC: gcc-bugs at gcc dot gnu dot org
  GCC host triplet: SunOS 5.8
GCC target triplet: PowerPC


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]