diff mbox

Fold acc_on_device

Message ID 560D2803.5080304@acm.org
State New
Headers show

Commit Message

Nathan Sidwell Oct. 1, 2015, 12:33 p.m. UTC
On 10/01/15 06:03, Richard Biener wrote:
> On Wed, Sep 30, 2015 at 9:22 PM, Jakub Jelinek <jakub@redhat.com> wrote:

>> Wouldn't it be better to just emit GIMPLE here instead?
>> So
>>    tree res = make_ssa_name (boolean_type_node);
>>    gimple g = gimple_build_assign (res, EQ_EXPR, arg0,
>>                                    build_int_cst (integer_type_node, val_host));
>>    gsi_insert_before (gsi, g);
>> ...

Like this?

nathan

Comments

Richard Biener Oct. 1, 2015, 12:46 p.m. UTC | #1
On Thu, Oct 1, 2015 at 2:33 PM, Nathan Sidwell <nathan@acm.org> wrote:
> On 10/01/15 06:03, Richard Biener wrote:
>>
>> On Wed, Sep 30, 2015 at 9:22 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>
>
>>> Wouldn't it be better to just emit GIMPLE here instead?
>>> So
>>>    tree res = make_ssa_name (boolean_type_node);
>>>    gimple g = gimple_build_assign (res, EQ_EXPR, arg0,
>>>                                    build_int_cst (integer_type_node,
>>> val_host));
>>>    gsi_insert_before (gsi, g);
>>> ...
>
>
> Like this?

+  gimple *host_ass = gimple_build_assign
+    (host_eq, EQ_EXPR, arg0, build_int_cst (integer_type_node, val_host));

use TREE_TYPE (arg0) for the integer cst.

Otherwise looks good to me.

Thanks,
Richard.

> nathan
Segher Boessenkool Oct. 6, 2015, 6:12 a.m. UTC | #2
On Thu, Oct 01, 2015 at 08:33:07AM -0400, Nathan Sidwell wrote:
> 2015-10-01  Nathan Sidwell  <nathan@codesourcery.com>
> 
> 	* builtins.c: Don't include gomp-constants.h.
> 	(fold_builtin_1): Don't fold acc_on_device here.
> 	* gimple-fold.c: Include gomp-constants.h.
> 	(gimple_fold_builtin_acc_on_device): New.
> 	(gimple_fold_builtin): Call it.
> 
> Index: gcc/gimple-fold.c
> ===================================================================
> --- gcc/gimple-fold.c	(revision 228288)
> +++ gcc/gimple-fold.c	(working copy)
> @@ -2848,6 +2890,9 @@ gimple_fold_builtin (gimple_stmt_iterato
>  					   n == 3
>  					   ? gimple_call_arg (stmt, 2)
>  					   : NULL_TREE, fcode);

Missing break statement here.  This is PR67861.

> +    case BUILT_IN_ACC_ON_DEVICE:
> +      return gimple_fold_builtin_acc_on_device (gsi,
> +						gimple_call_arg (stmt, 0));
>      default:;
>      }


Segher
Nathan Sidwell Oct. 6, 2015, 2:04 p.m. UTC | #3
On 10/06/15 02:12, Segher Boessenkool wrote:
> On Thu, Oct 01, 2015 at 08:33:07AM -0400, Nathan Sidwell wrote:
>> 2015-10-01  Nathan Sidwell  <nathan@codesourcery.com>
>>
>> 	* builtins.c: Don't include gomp-constants.h.
>> 	(fold_builtin_1): Don't fold acc_on_device here.
>> 	* gimple-fold.c: Include gomp-constants.h.
>> 	(gimple_fold_builtin_acc_on_device): New.
>> 	(gimple_fold_builtin): Call it.
>>
>> Index: gcc/gimple-fold.c
>> ===================================================================
>> --- gcc/gimple-fold.c	(revision 228288)
>> +++ gcc/gimple-fold.c	(working copy)
>> @@ -2848,6 +2890,9 @@ gimple_fold_builtin (gimple_stmt_iterato
>>   					   n == 3
>>   					   ? gimple_call_arg (stmt, 2)
>>   					   : NULL_TREE, fcode);
>
> Missing break statement here.  This is PR67861.

Thanks for clue bat.  testing now.

nathan
diff mbox

Patch

2015-10-01  Nathan Sidwell  <nathan@codesourcery.com>

	* builtins.c: Don't include gomp-constants.h.
	(fold_builtin_1): Don't fold acc_on_device here.
	* gimple-fold.c: Include gomp-constants.h.
	(gimple_fold_builtin_acc_on_device): New.
	(gimple_fold_builtin): Call it.

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c	(revision 228288)
+++ gcc/gimple-fold.c	(working copy)
@@ -62,6 +62,7 @@  along with GCC; see the file COPYING3.
 #include "output.h"
 #include "tree-eh.h"
 #include "gimple-match.h"
+#include "gomp-constants.h"
 
 /* Return true when DECL can be referenced from current unit.
    FROM_DECL (if non-null) specify constructor of variable DECL was taken from.
@@ -2708,6 +2709,47 @@  gimple_fold_builtin_strlen (gimple_stmt_
   return true;
 }
 
+/* Fold a call to __builtin_acc_on_device.  */
+
+static bool
+gimple_fold_builtin_acc_on_device (gimple_stmt_iterator *gsi, tree arg0)
+{
+  /* Defer folding until we know which compiler we're in.  */
+  if (symtab->state != EXPANSION)
+    return false;
+
+  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
+
+  location_t loc = gimple_location (gsi_stmt (*gsi));
+  
+  tree host_eq = make_ssa_name (boolean_type_node);
+  gimple *host_ass = gimple_build_assign
+    (host_eq, EQ_EXPR, arg0, build_int_cst (integer_type_node, val_host));
+  gimple_set_location (host_ass, loc);
+  gsi_insert_before (gsi, host_ass, GSI_SAME_STMT);
+
+  tree dev_eq = make_ssa_name (boolean_type_node);
+  gimple *dev_ass = gimple_build_assign
+    (dev_eq, EQ_EXPR, arg0, build_int_cst (integer_type_node, val_dev));
+  gimple_set_location (host_ass, loc);
+  gsi_insert_before (gsi, dev_ass, GSI_SAME_STMT);
+
+  tree result = make_ssa_name (boolean_type_node);
+  gimple *result_ass = gimple_build_assign
+    (result, BIT_IOR_EXPR, host_eq, dev_eq);
+  gimple_set_location (host_ass, loc);
+  gsi_insert_before (gsi, result_ass, GSI_SAME_STMT);
+
+  replace_call_with_value (gsi, result);
+
+  return true;
+}
 
 /* Fold the non-target builtin at *GSI and return whether any simplification
    was made.  */
@@ -2848,6 +2890,9 @@  gimple_fold_builtin (gimple_stmt_iterato
 					   n == 3
 					   ? gimple_call_arg (stmt, 2)
 					   : NULL_TREE, fcode);
+    case BUILT_IN_ACC_ON_DEVICE:
+      return gimple_fold_builtin_acc_on_device (gsi,
+						gimple_call_arg (stmt, 0));
     default:;
     }
 
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c	(revision 228288)
+++ gcc/builtins.c	(working copy)
@@ -64,7 +64,6 @@  along with GCC; see the file COPYING3.
 #include "cgraph.h"
 #include "tree-chkp.h"
 #include "rtl-chkp.h"
-#include "gomp-constants.h"
 
 
 static tree do_mpc_arg1 (tree, tree, int (*)(mpc_ptr, mpc_srcptr, mpc_rnd_t));
@@ -10230,27 +10229,6 @@  fold_builtin_1 (location_t loc, tree fnd
 	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;
     }