On Fri, Apr 19, 2013 at 11:39 AM, James Greenhalgh
<james.greenha...@arm.com> wrote:
> Hi,
>
>> I still think getting rid of TARGET_FOLD_BUILTIN and replacing it with
>> TARGET_FOLD_STMT that only operates on GIMPLE is the way to go.
>
> Would that look something like the attached? (The patch isn't
> polished, but hacks enough together to function).
>
> In these patches we add TARGET_FOLD_STMT and an implimentation in
> aarch64_fold_stmt. TARGET_FOLD_STMT takes a gimple_stmt_iterator
> and returns whether any change was made to the gimple stream.
>
> Then TARGET_FOLD_STMT is allowed to fold to anything which is
> valid GIMPLE, and TARGET_FOLD_BUILTIN is required to fold to
> something in the intersection of GIMPLE and GENERIC.
>
> I don't especially like passing a gimple_stmt_iterator as it means
> exposing all sorts of extra gunk to the backend. Without it, the
> interface is not as flexible. This is not neccessarily a problem, but
> giving the backend the full gimple_stmt_iterator seems to me to be
> more useful.
>
> If this was what you were asking for I can clean the patch up
> and give it proper testing. If not, I would appreciate a prod
> in the correct direction.

Yes, it looks basically ok.  I'd probably restrict it to folding target builtins
though - similar to what TARGET_FOLD_BUILTIN did.  Exactly to not
expose all stmts to the backends.  That is, move the target hook call
to gimple_fold_call, after the inplace check (and remove the inplace
argument of the target hook), and call it only for DECL_BUILT_IN_CLASS
BUILT_IN_MD.

Not sure if TARGET_FOLD_STMT is then still an appropriate name ...
TARGET_FOLD_BUILTIN is already taken unfortunately.  Maybe
TARGET_FOLD_BUILTIN_MD_CALL?

+                 fndecl = gimple_call_fndecl (stmt);
+                 if (fndecl
+                     && TREE_CODE (fndecl) == FUNCTION_DECL

redundant check

+                     && DECL_BUILT_IN (fndecl)
+                     && !gimple_call_va_arg_pack_p (stmt)
+                     && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)

the last check is enough, the previous two are not necessary.

+                     if (avoid_folding_inline_builtin (fndecl))
+                       break;

I don't think this is necessary.

And for simple cases such as...

+                         BUILTIN_VALL (UNOP, reduc_splus_, 10)
+                           new_tree = fold_build1 (REDUC_PLUS_EXPR,
+                                                   type,
+                                                   args[0]);
...
+             if (new_tree && ignore)
+               STRIP_NOPS (new_tree);
+
+             if (new_tree)
+               {
+                 gimplify_and_update_call_from_tree (gsi, new_tree);
+                 changed = true;
+               }

please build the resulting assingment yourself.  Like

   gimple new_stmt = gimple_build_assign_with_ops (REDUC_PLUS_EXPR,
gimple_call_lhs (call), args[0], NULL_TREE);
   gsi_replace (gsi, new_stmt, true);

instead of building a tree and then using gimplify_and_update_call_from_tree.

Thanks,
Richard.



Thanks,
Richard.

> Thanks,
>
> James Greenhalgh
> Graduate Engineer
> ARM
>
> ---
> gcc/
>
> 2013-04-19  James Greenhalgh  <james.greenha...@arm.com>
>
>         * coretypes.h (gimple_stmt_iterator_d): Forward declare.
>         (gimple_stmt_iterator): New typedef.
>         * doc/tm.texi.in (TARGET_FOLD_STMT): New.
>         * gimple-fold.c (fold_stmt_1): Call target hook fold_stmt.
>         * gimple.h (gimple_stmt_iterator): Rename to...
>         (gimple_stmt_iterator_d): ... This.
>         * hooks.c (hook_bool_gsiptr_bool_false): New.
>         * target.def (fold_stmt): New.
>         * doc/tm.texi: Regenerate.
>
> 2013-04-19  James Greenhalgh  <james.greenha...@arm.com>
>
>         * config/aarch64/aarch64-builtins.c
>         (aarch64_fold_builtin): Move folds to gimple-specific tree codes
>         to aarch64_fold_stmt.
>         (aarch64_fold_stmt): New.
>         * config/aarch64/aarch64-protos.h (aarch64_fold_stmt): New.
>         * config/aarch64/aarch64.c (TARGET_FOLD_STMT): Define.

Reply via email to