Hi Jakub! On Thu, 13 Nov 2014 19:09:49 +0100, Jakub Jelinek <[email protected]> wrote: > > --- gcc/builtins.c > > +++ gcc/builtins.c
> > +static rtx
> > +expand_builtin_acc_on_device (tree exp, rtx target ATTRIBUTE_UNUSED)
> > +{
> > + if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
> > + return NULL_RTX;
> > +
> > + tree arg, v1, v2, ret;
> > + location_t loc;
> > +
> > + arg = CALL_EXPR_ARG (exp, 0);
> > + arg = builtin_save_expr (arg);
> > + loc = EXPR_LOCATION (exp);
> > +
> > + /* Build: (arg == v1 || arg == v2) ? 1 : 0. */
> > +
> > +#ifdef ACCEL_COMPILER
> > + v1 = build_int_cst (TREE_TYPE (arg), /* TODO: acc_device_not_host */ 3);
> > + v2 = build_int_cst (TREE_TYPE (arg), ACCEL_COMPILER_acc_device);
> > +#else
> > + v1 = build_int_cst (TREE_TYPE (arg), /* TODO: acc_device_none */ 0);
> > + v2 = build_int_cst (TREE_TYPE (arg), /* TODO: acc_device_host */ 2);
> > +#endif
> > +
> > + v1 = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg, v1);
> > + v2 = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg, v2);
> > +
> > + /* Can't use TRUTH_ORIF_EXPR, as that is not supported by
> > + expand_expr_real*. */
> > + ret = fold_build3_loc (loc, COND_EXPR, integer_type_node, v1, v1, v2);
> > + ret = fold_build3_loc (loc, COND_EXPR, integer_type_node,
> > + ret, integer_one_node, integer_zero_node);
> > +
> > + return expand_normal (ret);
>
> If you can't fold it late (which is indeed a problem for -O0),
> then I'd suggest to implement this more RTL-ish.
> So, avoid the builtin_save_expr, instead
> rtx op = expand_normal (arg);
> Don't build v1/v2 as trees (and, please fix the TODOs), but rtxes,
> just
> rtx v1 = GEN_INT (...);
> rtx v2 = GEN_INT (...);
> machine_mode mode = TYPE_MODE (TREE_TYPE (arg));
> rtx ret = gen_reg_rtx (TYPE_MODE (integer_type_node));
> emit_move_insn (ret, const0_rtx);
> rtx_code_label *done_label = gen_label_rtx ();
> emit_cmp_and_jump_insns (op, v1, NE, NULL_RTX, mode,
> false, done_label, PROB_EVEN);
> emit_cmp_and_jump_insns (op, v2, NE, NULL_RTX, mode,
> false, done_label, PROB_EVEN);
> emit_move_insn (ret, const1_rtx);
> emit_label (done_label);
> return ret;
> or similar.
;-) Yes, "similar", as I've now found; committed to gomp-4_0-branch in
r218869:
commit cb37a039eb7a7375d074bc092457349312c5a2e2
Author: tschwinge <tschwinge@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu Dec 18 16:07:23 2014 +0000
OpenACC acc_on_device: Fix logic error introduced in an earlier change.
... but which didn't show up in testing until after a libgomp rebuild,
because
of the "caching" of the acc_on_device builtin that is being done in
libgomp/oacc-init.c:acc_on_device.
gcc/
* builtins.c (expand_builtin_acc_on_device): Fix logic error.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gomp-4_0-branch@218869
138bc75d-0d04-0410-961f-82ee72b054a4
---
gcc/ChangeLog.gomp | 2 ++
gcc/builtins.c | 8 ++++----
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git gcc/ChangeLog.gomp gcc/ChangeLog.gomp
index a744ebf..a21fd92 100644
--- gcc/ChangeLog.gomp
+++ gcc/ChangeLog.gomp
@@ -1,5 +1,7 @@
2014-12-18 Thomas Schwinge <[email protected]>
+ * builtins.c (expand_builtin_acc_on_device): Fix logic error.
+
* config/i386/intelmic-offload.h: New file.
* config/nvptx/offload.h: Likewise.
* config.gcc <*-intelmic-*, *-intelmicemul-*, nvptx-*>: Point to
diff --git gcc/builtins.c gcc/builtins.c
index 33025a5..6891229 100644
--- gcc/builtins.c
+++ gcc/builtins.c
@@ -5909,13 +5909,13 @@ expand_builtin_acc_on_device (tree exp, rtx target)
machine_mode target_mode = TYPE_MODE (integer_type_node);
if (!REG_P (target) || GET_MODE (target) != target_mode)
target = gen_reg_rtx (target_mode);
- emit_move_insn (target, const0_rtx);
+ emit_move_insn (target, const1_rtx);
rtx_code_label *done_label = gen_label_rtx ();
- do_compare_rtx_and_jump (v, v1, NE, false, v_mode, NULL_RTX,
+ do_compare_rtx_and_jump (v, v1, EQ, false, v_mode, NULL_RTX,
NULL_RTX, done_label, PROB_EVEN);
- do_compare_rtx_and_jump (v, v2, NE, false, v_mode, NULL_RTX,
+ do_compare_rtx_and_jump (v, v2, EQ, false, v_mode, NULL_RTX,
NULL_RTX, done_label, PROB_EVEN);
- emit_move_insn (target, const1_rtx);
+ emit_move_insn (target, const0_rtx);
emit_label (done_label);
return target;
Grüße,
Thomas
pgp6P0PultR2w.pgp
Description: PGP signature
