This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/13511] New: Problem with compiler optimization -o2
- From: "osoentgen at lucent dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 30 Dec 2003 10:42:45 -0000
- Subject: [Bug c++/13511] New: Problem with compiler optimization -o2
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
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