From 164453bba4c6ef1094ad66d96d338a4d5eeff9a1 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 29 Sep 2015 20:03:33 +0000 Subject: [PATCH] builtins.c (expand_builtin_acc_on_device): Delete. gcc/ * builtins.c (expand_builtin_acc_on_device): Delete. (expand_builtin): Don't call it. (fold_builtin_1): Fold acc_on_device. libgomp/ * oacc-init.c (acc_on_device): Force optimization level. From-SVN: r228267 --- gcc/ChangeLog | 6 +++++ gcc/builtins.c | 66 ++++++++++++++++----------------------------- libgomp/ChangeLog | 4 +++ libgomp/oacc-init.c | 6 +++-- 4 files changed, 37 insertions(+), 45 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9805eff3e00..7e34d4cfc16 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-09-29 Nathan Sidwell + + * builtins.c (expand_builtin_acc_on_device): Delete. + (expand_builtin): Don't call it. + (fold_builtin_1): Fold acc_on_device. + 2015-09-29 H.J. Lu * config/i386/i386.c (ix86_function_arg): Fix typo in comments. diff --git a/gcc/builtins.c b/gcc/builtins.c index aeec1708759..15928109247 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -5859,46 +5859,6 @@ expand_stack_save (void) } -/* Expand OpenACC acc_on_device. - - This has to happen late (that is, not in early folding; expand_builtin_*, - rather than fold_builtin_*), as we have to act differently for host and - acceleration device (ACCEL_COMPILER conditional). */ - -static rtx -expand_builtin_acc_on_device (tree exp, rtx target) -{ - if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE)) - return NULL_RTX; - - tree arg = CALL_EXPR_ARG (exp, 0); - - /* Return (arg == v1 || arg == v2) ? 1 : 0. */ - machine_mode v_mode = TYPE_MODE (TREE_TYPE (arg)); - rtx v = expand_normal (arg), v1, v2; -#ifdef ACCEL_COMPILER - v1 = GEN_INT (GOMP_DEVICE_NOT_HOST); - v2 = GEN_INT (ACCEL_COMPILER_acc_device); -#else - v1 = GEN_INT (GOMP_DEVICE_NONE); - v2 = GEN_INT (GOMP_DEVICE_HOST); -#endif - machine_mode target_mode = TYPE_MODE (integer_type_node); - if (!target || !register_operand (target, target_mode)) - target = gen_reg_rtx (target_mode); - emit_move_insn (target, const1_rtx); - rtx_code_label *done_label = gen_label_rtx (); - do_compare_rtx_and_jump (v, v1, EQ, false, v_mode, NULL_RTX, - NULL, done_label, PROB_EVEN); - do_compare_rtx_and_jump (v, v2, EQ, false, v_mode, NULL_RTX, - NULL, done_label, PROB_EVEN); - emit_move_insn (target, const0_rtx); - emit_label (done_label); - - return target; -} - - /* Expand an expression EXP that calls a built-in function, with result going to TARGET if that's convenient (and in mode MODE if that's convenient). @@ -7036,9 +6996,8 @@ expand_builtin (tree exp, rtx target, rtx subtarget, machine_mode mode, break; case BUILT_IN_ACC_ON_DEVICE: - target = expand_builtin_acc_on_device (exp, target); - if (target) - return target; + /* Do library call, if we failed to expand the builtin when + folding. */ break; default: /* just do library call, if unknown builtin */ @@ -10271,6 +10230,27 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0) 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; } diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 88a25fcb8bf..8fbd6c59dee 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,7 @@ +2015-09-29 Nathan Sidwell + + * oacc-init.c (acc_on_device): Force optimization level. + 2015-09-29 Nathan Sidwell * plugin/plugin-nvptx.c (ARRAYSIZE): Delete. diff --git a/libgomp/oacc-init.c b/libgomp/oacc-init.c index 2258a72bbe5..28b9e7a90f1 100644 --- a/libgomp/oacc-init.c +++ b/libgomp/oacc-init.c @@ -620,10 +620,12 @@ acc_set_device_num (int ord, acc_device_t d) ialias (acc_set_device_num) -int +/* Compile on_device with optimization, so that the compiler expands + this, rather than generating infinitely recursive code. */ + +int __attribute__ ((__optimize__ ("O2"))) acc_on_device (acc_device_t dev) { - /* Just rely on the compiler builtin. */ return __builtin_acc_on_device (dev); } -- 2.30.2