diff options
author | Ilya Enkovich <enkovich.gnu@gmail.com> | 2015-11-24 09:45:20 +0000 |
---|---|---|
committer | Ilya Enkovich <ienkovich@gcc.gnu.org> | 2015-11-24 09:45:20 +0000 |
commit | 3de2a40ecdfa37efa403d4b46ef116225acb0dc0 (patch) | |
tree | 3418f5bf30bacb63903659e0d25d3b02c74fb671 /gcc/gimple-fold.c | |
parent | 8632824e9c117077ef95d907ff51553b584609ba (diff) | |
download | gcc-3de2a40ecdfa37efa403d4b46ef116225acb0dc0.zip gcc-3de2a40ecdfa37efa403d4b46ef116225acb0dc0.tar.gz gcc-3de2a40ecdfa37efa403d4b46ef116225acb0dc0.tar.bz2 |
re PR c/68337 ([MPX] memcpy() for arrays with function pointers results in huge resource usage and binaries)
gcc/
PR c/68337
* gimple-fold.c: Include ipa-chkp.h.
(gimple_fold_builtin_memory_op): Don't fold call if we
are going to instrument it and it may copy pointers.
gcc/testsuite/
PR c/68337
* gcc.target/i386/mpx/pr68337-1.c: New test.
* gcc.target/i386/mpx/pr68337-2.c: New test.
From-SVN: r230796
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r-- | gcc/gimple-fold.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 1ab20d1..6ff5e26 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -53,6 +53,7 @@ along with GCC; see the file COPYING3. If not see #include "gomp-constants.h" #include "optabs-query.h" #include "omp-low.h" +#include "ipa-chkp.h" /* Return true when DECL can be referenced from current unit. @@ -664,6 +665,18 @@ gimple_fold_builtin_memory_op (gimple_stmt_iterator *gsi, unsigned int src_align, dest_align; tree off0; + /* Inlining of memcpy/memmove may cause bounds lost (if we copy + pointers as wide integer) and also may result in huge function + size because of inlined bounds copy. Thus don't inline for + functions we want to instrument. */ + if (flag_check_pointer_bounds + && chkp_instrumentable_p (cfun->decl) + /* Even if data may contain pointers we can inline if copy + less than a pointer size. */ + && (!tree_fits_uhwi_p (len) + || compare_tree_int (len, POINTER_SIZE_UNITS) >= 0)) + return false; + /* Build accesses at offset zero with a ref-all character type. */ off0 = build_int_cst (build_pointer_type_for_mode (char_type_node, ptr_mode, true), 0); |