From patchwork Mon Jul 26 16:33:48 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "H.J. Lu" X-Patchwork-Id: 59928 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D5799B6EF1 for ; Tue, 27 Jul 2010 02:34:03 +1000 (EST) Received: (qmail 17061 invoked by alias); 26 Jul 2010 16:33:59 -0000 Received: (qmail 17039 invoked by uid 22791); 26 Jul 2010 16:33:57 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from mail-vw0-f47.google.com (HELO mail-vw0-f47.google.com) (209.85.212.47) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 26 Jul 2010 16:33:50 +0000 Received: by vws13 with SMTP id 13so2800010vws.20 for ; Mon, 26 Jul 2010 09:33:48 -0700 (PDT) MIME-Version: 1.0 Received: by 10.220.125.83 with SMTP id x19mr4292698vcr.211.1280162028223; Mon, 26 Jul 2010 09:33:48 -0700 (PDT) Received: by 10.220.194.134 with HTTP; Mon, 26 Jul 2010 09:33:48 -0700 (PDT) Date: Mon, 26 Jul 2010 09:33:48 -0700 Message-ID: Subject: PATCH: Turn on -fomit-frame-pointer by default for 32bit Linux/x86 From: "H.J. Lu" To: Richard Guenther Cc: Andrew Pinski , GCC Patches , Uros Bizjak X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Wed, Jul 14, 2010 at 2:55 PM, H.J. Lu wrote: > On Wed, Jul 14, 2010 at 6:46 AM, H.J. Lu wrote: >> On Wed, Jul 14, 2010 at 1:09 AM, Richard Guenther >> wrote: >>> On Tue, Jul 13, 2010 at 11:44 PM, H.J. Lu wrote: >>>> On Tue, Jul 13, 2010 at 2:02 PM, Andrew Pinski wrote: >>>>> On Tue, Jul 13, 2010 at 2:01 PM, Andrew Pinski wrote: >>>>>> On Tue, Jul 13, 2010 at 1:59 PM, H.J. Lu wrote: >>>>>>> What will stop working when -fomit-frame-pointer is on? >>>>>> >>>>>> backtraces when debugging information is not turned on. >>>>> >>>>> See http://gcc.gnu.org/ml/gcc-patches/2004-08/msg01033.html and many >>>>> more.  This is not the first time this has been discussed. >>>> >>>> Most of 32bit x86 assembly codes in glibc have .eh_frame section. >>>> If backtrace is absolutely needed, they can add -fasynchronous-unwind-tables >>>> or -fno-omit-frame-pointer. >>> >>> We build opensuse with -fomit-frame-pointer -fasynchronous-unwind-tables. >>> If you want to make -fomit-frame-pointer the default then you should enable >>> unwind tables by default. >>> >> >> I will try and make it target/OS dependent. >> > > Here is a patch. How does it look? > Here are the updated patch and spread sheet for SPEC CPU 2000/2006 on Intel Core i7 which shows that -fomit-frame-pointer -fasynchronous-unwind-tables improves performance by up to 12% at -O2 and 8% at -O3. For -Os, it improves performance by up to 20%, but also increases code by up to 36%. This patch turns on -fomit-frame-pointer -fasynchronous-unwind-tables only if -Os isn't used. Tested on Linux/ia32 and Linux/x86-64 with -m32. OK for trunk? Thanks. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index dbb8949..640243e 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2985,10 +2985,27 @@ override_options (bool main_args_p) { if (flag_zee == 2) flag_zee = 0; + /* Unwind info is not correct around the CFG unless either a + frame pointer is present or -maccumulate-outgoing-args is + set. When both -fasynchronous-unwind-tables and + -fomit-frame-pointer are turned on by default, turn off + both if -mno-accumulate-outgoing-args is used. When + optimizing for size, don't turn on -fomit-frame-pointer nor + -fasynchronous-unwind-tables by default. */ if (flag_omit_frame_pointer == 2) - flag_omit_frame_pointer = 0; + flag_omit_frame_pointer + = (!optimize_size + && TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT + && (!TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT + || !(target_flags_explicit + & MASK_ACCUMULATE_OUTGOING_ARGS))); if (flag_asynchronous_unwind_tables == 2) - flag_asynchronous_unwind_tables = 0; + flag_asynchronous_unwind_tables + = (!optimize_size + && TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT + && (!TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT + || !(target_flags_explicit + & MASK_ACCUMULATE_OUTGOING_ARGS))); if (flag_pcc_struct_return == 2) flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN; } diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index e153920..2bb6d3e 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -467,6 +467,8 @@ extern tree x86_mfence; /* Extra bits to force on w/ 32-bit mode. */ #define TARGET_SUBTARGET32_DEFAULT 0 #define TARGET_SUBTARGET32_ISA_DEFAULT 0 +#define TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT 0 +#define TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT 0 /* Extra bits to force on w/ 64-bit mode. */ #define TARGET_SUBTARGET64_DEFAULT 0 diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h index 81dfd1e..61d53b5 100644 --- a/gcc/config/i386/linux.h +++ b/gcc/config/i386/linux.h @@ -219,3 +219,10 @@ along with GCC; see the file COPYING3. If not see /* i386 glibc provides __stack_chk_guard in %gs:0x14. */ #define TARGET_THREAD_SSP_OFFSET 0x14 #endif + +/* Turn on -fomit-frame-pointer and -fasynchronous-unwind-tables by + default. */ +#undef TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT +#define TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT 1 +#undef TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT +#define TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT 1 diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h index 33b4dc9..5a02205 100644 --- a/gcc/config/i386/linux64.h +++ b/gcc/config/i386/linux64.h @@ -123,3 +123,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see x86_64 glibc provides it in %fs:0x28. */ #define TARGET_THREAD_SSP_OFFSET (TARGET_64BIT ? 0x28 : 0x14) #endif + +/* Turn on -fomit-frame-pointer and -fasynchronous-unwind-tables by + default. */ +#undef TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT +#define TARGET_SUBTARGET32_OMIT_FRAME_POINTER_DEFAULT 1 +#undef TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT +#define TARGET_SUBTARGET32_ASYNCHRONOUS_UNWIND_TABLES_DEFAULT 1 diff --git a/gcc/testsuite/gcc.target/i386/frame-pointer-1.c b/gcc/testsuite/gcc.target/i386/frame-pointer-1.c new file mode 100644 index 0000000..ed4bff6 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/frame-pointer-1.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=i686" } */ +/* { dg-require-effective-target ilp32 } */ + +void bar (int); + +void +foo (void) +{ + bar (1); +} + +/* { dg-final { scan-assembler-not "pushl\[\\t \]*%ebp" } } */ diff --git a/gcc/testsuite/gcc.target/i386/frame-pointer-2.c b/gcc/testsuite/gcc.target/i386/frame-pointer-2.c new file mode 100644 index 0000000..b951ff4 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/frame-pointer-2.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=i686 -mno-accumulate-outgoing-args" } */ +/* { dg-require-effective-target ilp32 } */ + +void bar (int); + +void +foo (void) +{ + bar (1); +} + +/* { dg-final { scan-assembler "pushl\[\\t \]*%ebp" } } */ diff --git a/gcc/testsuite/gcc.target/i386/frame-pointer-3.c b/gcc/testsuite/gcc.target/i386/frame-pointer-3.c new file mode 100644 index 0000000..7a1d4d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/frame-pointer-3.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=i686 -mpush-args" } */ +/* { dg-require-effective-target ilp32 } */ + +void bar (int); + +void +foo (void) +{ + bar (1); +} + +/* { dg-final { scan-assembler-not "pushl\[\\t \]*%ebp" } } */ diff --git a/gcc/testsuite/gcc.target/i386/frame-pointer-4.c b/gcc/testsuite/gcc.target/i386/frame-pointer-4.c new file mode 100644 index 0000000..330a9ce --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/frame-pointer-4.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mtune=i686 -mpush-args -mno-accumulate-outgoing-args" } */ +/* { dg-require-effective-target ilp32 } */ + +void bar (int); + +void +foo (void) +{ + bar (1); +} + +/* { dg-final { scan-assembler "pushl\[\\t \]*%ebp" } } */ diff --git a/gcc/testsuite/gcc.target/i386/frame-pointer-5.c b/gcc/testsuite/gcc.target/i386/frame-pointer-5.c new file mode 100644 index 0000000..11240a2 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/frame-pointer-5.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-Os -mtune=i686" } */ +/* { dg-require-effective-target ilp32 } */ + +void bar (int); + +void +foo (void) +{ + bar (1); +} + +/* { dg-final { scan-assembler "pushl\[\\t \]*%ebp" } } */