aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2015-11-17 18:51:20 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2015-11-17 18:51:20 +0000
commit4cfe7a6c3569019e33dc86a54ec03aef87ad5d83 (patch)
tree380228f624ddb3beca125c6b95fe59b5947f3faf /gcc/cfgexpand.c
parentb1dc4a20a797ed2718fb2ba3431753ce84db86b2 (diff)
downloadgcc-4cfe7a6c3569019e33dc86a54ec03aef87ad5d83.zip
gcc-4cfe7a6c3569019e33dc86a54ec03aef87ad5d83.tar.gz
gcc-4cfe7a6c3569019e33dc86a54ec03aef87ad5d83.tar.bz2
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. From-SVN: r230487
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r--gcc/cfgexpand.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index e55467a..1990e10 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