diff mbox

OpenACC middle end changes

Message ID 87zjalq6r6.fsf@schwinge.name
State New
Headers show

Commit Message

Thomas Schwinge Dec. 18, 2014, 4:09 p.m. UTC
Hi Jakub!

On Thu, 13 Nov 2014 19:09:49 +0100, Jakub Jelinek <jakub@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(-)



Grüße,
 Thomas
diff mbox

Patch

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  <thomas@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;