From 331e362574142e4c1d9d509533d1c96b6dc54d13 Mon Sep 17 00:00:00 2001 From: Carrot Wei Date: Thu, 15 May 2014 10:06:33 +0800 Subject: [4.8, 4.9] Add simplify-got This pass optimize GOT_PREL (already exists in toolchain/gcc/gcc-4.6) Backport from svn://gcc.gnu.org/svn/gcc/branches/google/gcc-4_6-mobile UNSPEC_GOT_PREL_SYM is now in new file arm/unspecs.md 4.9 port is slightly different due to changes in gcc passes See Google b/14811006 r173209 | carrot | 2011-04-30 16:07:46 +0800 (Sat, 30 Apr 2011) | 21 lines * hooks.c (hook_rtx_void_null): New function. * hooks.h (hook_rtx_void_null): New prototype. * target.def (got_access): New hook vector declaration. * tree-pass.h (pass_simplify_got): New pass. * timevar.def (TV_SIMPLIFY_GOT): New TV id. * simplify-got.c: New source file. * Makefile.in (simplify-got.o): Add a new file. * passes.c (init_optimization_passes): Add a new pass. * config/arm/arm.c (arm_output_addr_const_extra): Output GOT_PREL relocation. (arm_get_pic_reg): New function. (arm_clear_pic_reg): New function. (arm_can_simplify_got_access): New function. (arm_loaded_global_var): New function. (arm_load_global_address): New function. * config/arm/arm.md (UNSPEC_GOT_PREL_SYM): New UNSPEC symbol. * testsuite/gcc.target/arm/got1.c: New testcase. * testsuite/gcc.target/arm/got2.c: New testcase. Change-Id: I91e881df19bb6937a5fbcc8e6b83d158717c7773 --- gcc-4.9/gcc/testsuite/gcc.target/arm/got1.c | 10 ++++++++++ gcc-4.9/gcc/testsuite/gcc.target/arm/got2.c | 11 +++++++++++ 2 files changed, 21 insertions(+) create mode 100644 gcc-4.9/gcc/testsuite/gcc.target/arm/got1.c create mode 100644 gcc-4.9/gcc/testsuite/gcc.target/arm/got2.c (limited to 'gcc-4.9/gcc/testsuite') diff --git a/gcc-4.9/gcc/testsuite/gcc.target/arm/got1.c b/gcc-4.9/gcc/testsuite/gcc.target/arm/got1.c new file mode 100644 index 000000000..46a67fb9b --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.target/arm/got1.c @@ -0,0 +1,10 @@ +/* { dg-options "-Os -fpic" } */ +/* { dg-final { scan-assembler "GOT_PREL" } } */ + +extern int x; +int foo(int j) +{ + int t = x; + x = j; + return t; +} diff --git a/gcc-4.9/gcc/testsuite/gcc.target/arm/got2.c b/gcc-4.9/gcc/testsuite/gcc.target/arm/got2.c new file mode 100644 index 000000000..725f49e9c --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.target/arm/got2.c @@ -0,0 +1,11 @@ +/* We should not use GOT_PREL relocation to load global address with so + many global accesses. */ + +/* { dg-options "-Os -fpic" } */ +/* { dg-final { scan-assembler-not "GOT_PREL" } } */ + +extern int x1, x2, x3, x4, x5; +int sum() +{ + return x1 + x2 + x3 + x4 + x5; +} -- cgit v1.2.3