From: Steve Ellcey Date: Fri, 13 Feb 2009 21:59:32 +0000 (+0000) Subject: re PR target/38056 (Missed tail calls on ia64) X-Git-Tag: releases/gcc-4.4.0~547 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c208436c7bef0b3d4aa15073347404b9178e9280;p=thirdparty%2Fgcc.git re PR target/38056 (Missed tail calls on ia64) PR target/38056 * config/ia64/ia64.c (ia64_function_ok_for_sibcall): Check TARGET_CONST_GP. * gcc.target/ia64/sibcall-opt-1.c: New test. * gcc.target/ia64/sibcall-opt-2.c: New test. From-SVN: r144168 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5f8aac03cb50..f4b29ef60038 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-02-13 Steve Ellcey + + PR target/38056 + * config/ia64/ia64.c (ia64_function_ok_for_sibcall): Check + TARGET_CONST_GP. + 2009-02-13 H.J. Lu PR target/39149 diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 6c28801500ab..495d943d10cc 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -4365,8 +4365,9 @@ ia64_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED) return false; /* We must always return with our current GP. This means we can - only sibcall to functions defined in the current module. */ - return decl && (*targetm.binds_local_p) (decl); + only sibcall to functions defined in the current module unless + TARGET_CONST_GP is set to true. */ + return (decl && (*targetm.binds_local_p) (decl)) || TARGET_CONST_GP; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a0f16507404f..ca7aece73b7a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2009-02-13 Steve Ellcey + + PR target/38056 + * gcc.target/ia64/sibcall-opt-1.c: New test. + * gcc.target/ia64/sibcall-opt-2.c: New test. + 2009-02-13 Paul Thomas PR fortran/36528 diff --git a/gcc/testsuite/gcc.target/ia64/sibcall-opt-1.c b/gcc/testsuite/gcc.target/ia64/sibcall-opt-1.c new file mode 100644 index 000000000000..6e8d1a2faed1 --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/sibcall-opt-1.c @@ -0,0 +1,12 @@ +/* PR target/38056. Do not do sibcall optimization across object file + boundery when -mconstant-gp is not used. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler "br.call.*bar" } } */ + +int bar(int x); + +int foo(int x) +{ + return (bar(x + 1)); +} diff --git a/gcc/testsuite/gcc.target/ia64/sibcall-opt-2.c b/gcc/testsuite/gcc.target/ia64/sibcall-opt-2.c new file mode 100644 index 000000000000..d802b792deae --- /dev/null +++ b/gcc/testsuite/gcc.target/ia64/sibcall-opt-2.c @@ -0,0 +1,12 @@ +/* PR target/38056. Do sibcall optimization across object file + boundery when -mconstant-gp is used. */ +/* { dg-do compile } */ +/* { dg-options "-O2 -mconstant-gp" } */ +/* { dg-final { scan-assembler-not "br.call.*bar" } } */ + +int bar(int x); + +int foo(int x) +{ + return (bar(x + 1)); +}