This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/53362] New: gcc 4.7 generates invalid code with -O3 and -mtune=bdver2
- From: "valerio at aimale dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 15 May 2012 15:26:49 +0000
- Subject: [Bug c/53362] New: gcc 4.7 generates invalid code with -O3 and -mtune=bdver2
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53362
Bug #: 53362
Summary: gcc 4.7 generates invalid code with -O3 and
-mtune=bdver2
Classification: Unclassified
Product: gcc
Version: 4.7.0
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: valerio@aimale.com
Hello,
I'm compiling R 2.15.0 on an AMD FX-8150, trying to take advantage of the
bdver2 platform.
The function jumpfun() in src/main/context.c is
/* jumpfun - jump to the named context */
===============================
static void jumpfun(RCNTXT * cptr, int mask, SEXP val)
{
Rboolean savevis = R_Visible;
/* run onexit/cend code for all contexts down to but not including
the jump target */
PROTECT(val);
R_run_onexits(cptr);
UNPROTECT(1);
R_Visible = savevis;
R_ReturnedValue = val;
R_GlobalContext = cptr; /* this used to be set to
cptr->nextcontext for non-toplevel
jumps (with the context set back at the
SETJMP for restarts). Changing this to
always using cptr as the new global
context should simplify some code and
perhaps allow loops to be handled with
fewer SETJMP's. LT */
R_restore_globals(R_GlobalContext);
LONGJMP(cptr->cjmpbuf, mask);
}
================================
with LONGJMP being
# define LONGJMP(x,i) siglongjmp(x,i)
With -O3 -mtune=bdver2 jumpfun() is compiled to:
0000000000000360 <jumpfun>:
360: 41 56 push %r14
362: 41 55 push %r13
364: 41 89 f5 mov %esi,%r13d
367: 41 54 push %r12
369: 49 89 d4 mov %rdx,%r12
36c: 55 push %rbp
36d: 48 8b 2d 00 00 00 00 mov 0x0(%rip),%rbp # 374
<jumpfun+0x14>
374: 53 push %rbx
375: 48 89 fb mov %rdi,%rbx
378: 48 89 d7 mov %rdx,%rdi
37b: 44 8b 75 00 mov 0x0(%rbp),%r14d
37f: e8 00 00 00 00 callq 384 <jumpfun+0x24>
384: 48 89 df mov %rbx,%rdi
387: e8 00 00 00 00 callq 38c <jumpfun+0x2c>
38c: bf 01 00 00 00 mov $0x1,%edi
391: e8 00 00 00 00 callq 396 <jumpfun+0x36>
396: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 39d
<jumpfun+0x3d>
39d: 48 89 df mov %rbx,%rdi
3a0: 44 89 75 00 mov %r14d,0x0(%rbp)
3a4: 4c 89 20 mov %r12,(%rax)
3a7: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 3ae
<jumpfun+0x4e>
3ae: 48 89 18 mov %rbx,(%rax)
3b1: e8 00 00 00 00 callq 3b6 <jumpfun+0x56>
3b6: 48 8d 7b 10 lea 0x10(%rbx),%rdi
3ba: 44 89 ee mov %r13d,%esi
3bd: e8 00 00 00 00 callq 3c2 <jumpfun+0x62>
3c2: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw
%cs:0x0(%rax,%rax,1)
3c9: 0f 1f 84 00 00 00 00
3d0: 00
3d1: 66 66 66 66 66 66 2e data32 data32 data32 data32 data32 nopw
%cs:0x0(%rax,%rax,1)
3d8: 0f 1f 84 00 00 00 00
3df: 00
with a SIGSEGV on 0x32c, while with -O -mtune=bdver2 compiles correctly to
000000000000228 <jumpfun>:
228: 41 56 push %r14
22a: 41 55 push %r13
22c: 41 54 push %r12
22e: 55 push %rbp
22f: 53 push %rbx
230: 48 89 fb mov %rdi,%rbx
233: 41 89 f5 mov %esi,%r13d
236: 48 89 d5 mov %rdx,%rbp
239: 4c 8b 25 00 00 00 00 mov 0x0(%rip),%r12 # 240
<jumpfun+0x18>
240: 45 8b 34 24 mov (%r12),%r14d
244: 48 89 d7 mov %rdx,%rdi
247: e8 00 00 00 00 callq 24c <jumpfun+0x24>
24c: 48 89 df mov %rbx,%rdi
24f: e8 00 00 00 00 callq 254 <jumpfun+0x2c>
254: bf 01 00 00 00 mov $0x1,%edi
259: e8 00 00 00 00 callq 25e <jumpfun+0x36>
25e: 45 89 34 24 mov %r14d,(%r12)
262: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 269
<jumpfun+0x41>
269: 48 89 28 mov %rbp,(%rax)
26c: 48 8b 05 00 00 00 00 mov 0x0(%rip),%rax # 273
<jumpfun+0x4b>
273: 48 89 18 mov %rbx,(%rax)
276: 48 89 df mov %rbx,%rdi
279: e8 00 00 00 00 callq 27e <jumpfun+0x56>
27e: 48 8d 7b 10 lea 0x10(%rbx),%rdi
282: 44 89 ee mov %r13d,%esi
285: e8 00 00 00 00 callq 28a <Rf_begincontext>
which works.
Gcc 4.7 compiled with "./configure --prefix=/usr/local/pkg/gcc-4.7.0
-program-suffix=4.7"
R compiled with
CC=gcc-4.7 \
CXX=g++-4.7 \
OBJC=gcc-4.7 \
FC=gfortran-4.7 \
F77=gfortran-4.7 \
CFLAGS="-O3 -mtune=bdver2" \
CXXFLAGS="-O3 -mtune=bdver2" \
OBJCFLAGS="-O3 -mtune=bdver2" \
FCFLAGS="-O3 -mtune=bdver2" \
FFLAGS="-O3 -mtune=bdver2" \
./configure \
--enable-R-shlib \
--enable-threads=posix \
--with-readline \
--with-system-pcre \
--prefix=/usr/local/pkg/R-2.15.0-k15 \
--with-x \
--with-system-zlib \
--with-cairo \
--with-jpeglib \
--with-blas \
--with-lapack \
--with-tcltk \
--with-libpng
Thanks,
Valerio
---
Valerio Aimale
Chief, Advanced Projects
Qforma
http://www.qforma.com