class pass_vsetvl : public rtl_opt_pass
{
private:
- class vector_infos_manager *m_vector_manager;
+ vector_infos_manager *m_vector_manager;
+
+ const vector_insn_info &get_vector_info (const rtx_insn *) const;
+ const vector_insn_info &get_vector_info (const insn_info *) const;
+ const vector_block_info &get_block_info (const basic_block) const;
+ const vector_block_info &get_block_info (const bb_info *) const;
+ vector_block_info &get_block_info (const basic_block);
+ vector_block_info &get_block_info (const bb_info *);
+ void update_vector_info (const insn_info *, const vector_insn_info &);
void simple_vsetvl (void) const;
void lazy_vsetvl (void);
virtual unsigned int execute (function *) final override;
}; // class pass_vsetvl
+const vector_insn_info &
+pass_vsetvl::get_vector_info (const rtx_insn *i) const
+{
+ return m_vector_manager->vector_insn_infos[INSN_UID (i)];
+}
+
+const vector_insn_info &
+pass_vsetvl::get_vector_info (const insn_info *i) const
+{
+ return m_vector_manager->vector_insn_infos[i->uid ()];
+}
+
+const vector_block_info &
+pass_vsetvl::get_block_info (const basic_block bb) const
+{
+ return m_vector_manager->vector_block_infos[bb->index];
+}
+
+const vector_block_info &
+pass_vsetvl::get_block_info (const bb_info *bb) const
+{
+ return m_vector_manager->vector_block_infos[bb->index ()];
+}
+
+vector_block_info &
+pass_vsetvl::get_block_info (const basic_block bb)
+{
+ return m_vector_manager->vector_block_infos[bb->index];
+}
+
+vector_block_info &
+pass_vsetvl::get_block_info (const bb_info *bb)
+{
+ return m_vector_manager->vector_block_infos[bb->index ()];
+}
+
+void
+pass_vsetvl::update_vector_info (const insn_info *i,
+ const vector_insn_info &new_info)
+{
+ m_vector_manager->vector_insn_infos[i->uid ()] = new_info;
+}
+
/* Simple m_vsetvl_insert vsetvl for optimize == 0. */
void
pass_vsetvl::simple_vsetvl (void) const
continue;
if (has_vtype_op (rinsn))
{
- const auto info
- = m_vector_manager->vector_insn_infos[INSN_UID (rinsn)];
+ const auto info = get_vector_info (rinsn);
emit_vsetvl_insn (VSETVL_DISCARD_RESULT, EMIT_BEFORE, info,
NULL_RTX, rinsn);
}
for (insn_info *insn : bb->reverse_real_nondebug_insns ())
{
- auto &info = m_vector_manager->vector_insn_infos[insn->uid ()];
+ auto &info = get_vector_info (insn);
if (info.uninit_p ())
/* If it is uninitialized, propagate it directly. */
- info = change;
+ update_vector_info (insn, change);
else if (info.unknown_p ())
change = info;
else
&& !reg_available_p (insn, change))
&& change.compatible_p (info))
{
- info = change.merge (info, LOCAL_MERGE);
+ update_vector_info (insn, change.merge (info, LOCAL_MERGE));
/* Fix PR109399, we should update user vsetvl instruction
if there is a change in demand fusion. */
if (vsetvl_insn_p (insn->rtl ()))
if (!has_vtype_op (insn->rtl ()))
return;
- const vector_insn_info require
- = m_vector_manager->vector_insn_infos[insn->uid ()];
+ const vector_insn_info require = get_vector_info (insn);
if (info.valid_p () && !need_vsetvl (require, info))
return;
info = require;
{
if (vector_config_insn_p (insn->rtl ()))
{
- info = m_vector_manager->vector_insn_infos[insn->uid ()];
+ info = get_vector_info (insn);
return;
}
if (static_cast<const vl_vtype_info &> (prev_info)
!= static_cast<const vl_vtype_info &> (curr_info))
{
- const auto require
- = m_vector_manager->vector_insn_infos[insn->uid ()];
+ const auto require = get_vector_info (insn);
if (!require.compatible_p (
static_cast<const vl_vtype_info &> (prev_info)))
type = insert_vsetvl (EMIT_BEFORE, insn->rtl (), require,
basic_block cfg_bb;
FOR_EACH_BB_FN (cfg_bb, cfun)
{
- auto info = m_vector_manager->vector_block_infos[cfg_bb->index].local_dem;
+ auto info = get_block_info(cfg_bb).local_dem;
insn_info *insn = info.get_insn ();
if (!info.valid_p ())
continue;
FOR_EACH_BB_FN (cfg_bb, cfun)
{
auto &info
- = m_vector_manager->vector_block_infos[cfg_bb->index].reaching_out;
+ = get_block_info(cfg_bb).reaching_out;
gcc_assert (m_vector_manager->expr_set_num (
m_vector_manager->vector_del[cfg_bb->index])
<= 1);
else
{
const auto dem
- = m_vector_manager->vector_block_infos[cfg_bb->index]
+ = get_block_info(cfg_bb)
.local_dem;
gcc_assert (dem == *m_vector_manager->vector_exprs[i]);
insn_info *insn = dem.get_insn ();
{
basic_block cfg_bb = bb->cfg_bb ();
const auto reaching_out
- = m_vector_manager->vector_block_infos[cfg_bb->index].reaching_out;
+ = get_block_info(cfg_bb).reaching_out;
if (!reaching_out.dirty_p ())
continue;
if (def->insn () != insn)
return;
- vector_insn_info new_info
- = m_vector_manager->vector_insn_infos[i->uid ()];
+ vector_insn_info new_info = get_vector_info (i);
if (!new_info.skip_avl_compatible_p (dem))
return;
for (insn_info *insn : bb->real_nondebug_insns ())
{
rtx_insn *rinsn = insn->rtl ();
- const auto &dem = m_vector_manager->vector_insn_infos[insn->uid ()];
+ const auto &dem = get_vector_info (insn);
/* Eliminate local vsetvl:
bb 0:
vsetvl a5,a6,...
{
basic_block cfg_bb = bb->cfg_bb ();
auto &curr_prob
- = m_vector_manager->vector_block_infos[cfg_bb->index].probability;
+ = get_block_info(cfg_bb).probability;
/* GCC assume entry block (bb 0) are always so
executed so set its probability as "always". */
FOR_EACH_EDGE (e, ei, cfg_bb->succs)
{
auto &new_prob
- = m_vector_manager->vector_block_infos[e->dest->index].probability;
+ = get_block_info(e->dest).probability;
if (!new_prob.initialized_p ())
new_prob = curr_prob * e->probability;
else if (new_prob == profile_probability::always ())