Hi Jakub! On Thu, 13 Nov 2014 19:09:49 +0100, Jakub Jelinek <ja...@redhat.com> 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 <tho...@codesourcery.com> + * 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