Message ID | B580B8E56670DB4993CF59CB657624A84D6108DF@BADAG02.ba.imgtec.org |
---|---|
State | New |
Headers | show |
On 11/14/14 10:10, Radovan Obradovic wrote: > Thank you for the quick reply. > >> Please repost after updating to test HAVE_prologue and >> HAVE_epilogue and adding a testcase. > > I have managed to reproduce the problem on the small test case on > mips32, but the test is architecture independent and should probably > fail on many other ports without this patch. The optimization is also > disabled if macros HAVE_prologue and HAVE_epilogue are not defined or > have false value. Thanks. This looks good. I forgot to ask in my prior message, has this patch been bootstrapped and regression tested? If so, on what platform? Jeff
Patch has been tested with DejaGnu gcc test suite on mips32r2 cross compiler and bootstrapped and tested on x86_64 native compiler. Radovan
> -----Original Message----- > From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches- > owner@gcc.gnu.org] On Behalf Of Radovan Obradovic > Sent: Thursday, December 18, 2014 11:01 AM > To: Jeff Law; gcc-patches@gcc.gnu.org > Cc: Petar Jovanovic > Subject: RE: [PATCH] Disable -fuse-caller-save when -pg is active > > > Patch has been tested with DejaGnu gcc test suite on mips32r2 cross > compiler and bootstrapped and tested on > x86_64 native compiler. > Thanks for finishing up the testing. Would you like me to check this in for you? > ________________________________________ > From: Jeff Law [law@redhat.com] > Sent: Monday, November 17, 2014 1:18 PM > To: Radovan Obradovic; gcc-patches@gcc.gnu.org > Cc: Petar Jovanovic > Subject: Re: [PATCH] Disable -fuse-caller-save when -pg is active > > On 11/14/14 10:10, Radovan Obradovic wrote: > > Thank you for the quick reply. > > > >> Please repost after updating to test HAVE_prologue and HAVE_epilogue > >> and adding a testcase. > > > > I have managed to reproduce the problem on the small test case on > > mips32, but the test is architecture independent and should probably > > fail on many other ports without this patch. The optimization is also > > disabled if macros HAVE_prologue and HAVE_epilogue are not defined or > > have false value. > Thanks. This looks good. I forgot to ask in my prior message, has this patch > been bootstrapped and regression tested? If so, on what platform? > > Jeff
On 01/05/15 07:48, Moore, Catherine wrote: > > >> -----Original Message----- >> From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches- >> owner@gcc.gnu.org] On Behalf Of Radovan Obradovic >> Sent: Thursday, December 18, 2014 11:01 AM >> To: Jeff Law; gcc-patches@gcc.gnu.org >> Cc: Petar Jovanovic >> Subject: RE: [PATCH] Disable -fuse-caller-save when -pg is active >> >> >> Patch has been tested with DejaGnu gcc test suite on mips32r2 cross >> compiler and bootstrapped and tested on >> x86_64 native compiler. >> > Thanks for finishing up the testing. Would you like me to check this in for you? Please do. My recollection was that the patch itself looked fine, but that it needed to go through the usual testing cycle. jeff
On Fri, 14 Nov 2014, Radovan Obradovic wrote: > index eb37bfe..ddaf8e0 100644 > --- a/gcc/toplev.c > +++ b/gcc/toplev.c > @@ -1605,6 +1612,11 @@ process_options (void) > /* Save the current optimization options. */ > optimization_default_node = build_optimization_node (&global_options); > optimization_current_node = optimization_default_node; > + > + /* Disable use caller save optimization if profiler is active or port > + does not emit prologue and epilogue as RTL. */ > + if (profile_flag || !HAVE_prologue || !HAVE_epilogue) > + flag_use_caller_save = 0; > } This seems wrong. Why disable caller-save regardless of profile_flag; is there some long-standing bug in caller-save for "old" targets? I guess you want: > + if (profile_flag && (!HAVE_prologue || !HAVE_epilogue)) Not that it matter too much, I don't think we care about such targets. I don't even bother to grep if there is any. :) brgds, H-P
On 01/05/15 21:01, Hans-Peter Nilsson wrote: > On Fri, 14 Nov 2014, Radovan Obradovic wrote: >> index eb37bfe..ddaf8e0 100644 >> --- a/gcc/toplev.c >> +++ b/gcc/toplev.c > >> @@ -1605,6 +1612,11 @@ process_options (void) >> /* Save the current optimization options. */ >> optimization_default_node = build_optimization_node (&global_options); >> optimization_current_node = optimization_default_node; >> + >> + /* Disable use caller save optimization if profiler is active or port >> + does not emit prologue and epilogue as RTL. */ >> + if (profile_flag || !HAVE_prologue || !HAVE_epilogue) >> + flag_use_caller_save = 0; >> } > > This seems wrong. Why disable caller-save regardless of > profile_flag; is there some long-standing bug in caller-save for > "old" targets? It's actually -fipa-ra, use-caller-save was the initial name for the option and everyone agreed it was poorly named. The problem is that with -fipa-ra we analyze the generated RTL to determine register usage. We later use that information to optimize register allocation in callers. That works fine and good except for cases where we're emitting code textually rather than via RTL. That happens with profiling, textual prologue or textual epilogue. Thus the test is correct. Jeff
diff --git a/gcc/testsuite/gcc.dg/aru-2.c b/gcc/testsuite/gcc.dg/aru-2.c new file mode 100644 index 0000000..624bd7f --- /dev/null +++ b/gcc/testsuite/gcc.dg/aru-2.c @@ -0,0 +1,27 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -pg" } */ + +static int __attribute__((noinline)) +bar (int x) +{ + return x + 3; +} + +int __attribute__((noinline)) +foo (int y0, int y1, int y2, int y3, int y4) +{ + int r = 0; + r += bar (r + y4); + r += bar (r + y3); + r += bar (r + y2); + r += bar (r + y1); + r += bar (r + y0); + return r; +} + +int +main (void) +{ + int z = foo (0, 1, 2, 3, 4); + return !(z == 191); +} diff --git a/gcc/toplev.c b/gcc/toplev.c index eb37bfe..ddaf8e0 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -111,6 +111,13 @@ along with GCC; see the file COPYING3. If not see declarations for e.g. AIX 4.x. */ #endif +#ifndef HAVE_epilogue +#define HAVE_epilogue 0 +#endif +#ifndef HAVE_prologue +#define HAVE_prologue 0 +#endif + #include <new> static void general_init (const char *); @@ -1605,6 +1612,11 @@ process_options (void) /* Save the current optimization options. */ optimization_default_node = build_optimization_node (&global_options); optimization_current_node = optimization_default_node; + + /* Disable use caller save optimization if profiler is active or port + does not emit prologue and epilogue as RTL. */ + if (profile_flag || !HAVE_prologue || !HAVE_epilogue) + flag_use_caller_save = 0; } /* This function can be called multiple times to reinitialize the compiler