builtins.c: Don't include gomp-constants.h.
authorNathan Sidwell <nathan@codesourcery.com>
Thu, 1 Oct 2015 14:13:30 +0000 (14:13 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Thu, 1 Oct 2015 14:13:30 +0000 (14:13 +0000)
* 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.

From-SVN: r228340

gcc/ChangeLog
gcc/builtins.c
gcc/gimple-fold.c

index 70f964617b39700b1aa66a7e0246191caa083159..06c9a298153a323f625de22388e510ce6a4bd6d6 100644 (file)
@@ -1,3 +1,11 @@
+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.
+
 2015-10-01  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/x86-tune.def (X86_TUNE_USE_BT): Enable for
index 2ff1a8c82bbbc278fcc9a6ea47575fb55ee9c51e..e20c1f8ff99afcd1c8fb63fe6871416f9d2e44d9 100644 (file)
@@ -68,7 +68,6 @@ along with GCC; see the file COPYING3.  If not see
 #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));
@@ -10234,27 +10233,6 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0)
        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;
     }
index 9f5e4e99a2c7cbff9f748ea58751ccc0bfa4b03c..a6caaa490689c4c22485c1e4202999884d0c45bb 100644 (file)
@@ -62,6 +62,7 @@ along with GCC; see the file COPYING3.  If not see
 #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_iterator *gsi)
   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 (TREE_TYPE (arg0), 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 (TREE_TYPE (arg0), val_dev));
+  gimple_set_location (dev_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 (result_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_iterator *gsi)
                                           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:;
     }