diff options
author | Andre Vieira <andre.simoesdiasvieira@arm.com> | 2016-12-09 16:46:42 +0000 |
---|---|---|
committer | Andre Vieira <avieira@gcc.gnu.org> | 2016-12-09 16:46:42 +0000 |
commit | d5a752ebc3c0105387c5298079ddc90043fcee2a (patch) | |
tree | 7a4c38b46db4e11a9e271ed95ebbb80ac6a2a445 | |
parent | d9e0fdff4fda08d9d2f60eff01e0c50dedf51ae9 (diff) | |
download | gcc-d5a752ebc3c0105387c5298079ddc90043fcee2a.zip gcc-d5a752ebc3c0105387c5298079ddc90043fcee2a.tar.gz gcc-d5a752ebc3c0105387c5298079ddc90043fcee2a.tar.bz2 |
PR78255: Make postreload aware of NO_FUNCTION_CSE
gcc/ChangeLog:
2016-12-09 Andre Vieira <andre.simoesdiasvieira@arm.com>
PR rtl-optimization/78255
* gcc/postreload.c (reload_cse_simplify): Do not CSE a function if
NO_FUNCTION_CSE is true.
gcc/testsuite/ChangeLog:
2016-12-09 Andre Vieira <andre.simoesdiasvieira@arm.com>
PR rtl-optimization/78255
* gcc.target/aarch64/pr78255.c: New.
* gcc.target/arm/pr78255-1.c: New.
* gcc.target/arm/pr78255-2.c: New.
From-SVN: r243494
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/postreload.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/aarch64/pr78255.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/pr78255-1.c | 57 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/pr78255-2.c | 12 |
6 files changed, 99 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2cf9595..96853f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-12-09 Andre Vieira <andre.simoesdiasvieira@arm.com> + + PR rtl-optimization/78255 + * gcc/postreload.c (reload_cse_simplify): Do not CSE a function if + NO_FUNCTION_CSE is true. + 2016-12-09 Cesar Philippidis <cesar@codesourcery.com> PR ipa/78027 diff --git a/gcc/postreload.c b/gcc/postreload.c index 539ad33..8325d12 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -90,6 +90,11 @@ reload_cse_simplify (rtx_insn *insn, rtx testreg) basic_block insn_bb = BLOCK_FOR_INSN (insn); unsigned insn_bb_succs = EDGE_COUNT (insn_bb->succs); + /* If NO_FUNCTION_CSE has been set by the target, then we should not try + to cse function calls. */ + if (NO_FUNCTION_CSE && CALL_P (insn)) + return false; + if (GET_CODE (body) == SET) { int count = 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9516b31..defbd5e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-12-09 Andre Vieira <andre.simoesdiasvieira@arm.com> + + PR rtl-optimization/78255 + * gcc.target/aarch64/pr78255.c: New. + * gcc.target/arm/pr78255-1.c: New. + * gcc.target/arm/pr78255-2.c: New. + 2016-12-09 Will Schmidt <will_schmidt@vnet.ibm.com> * gcc.target/powerpc/dimode-1.c: Update syntax on scan-assembler diff --git a/gcc/testsuite/gcc.target/aarch64/pr78255.c b/gcc/testsuite/gcc.target/aarch64/pr78255.c new file mode 100644 index 0000000..b078cf3 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/pr78255.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -mcmodel=tiny" } */ + +extern int bar (void *); + +int +foo (void) +{ + return bar ((void *)bar); +} + +/* { dg-final { scan-assembler "b\\s+bar" } } */ diff --git a/gcc/testsuite/gcc.target/arm/pr78255-1.c b/gcc/testsuite/gcc.target/arm/pr78255-1.c new file mode 100644 index 0000000..5a69682 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr78255-1.c @@ -0,0 +1,57 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +#include <string.h> + +struct table_s + { + void (*fun0) + ( void ); + void (*fun1) + ( void ); + void (*fun2) + ( void ); + void (*fun3) + ( void ); + void (*fun4) + ( void ); + void (*fun5) + ( void ); + void (*fun6) + ( void ); + void (*fun7) + ( void ); + } table; + +void callback0(){__asm("mov r0, r0 \n\t");} +void callback1(){__asm("mov r0, r0 \n\t");} +void callback2(){__asm("mov r0, r0 \n\t");} +void callback3(){__asm("mov r0, r0 \n\t");} +void callback4(){__asm("mov r0, r0 \n\t");} + +void test (void) { + memset(&table, 0, sizeof table); + + asm volatile ("" : : : "r3"); + + table.fun0 = callback0; + table.fun1 = callback1; + table.fun2 = callback2; + table.fun3 = callback3; + table.fun4 = callback4; + table.fun0(); +} + +void foo (void) +{ + __builtin_abort (); +} + +int main (void) +{ + unsigned long p = (unsigned long) &foo; + asm volatile ("mov r3, %0" : : "r" (p)); + test (); + + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/pr78255-2.c b/gcc/testsuite/gcc.target/arm/pr78255-2.c new file mode 100644 index 0000000..efa01e75 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr78255-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +extern int bar (void *); + +int +foo (void) +{ + return bar ((void*)bar); +} + +/* { dg-final { scan-assembler "b\\s+bar" } } */ |