@@ -1,5 +1,8 @@
2015-08-03 Thomas Schwinge <thomas@codesourcery.com>
+ * builtins.c (expand_builtin_on_device): Don't expect to be
+ expanded on host compiler.
+
* gimplify.c (oacc_default_clause): Remove in_code formal
parameter. Adjust all users.
@@ -5880,39 +5880,45 @@ expand_stack_save (void)
}
-/* Expand OpenACC acc_on_device. This is expanded in the openacc
- transform pass, but if the user has this outside of an offloaded
- region, we'll find it here. In that case we must be host or none. */
+/* Expand OpenACC acc_on_device. This is usually expanded in the
+ oacc_transform pass, earlier on, but if used outside of an offloaded region,
+ we'll find it here. */
static rtx
expand_builtin_acc_on_device (tree exp, rtx target)
{
-#ifdef ACCEL_COMPILER
- gcc_unreachable ();
-#else
+#ifndef ACCEL_COMPILER
gcc_assert (!get_oacc_fn_attrib (current_function_decl));
+#endif
if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
return NULL_RTX;
tree arg = CALL_EXPR_ARG (exp, 0);
- rtx val = expand_normal (arg);
+
+ /* 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 (val, GEN_INT (GOMP_DEVICE_HOST), EQ,
- false, GET_MODE (val), NULL_RTX,
+ do_compare_rtx_and_jump (v, v1, EQ, false, v_mode, NULL_RTX,
NULL, done_label, PROB_EVEN);
- do_compare_rtx_and_jump (val, GEN_INT (GOMP_DEVICE_NONE), EQ,
- false, GET_MODE (val), NULL_RTX,
+ 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;
-#endif
}
/* Expand a thread-id/thread-count builtin for OpenACC. */
@@ -14510,12 +14510,9 @@ make_pass_late_lower_omp (gcc::context *ctxt)
return new pass_late_lower_omp (ctxt);
}
-/* Transform an acc_on_device call. The std requires this folded at
+/* Transform an acc_on_device call. OpenACC 2.0a requires this folded at
compile time for constant operands. We always fold it. In an
- offloaded function we're never 'none'. We cannot detect
- host_nonshm here, as that's a dynamic feature of the runtime.
- However, users shouldn't be using host_nonshm anyway, only the
- test harness. */
+ offloaded function we're never 'none'. */
static void
oacc_xform_on_device (gimple_stmt_iterator *gsi, gimple stmt)
@@ -1,6 +1,12 @@
-2015-07-17 Nathan Sidwell <nathan@codesourcery.com>
+2015-08-03 Thomas Schwinge <thomas@codesourcery.com>
- * config/nvptx/comp-acc_on_device.c: Include gomp-constants.h.
+ * config/nvptx/gomp-acc_on_device.c: Don't include
+ "gomp-constants.h".
+ (acc_on_device): Don't code directly here.
+
+2015-08-02 Nathan Sidwell <nathan@codesourcery.com>
+
+ * config/nvptx/gomp-acc_on_device.c: Include gomp-constants.h.
(acc_on_device): Code directly here.
2015-07-17 Nathan Sidwell <nathan@codesourcery.com>
@@ -1,14 +1,12 @@
-#include "gomp-constants.h"
+/* The compiler always attempts to expand acc_on_device, but if the
+ user disables the builtin, or calls it via a pointer, we have this
+ version. */
-/* For when the builtin is explicitly disabled. */
-int acc_on_device (int d)
+int
+acc_on_device (int dev)
{
- /* We can't use the builtin itself here, because that only expands
- to device-like things inside offloaded compute regions, which
- this isn't. Even though it'll be executed on the device --
- unless someone builds a host-side PTX compiler, which would be
- very strange. */
- return d == GOMP_DEVICE_NOT_HOST || d == GOMP_DEVICE_NVIDIA_PTX;
+ /* Just rely on the compiler builtin. */
+ return __builtin_acc_on_device (dev);
}
int acc_on_device_h_(int *d)
@@ -639,7 +639,7 @@ ialias (acc_set_device_num)
int
acc_on_device (int dev)
{
- /* It is safe to use the compiler builtin, as we're the host. */
+ /* Just rely on the compiler builtin. */
return __builtin_acc_on_device (dev);
}