+2015-11-05 Nathan Sidwell <nathan@codesourcery.com>
+
+ * gimple-fold.c: Include omp-low.h.
+ (fold_internal_goacc_dim): New.
+ (gimple_fold_call): Call it.
+
2015-11-05 Jakub Jelinek <jakub@redhat.com>
Ilya Verbin <ilya.verbin@intel.com>
#include "gimple-match.h"
#include "gomp-constants.h"
#include "optabs-query.h"
+#include "omp-low.h"
/* Return true when DECL can be referenced from current unit.
return false;
}
+/* Transform IFN_GOACC_DIM_SIZE and IFN_GOACC_DIM_POS internal
+ function calls to constants, where possible. */
+
+static tree
+fold_internal_goacc_dim (const gimple *call)
+{
+ int axis = get_oacc_ifn_dim_arg (call);
+ int size = get_oacc_fn_dim_size (current_function_decl, axis);
+ bool is_pos = gimple_call_internal_fn (call) == IFN_GOACC_DIM_POS;
+ tree result = NULL_TREE;
+
+ /* If the size is 1, or we only want the size and it is not dynamic,
+ we know the answer. */
+ if (size == 1 || (!is_pos && size))
+ {
+ tree type = TREE_TYPE (gimple_call_lhs (call));
+ result = build_int_cst (type, size - is_pos);
+ }
+
+ return result;
+}
+
/* Return true if ARG0 CODE ARG1 in infinite signed precision operation
doesn't fit into TYPE. The test for overflow should be regardless of
-fwrapv, and even for unsigned types. */
return true;
}
break;
+ case IFN_GOACC_DIM_SIZE:
+ case IFN_GOACC_DIM_POS:
+ result = fold_internal_goacc_dim (stmt);
+ break;
case IFN_UBSAN_CHECK_ADD:
subcode = PLUS_EXPR;
break;