diff options
author | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-11-17 18:51:20 +0000 |
---|---|---|
committer | rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-11-17 18:51:20 +0000 |
commit | ae62deea323fb8805fe61b9743829db678843f0b (patch) | |
tree | 380228f624ddb3beca125c6b95fe59b5947f3faf /gcc/cfgexpand.c | |
parent | ff690865f1bd81b60e0479701db3ac0303d2fef2 (diff) | |
download | gcc-ae62deea323fb8805fe61b9743829db678843f0b.tar.gz |
Short-cut generation of simple built-in functions
This patch short-circuits the builtins.c expansion code for a particular
gimple call if:
- the function has an associated internal function
- the target implements that internal function
- the call has no side effects
This allows a later patch to remove the builtins.c code, once calls with
side effects have been handled.
Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.
gcc/
* builtins.h (called_as_built_in): Declare.
* builtins.c (called_as_built_in): Make external.
* internal-fn.h (expand_internal_call): Define a variant that
specifies the internal function explicitly.
* internal-fn.c (expand_load_lanes_optab_fn)
(expand_store_lanes_optab_fn, expand_ANNOTATE, expand_GOMP_SIMD_LANE)
(expand_GOMP_SIMD_VF, expand_GOMP_SIMD_LAST_LANE)
(expand_GOMP_SIMD_ORDERED_START, expand_GOMP_SIMD_ORDERED_END)
(expand_UBSAN_NULL, expand_UBSAN_BOUNDS, expand_UBSAN_VPTR)
(expand_UBSAN_OBJECT_SIZE, expand_ASAN_CHECK, expand_TSAN_FUNC_EXIT)
(expand_UBSAN_CHECK_ADD, expand_UBSAN_CHECK_SUB)
(expand_UBSAN_CHECK_MUL, expand_ADD_OVERFLOW, expand_SUB_OVERFLOW)
(expand_MUL_OVERFLOW, expand_LOOP_VECTORIZED)
(expand_mask_load_optab_fn, expand_mask_store_optab_fn)
(expand_ABNORMAL_DISPATCHER, expand_BUILTIN_EXPECT, expand_VA_ARG)
(expand_UNIQUE, expand_GOACC_DIM_SIZE, expand_GOACC_DIM_POS)
(expand_GOACC_LOOP, expand_GOACC_REDUCTION, expand_direct_optab_fn)
(expand_unary_optab_fn, expand_binary_optab_fn): Add an internal_fn
argument.
(internal_fn_expanders): Update prototype.
(expand_internal_call): Define a variant that specifies the
internal function explicitly. Use it to implement the previous
interface.
* cfgexpand.c (expand_call_stmt): Try to expand calls to built-in
functions as calls to internal functions.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230487 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index e55467a6bfe..1990e107db6 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2551,10 +2551,25 @@ expand_call_stmt (gcall *stmt) return; } + /* If this is a call to a built-in function and it has no effect other + than setting the lhs, try to implement it using an internal function + instead. */ + decl = gimple_call_fndecl (stmt); + if (gimple_call_lhs (stmt) + && !gimple_has_side_effects (stmt) + && (optimize || (decl && called_as_built_in (decl)))) + { + internal_fn ifn = replacement_internal_fn (stmt); + if (ifn != IFN_LAST) + { + expand_internal_call (ifn, stmt); + return; + } + } + exp = build_vl_exp (CALL_EXPR, gimple_call_num_args (stmt) + 3); CALL_EXPR_FN (exp) = gimple_call_fn (stmt); - decl = gimple_call_fndecl (stmt); builtin_p = decl && DECL_BUILT_IN (decl); /* If this is not a builtin function, the function type through which the |