Hi, Here is a patch to replace BUILT_IN_CHKP_BNDRET with assignment when optimizing strchr.
Thanks, Ilya -- 2013-11-13 Ilya Enkovich <ilya.enkov...@intel.com> * tree-ssa-strlen.c: Include tree-chkp.h. (handle_builtin_strchr): Remove retbnd call when strchr call is removed. diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index cfd7b00..711f5d7 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -40,6 +40,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple-pretty-print.h" #include "params.h" #include "expr.h" +#include "tree-chkp.h" /* A vector indexed by SSA_NAME_VERSION. 0 means unknown, positive value is an index into strinfo vector, negative value stands for @@ -961,6 +962,8 @@ handle_builtin_strchr (gimple_stmt_iterator *gsi) tree src; gimple stmt = gsi_stmt (*gsi); tree lhs = gimple_call_lhs (stmt); + gimple retbnd_stmt = NULL; + tree retbnd = NULL; if (lhs == NULL_TREE) return; @@ -1009,6 +1012,14 @@ handle_builtin_strchr (gimple_stmt_iterator *gsi) TREE_TYPE (rhs))) rhs = fold_convert_loc (loc, TREE_TYPE (lhs), rhs); } + + /* Remember passed and returned bounds if any. */ + if (gimple_call_with_bounds_p (stmt)) + { + retbnd = chkp_get_call_arg_bounds (gimple_call_arg (stmt, 0)); + retbnd_stmt = chkp_retbnd_call_by_val (lhs); + } + if (!update_call_from_tree (gsi, rhs)) gimplify_and_update_call_from_tree (gsi, rhs); stmt = gsi_stmt (*gsi); @@ -1018,6 +1029,18 @@ handle_builtin_strchr (gimple_stmt_iterator *gsi) fprintf (dump_file, "into: "); print_gimple_stmt (dump_file, stmt, 0, TDF_SLIM); } + + /* Replace retbnd call with assignment. */ + if (retbnd_stmt) + { + gimple_stmt_iterator ret_gsi = gsi_for_stmt (retbnd_stmt); + + if (!update_call_from_tree (&ret_gsi, retbnd)) + gimplify_and_update_call_from_tree (&ret_gsi, retbnd); + retbnd_stmt = gsi_stmt (ret_gsi); + update_stmt (retbnd_stmt); + } + if (si != NULL && si->endptr == NULL_TREE && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))