From: Jakub Jelinek Date: Thu, 11 Feb 2016 09:04:19 +0000 (+0100) Subject: backport: re PR target/67770 (i386: -fshrink-wrap can interact badly with trampolines) X-Git-Tag: releases/gcc-4.9.4~345 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5710d371f54c1db23ae7ae80ba9974beea188e55;p=thirdparty%2Fgcc.git backport: re PR target/67770 (i386: -fshrink-wrap can interact badly with trampolines) Backported from mainline 2015-11-19 Jakub Jelinek PR target/67770 * config/i386/i386.md (simple_return): Disable if ix86_static_chain_on_stack is true. * gcc.target/i386/pr67770.c: New test. From-SVN: r233319 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f5e18855d473..f63667bcde57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-02-11 Jakub Jelinek + + Backported from mainline + 2015-11-19 Jakub Jelinek + + PR target/67770 + * config/i386/i386.md (simple_return): Disable if + ix86_static_chain_on_stack is true. + 2016-02-04 Jakub Jelinek Backported from mainline diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 2b19f6e307ec..bf148ed5cd2b 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -11584,10 +11584,14 @@ ;; We need to disable this for TARGET_SEH, as otherwise ;; shrink-wrapped prologue gets enabled too. This might exceed ;; the maximum size of prologue in unwind information. +;; Also disallow shrink-wrapping if using stack slot to pass the +;; static chain pointer - the first instruction has to be pushl %esi +;; and it can't be moved around, as we use alternate entry points +;; in that case. (define_expand "simple_return" [(simple_return)] - "!TARGET_SEH" + "!TARGET_SEH && !ix86_static_chain_on_stack" { if (crtl->args.pops_args) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0e077ca069d5..48a77ec19315 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2016-02-11 Jakub Jelinek + + Backported from mainline + 2015-11-19 Jakub Jelinek + + PR target/67770 + * gcc.target/i386/pr67770.c: New test. + 2016-02-04 Jakub Jelinek Backported from mainline diff --git a/gcc/testsuite/gcc.target/i386/pr67770.c b/gcc/testsuite/gcc.target/i386/pr67770.c new file mode 100644 index 000000000000..3826aff45b74 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr67770.c @@ -0,0 +1,40 @@ +/* PR target/67770 */ +/* { dg-do run { target ia32 } } */ +/* { dg-require-effective-target trampolines } */ +/* { dg-options "-O2" } */ + +#ifndef NO_TRAMPOLINES +__attribute__ ((noinline)) void +foo (int i, void (* __attribute__ ((regparm (3))) bar) (int)) +{ + bar (i); +} +#endif + +int +main () +{ +#ifndef NO_TRAMPOLINES + int p = 0; + + __attribute__ ((regparm (3), noinline)) void + bar (int i) + { + if (__builtin_expect (i, 0)) + ++p; + } + + foo (0, bar); + bar (0); + + if (p != 0) + __builtin_abort (); + + foo (1, bar); + bar (1); + + if (p != 2) + __builtin_abort (); +#endif + return 0; +}