return true;
}
+bool
+vector_infos_manager::all_same_avl_p (const basic_block cfg_bb,
+ sbitmap bitdata) const
+{
+ if (bitmap_empty_p (bitdata))
+ return false;
+
+ const auto &block_info = vector_block_infos[cfg_bb->index];
+ if (!block_info.local_dem.demand_p (DEMAND_AVL))
+ return true;
+
+ avl_info avl = block_info.local_dem.get_avl_info ();
+ unsigned int bb_index;
+ sbitmap_iterator sbi;
+
+ EXECUTE_IF_SET_IN_BITMAP (bitdata, 0, bb_index, sbi)
+ {
+ if (vector_exprs[bb_index]->get_avl_info () != avl)
+ return false;
+ }
+ return true;
+}
+
size_t
vector_infos_manager::expr_set_num (sbitmap bitdata) const
{
m_vector_manager->vector_avin[cfg_bb->index]))
return false;
+ if (!m_vector_manager->all_same_avl_p (
+ cfg_bb, m_vector_manager->vector_avin[cfg_bb->index]))
+ return false;
+
size_t expr_id
= bitmap_first_set_bit (m_vector_manager->vector_avin[cfg_bb->index]);
if (m_vector_manager->vector_exprs[expr_id]->get_ratio () != ratio)
insn_info *insn = require->get_insn ();
vector_insn_info prev_info = vector_insn_info ();
- if (m_vector_manager->all_same_ratio_p (
- m_vector_manager->vector_avout[eg->src->index]))
+ sbitmap bitdata = m_vector_manager->vector_avout[eg->src->index];
+ if (m_vector_manager->all_same_ratio_p (bitdata)
+ && m_vector_manager->all_same_avl_p (eg->dest, bitdata))
{
- size_t first = bitmap_first_set_bit (
- m_vector_manager->vector_avout[eg->src->index]);
+ size_t first = bitmap_first_set_bit (bitdata);
prev_info = *m_vector_manager->vector_exprs[first];
}
/* Get all relaxer expression id for corresponding vector info. */
auto_vec<size_t> get_all_available_exprs (const vector_insn_info &) const;
+ /* Return true if all expression set in bitmap are same AVL. */
+ bool all_same_avl_p (const basic_block, sbitmap) const;
+
/* Return true if all expression set in bitmap are same ratio. */
bool all_same_ratio_p (sbitmap) const;