Two patches are ok with the following change * change PARAM_AVG_LOOP_NITER to PARAM_IVOPT_AVG_LOOP_NITER;
(The base version of the patch is not correct). thanks, David On Wed, Jan 22, 2014 at 9:52 PM, Wei Mi <w...@google.com> wrote: > Comments added. I create another patch to add the parameter for AVG_LOOP_ITER. > Both patches are attached. > > Thanks, > Wei. > > On Wed, Jan 22, 2014 at 4:42 PM, Xinliang David Li <davi...@google.com> wrote: >> On Wed, Jan 22, 2014 at 2:23 PM, Wei Mi <w...@google.com> wrote: >>> This patch handles the mem access builtins in ivopt. The original >>> problem described here: >>> http://gcc.gnu.org/ml/gcc-patches/2013-11/msg02648.html >>> >>> Bootstrapped and passed regression test. Performance test ok for >>> plain, fdo and lipo. Ok for google 4.8 branch? >>> >>> Thanks, >>> Wei. >>> >>> --- /usr/local/google/home/wmi/workarea/google_r205653_2/src/gcc/expr.c >>> 2013-12-21 21:16:11.006695060 -0800 >>> +++ gcc/expr.c 2013-12-09 11:16:22.698063077 -0800 >>> @@ -7537,7 +7537,21 @@ >>> tem = fold_build_pointer_plus (tem, TREE_OPERAND (exp, 1)); >>> return expand_expr (tem, target, tmode, modifier); >>> } >>> + case TARGET_MEM_REF: >>> + { >> >> Add more comments here to describe the new code. >> >>> + struct mem_address addr; >>> + int old_cse_not_expected; >>> + addr_space_t as >>> + = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))); >>> >>> + get_address_description (exp, &addr); >>> + result = addr_for_mem_ref (&addr, as, true); >>> + old_cse_not_expected = cse_not_expected; >>> + cse_not_expected = 1; >>> + result = memory_address_addr_space (tmode, result, as); >>> + cse_not_expected = old_cse_not_expected; >>> + return result; >>> + } >>> case CONST_DECL: >>> /* Expand the initializer like constants above. */ >>> result = XEXP (expand_expr_constant (DECL_INITIAL (exp), >>> @@ -9579,10 +9593,14 @@ >>> struct mem_address addr; >>> enum insn_code icode; >>> unsigned int align; >>> + int old_cse_not_expected; >>> >>> get_address_description (exp, &addr); >>> op0 = addr_for_mem_ref (&addr, as, true); >>> + old_cse_not_expected = cse_not_expected; >> >> Comments on the change. >> >>> + cse_not_expected = 1; >>> op0 = memory_address_addr_space (mode, op0, as); >>> + cse_not_expected = old_cse_not_expected; >>> temp = gen_rtx_MEM (mode, op0); >>> set_mem_attributes (temp, exp, 0); >>> set_mem_addr_space (temp, as); >>> --- /usr/local/google/home/wmi/workarea/google_r205653_2/src/gcc/target.def >>> 2013-12-21 21:16:10.926694446 -0800 >>> +++ gcc/target.def 2013-12-09 10:46:07.794472365 -0800 >>> @@ -1119,6 +1119,14 @@ >>> #undef HOOK_PREFIX >>> #define HOOK_PREFIX "TARGET_" >>> >>> +DEFHOOK >>> +(builtin_has_mem_ref_p, >>> + "This hook return whether the @var{i}th param of the >>> @var{builtin_function}\n\ >>> +is a memory reference. If @var{i} is -1, return whether the >>> @var{builtin_function}\n\ >>> +contains any memory reference type param.", >>> + bool, (int builtin_function, int i), >>> + default_builtin_has_mem_ref_p) >>> + >>> /* Allow target specific overriding of option settings after options have >>> been changed by an attribute or pragma or when it is reset at the >>> end of the code affected by an attribute or pragma. */ >>> --- /usr/local/google/home/wmi/workarea/google_r205653_2/src/gcc/gimple.c >>> 2013-12-21 21:16:11.066695519 -0800 >>> +++ gcc/gimple.c 2013-12-09 10:50:09.096289179 -0800 >>> @@ -2574,7 +2574,8 @@ >>> is_gimple_addressable (tree t) >>> { >>> return (is_gimple_id (t) || handled_component_p (t) >>> - || TREE_CODE (t) == MEM_REF); >>> + || TREE_CODE (t) == MEM_REF >>> + || TREE_CODE (t) == TARGET_MEM_REF); >>> } >>> >>> /* Return true if T is a valid gimple constant. */ >>> @@ -2625,7 +2626,8 @@ >>> op = TREE_OPERAND (op, 0); >>> } >>> >>> - if (CONSTANT_CLASS_P (op) || TREE_CODE (op) == MEM_REF) >>> + if (CONSTANT_CLASS_P (op) || TREE_CODE (op) == MEM_REF >>> + || TREE_CODE (op) == TARGET_MEM_REF) >>> return true; >>> >>> switch (TREE_CODE (op)) >>> --- /usr/local/google/home/wmi/workarea/google_r205653_2/src/gcc/targhooks.c >>> 2013-12-21 21:16:10.926694446 -0800 >>> +++ gcc/targhooks.c 2013-12-09 10:45:50.154339207 -0800 >>> @@ -543,6 +543,13 @@ >>> } >>> >>> bool >>> +default_builtin_has_mem_ref_p (int built_in_function ATTRIBUTE_UNUSED, >>> + int i ATTRIBUTE_UNUSED) >>> +{ >>> + return false; >>> +} >>> + >>> +bool >>> hook_bool_CUMULATIVE_ARGS_mode_tree_bool_false ( >>> cumulative_args_t ca ATTRIBUTE_UNUSED, >>> enum machine_mode mode ATTRIBUTE_UNUSED, >>> --- >>> /usr/local/google/home/wmi/workarea/google_r205653_2/src/gcc/tree-ssa-loop-ivopts.c >>> 2014-01-22 11:57:10.420073494 -0800 >>> +++ gcc/tree-ssa-loop-ivopts.c 2014-01-22 14:00:14.177908568 -0800 >>> @@ -96,7 +96,7 @@ >>> /* The infinite cost. */ >>> #define INFTY 10000000 >>> >>> -#define AVG_LOOP_NITER(LOOP) 5 >>> +#define AVG_LOOP_NITER(LOOP) 50 >> >> Need a parameter to control. This should also go in as an independent patch. >> >> >> David >>