On 09/30/15 08:46, Richard Biener wrote:
Please don't add any new GENERIC based builtin folders. Instead add to gimple-fold.c:gimple_fold_builtin
Is this patch ok? nathan
2015-09-30 Nathan Sidwell <nat...@codesourcery.com> * builtins.c: Don't include gomp-constants.h. (fold_builtin_1): Don't fold acc_on_device here. * gimple-fold.c: Include gomp-constants.h. (gimple_fold_builtin_acc_on_device): New. (gimple_fold_builtin): Call it. Index: gimple-fold.c =================================================================== --- gimple-fold.c (revision 228288) +++ gimple-fold.c (working copy) @@ -62,6 +62,7 @@ along with GCC; see the file COPYING3. #include "output.h" #include "tree-eh.h" #include "gimple-match.h" +#include "gomp-constants.h" /* Return true when DECL can be referenced from current unit. FROM_DECL (if non-null) specify constructor of variable DECL was taken from. @@ -2708,6 +2709,34 @@ gimple_fold_builtin_strlen (gimple_stmt_ return true; } +/* Fold a call to __builtin_acc_on_device. */ + +static bool +gimple_fold_builtin_acc_on_device (gimple_stmt_iterator *gsi, tree arg0) +{ + /* Defer folding until we know which compiler we're in. */ + if (symtab->state != EXPANSION) + return false; + + unsigned val_host = GOMP_DEVICE_HOST; + unsigned val_dev = GOMP_DEVICE_NONE; + +#ifdef ACCEL_COMPILER + val_host = GOMP_DEVICE_NOT_HOST; + val_dev = ACCEL_COMPILER_acc_device; +#endif + + tree host = build2 (EQ_EXPR, boolean_type_node, arg0, + build_int_cst (integer_type_node, val_host)); + tree dev = build2 (EQ_EXPR, boolean_type_node, arg0, + build_int_cst (integer_type_node, val_dev)); + + tree result = build2 (TRUTH_OR_EXPR, boolean_type_node, host, dev); + + result = fold_convert (integer_type_node, result); + gimplify_and_update_call_from_tree (gsi, result); + return true; +} /* Fold the non-target builtin at *GSI and return whether any simplification was made. */ @@ -2848,6 +2877,9 @@ gimple_fold_builtin (gimple_stmt_iterato n == 3 ? gimple_call_arg (stmt, 2) : NULL_TREE, fcode); + case BUILT_IN_ACC_ON_DEVICE: + return gimple_fold_builtin_acc_on_device (gsi, + gimple_call_arg (stmt, 0)); default:; } Index: builtins.c =================================================================== --- builtins.c (revision 228288) +++ builtins.c (working copy) @@ -64,7 +64,6 @@ along with GCC; see the file COPYING3. #include "cgraph.h" #include "tree-chkp.h" #include "rtl-chkp.h" -#include "gomp-constants.h" static tree do_mpc_arg1 (tree, tree, int (*)(mpc_ptr, mpc_srcptr, mpc_rnd_t)); @@ -10230,27 +10229,6 @@ fold_builtin_1 (location_t loc, tree fnd return build_empty_stmt (loc); break; - case BUILT_IN_ACC_ON_DEVICE: - /* Don't fold on_device until we know which compiler is active. */ - if (symtab->state == EXPANSION) - { - unsigned val_host = GOMP_DEVICE_HOST; - unsigned val_dev = GOMP_DEVICE_NONE; - -#ifdef ACCEL_COMPILER - val_host = GOMP_DEVICE_NOT_HOST; - val_dev = ACCEL_COMPILER_acc_device; -#endif - tree host = build2 (EQ_EXPR, boolean_type_node, arg0, - build_int_cst (integer_type_node, val_host)); - tree dev = build2 (EQ_EXPR, boolean_type_node, arg0, - build_int_cst (integer_type_node, val_dev)); - - tree result = build2 (TRUTH_OR_EXPR, boolean_type_node, host, dev); - return fold_convert (integer_type_node, result); - } - break; - default: break; }