+2018-07-31 Richard Sandiford <richard.sandiford@arm.com>
+
+ * tree-vectorizer.h (stmt_vec_info): Temporarily change from
+ a typedef to a wrapper class.
+ (NULL_STMT_VEC_INFO): New macro.
+ (vec_info::stmt_infos): Change to vec<stmt_vec_info>.
+ (stmt_vec_info::operator*): New function.
+ (stmt_vec_info::operator gimple *): Likewise.
+ (set_vinfo_for_stmt): Use NULL_STMT_VEC_INFO.
+ (add_stmt_costs): Likewise.
+ * tree-vect-loop-manip.c (iv_phi_p): Likewise.
+ * tree-vect-loop.c (vect_compute_single_scalar_iteration_cost)
+ (vect_get_known_peeling_cost): Likewise.
+ (vect_estimate_min_profitable_iters): Likewise.
+ * tree-vect-patterns.c (vect_init_pattern_stmt): Likewise.
+ * tree-vect-slp.c (vect_remove_slp_scalar_calls): Likewise.
+ * tree-vect-stmts.c (vect_build_gather_load_calls): Likewise.
+ (vectorizable_store, free_stmt_vec_infos): Likewise.
+ (new_stmt_vec_info): Change return type of xcalloc to
+ _stmt_vec_info *.
+
2018-07-31 Richard Sandiford <richard.sandiford@arm.com>
* tree-vectorizer.h (vec_info::lookup_single_use): Declare.
return false;
stmt_vec_info stmt_info = vinfo_for_stmt (phi);
- gcc_assert (stmt_info != NULL);
+ gcc_assert (stmt_info != NULL_STMT_VEC_INFO);
if (STMT_VINFO_DEF_TYPE (stmt_info) == vect_reduction_def
|| STMT_VINFO_DEF_TYPE (stmt_info) == vect_double_reduction_def)
return false;
j, si)
{
struct _stmt_vec_info *stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
(void) add_stmt_cost (target_cost_data, si->count,
si->kind, stmt_info, si->misalign,
vect_body);
FOR_EACH_VEC_ELT (*scalar_cost_vec, j, si)
{
stmt_vec_info stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
retval += record_stmt_cost (prologue_cost_vec,
si->count * peel_iters_prologue,
si->kind, stmt_info, si->misalign,
FOR_EACH_VEC_ELT (*scalar_cost_vec, j, si)
{
stmt_vec_info stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
retval += record_stmt_cost (epilogue_cost_vec,
si->count * *peel_iters_epilogue,
si->kind, stmt_info, si->misalign,
j, si)
{
struct _stmt_vec_info *stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
(void) add_stmt_cost (target_cost_data, si->count,
si->kind, stmt_info, si->misalign,
vect_epilogue);
FOR_EACH_VEC_ELT (LOOP_VINFO_SCALAR_ITERATION_COST (loop_vinfo), j, si)
{
struct _stmt_vec_info *stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
(void) add_stmt_cost (target_cost_data,
si->count * peel_iters_prologue,
si->kind, stmt_info, si->misalign,
FOR_EACH_VEC_ELT (prologue_cost_vec, j, si)
{
struct _stmt_vec_info *stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
(void) add_stmt_cost (data, si->count, si->kind, stmt_info,
si->misalign, vect_prologue);
}
FOR_EACH_VEC_ELT (epilogue_cost_vec, j, si)
{
struct _stmt_vec_info *stmt_info
- = si->stmt ? vinfo_for_stmt (si->stmt) : NULL;
+ = si->stmt ? vinfo_for_stmt (si->stmt) : NULL_STMT_VEC_INFO;
(void) add_stmt_cost (data, si->count, si->kind, stmt_info,
si->misalign, vect_epilogue);
}
{
vec_info *vinfo = orig_stmt_info->vinfo;
stmt_vec_info pattern_stmt_info = vinfo->lookup_stmt (pattern_stmt);
- if (pattern_stmt_info == NULL)
+ if (pattern_stmt_info == NULL_STMT_VEC_INFO)
pattern_stmt_info = orig_stmt_info->vinfo->add_stmt (pattern_stmt);
gimple_set_bb (pattern_stmt, gimple_bb (orig_stmt_info->stmt));
if (!is_gimple_call (stmt) || gimple_bb (stmt) == NULL)
continue;
stmt_info = vinfo_for_stmt (stmt);
- if (stmt_info == NULL
+ if (stmt_info == NULL_STMT_VEC_INFO
|| is_pattern_stmt_p (stmt_info)
|| !PURE_SLP_STMT (stmt_info))
continue;
new_stmt = SSA_NAME_DEF_STMT (var);
}
- if (prev_stmt_info == NULL)
+ if (prev_stmt_info == NULL_STMT_VEC_INFO)
STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
else
STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
vect_finish_stmt_generation (stmt, new_stmt, gsi);
- if (prev_stmt_info == NULL)
+ if (prev_stmt_info == NULL_STMT_VEC_INFO)
STMT_VINFO_VEC_STMT (stmt_info) = *vec_stmt = new_stmt;
else
STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
new_stmt_vec_info (gimple *stmt, vec_info *vinfo)
{
stmt_vec_info res;
- res = (stmt_vec_info) xcalloc (1, sizeof (struct _stmt_vec_info));
+ res = (_stmt_vec_info *) xcalloc (1, sizeof (struct _stmt_vec_info));
STMT_VINFO_TYPE (res) = undef_vec_info_type;
STMT_VINFO_STMT (res) = stmt;
unsigned int i;
stmt_vec_info info;
FOR_EACH_VEC_ELT (*v, i, info)
- if (info != NULL)
+ if (info != NULL_STMT_VEC_INFO)
free_stmt_vec_info (STMT_VINFO_STMT (info));
if (v == stmt_vec_info_vec)
stmt_vec_info_vec = NULL;
#ifndef GCC_TREE_VECTORIZER_H
#define GCC_TREE_VECTORIZER_H
+class stmt_vec_info {
+public:
+ stmt_vec_info () {}
+ stmt_vec_info (struct _stmt_vec_info *ptr) : m_ptr (ptr) {}
+ struct _stmt_vec_info *operator-> () const { return m_ptr; }
+ struct _stmt_vec_info &operator* () const;
+ operator struct _stmt_vec_info * () const { return m_ptr; }
+ operator gimple * () const;
+ operator void * () const { return m_ptr; }
+ operator bool () const { return m_ptr; }
+ bool operator == (const stmt_vec_info &x) { return x.m_ptr == m_ptr; }
+ bool operator == (_stmt_vec_info *x) { return x == m_ptr; }
+ bool operator != (const stmt_vec_info &x) { return x.m_ptr != m_ptr; }
+ bool operator != (_stmt_vec_info *x) { return x != m_ptr; }
+
+private:
+ struct _stmt_vec_info *m_ptr;
+};
+
+#define NULL_STMT_VEC_INFO (stmt_vec_info (NULL))
+
#include "tree-data-ref.h"
#include "tree-hash-traits.h"
#include "target.h"
-typedef struct _stmt_vec_info *stmt_vec_info;
-
/* Used for naming of new temporaries. */
enum vect_var_kind {
vect_simple_var,
vec_info_shared *shared;
/* The mapping of GIMPLE UID to stmt_vec_info. */
- vec<struct _stmt_vec_info *> stmt_vec_infos;
+ vec<stmt_vec_info> stmt_vec_infos;
/* All SLP instances. */
auto_vec<slp_instance> slp_instances;
&& TYPE_PRECISION (TYPE) == 1 \
&& TYPE_UNSIGNED (TYPE)))
+inline _stmt_vec_info &
+stmt_vec_info::operator* () const
+{
+ return *m_ptr;
+}
+
+inline stmt_vec_info::operator gimple * () const
+{
+ return m_ptr ? m_ptr->stmt : NULL;
+}
+
extern vec<stmt_vec_info> *stmt_vec_info_vec;
void set_stmt_vec_info_vec (vec<stmt_vec_info> *);
}
else
{
- gcc_checking_assert (info == NULL);
+ gcc_checking_assert (info == NULL_STMT_VEC_INFO);
(*stmt_vec_info_vec)[uid - 1] = info;
}
}
unsigned i;
FOR_EACH_VEC_ELT (*cost_vec, i, cost)
add_stmt_cost (data, cost->count, cost->kind,
- cost->stmt ? vinfo_for_stmt (cost->stmt) : NULL,
+ (cost->stmt
+ ? vinfo_for_stmt (cost->stmt)
+ : NULL_STMT_VEC_INFO),
cost->misalign, cost->where);
}