return false;
}
+/* Remove any IPA-CP results stored in TS that are associated with removed
+ parameters as marked in IFS. */
+
+static void
+zap_useless_ipcp_results (const isra_func_summary *ifs, ipcp_transformation *ts)
+{
+ unsigned ts_len = vec_safe_length (ts->m_agg_values);
+
+ if (ts_len == 0)
+ return;
+
+ bool removed_item = false;
+ unsigned dst_index = 0;
+
+ for (unsigned i = 0; i < ts_len; i++)
+ {
+ ipa_argagg_value *v = &(*ts->m_agg_values)[i];
+ const isra_param_desc *desc = &(*ifs->m_parameters)[v->index];
+
+ if (!desc->locally_unused)
+ {
+ if (removed_item)
+ (*ts->m_agg_values)[dst_index] = *v;
+ dst_index++;
+ }
+ else
+ removed_item = true;
+ }
+ if (dst_index == 0)
+ {
+ ggc_free (ts->m_agg_values);
+ ts->m_agg_values = NULL;
+ }
+ else if (removed_item)
+ ts->m_agg_values->truncate (dst_index);
+
+ bool useful_bits = false;
+ unsigned count = vec_safe_length (ts->bits);
+ for (unsigned i = 0; i < count; i++)
+ if ((*ts->bits)[i])
+ {
+ const isra_param_desc *desc = &(*ifs->m_parameters)[i];
+ if (desc->locally_unused)
+ (*ts->bits)[i] = NULL;
+ else
+ useful_bits = true;
+ }
+ if (!useful_bits)
+ ts->bits = NULL;
+
+ bool useful_vr = false;
+ count = vec_safe_length (ts->m_vr);
+ for (unsigned i = 0; i < count; i++)
+ if ((*ts->m_vr)[i].known)
+ {
+ const isra_param_desc *desc = &(*ifs->m_parameters)[i];
+ if (desc->locally_unused)
+ (*ts->m_vr)[i].known = false;
+ else
+ useful_vr = true;
+ }
+ if (!useful_vr)
+ ts->m_vr = NULL;
+}
/* Do final processing of results of IPA propagation regarding NODE, clone it
if appropriate. */
}
ipcp_transformation *ipcp_ts = ipcp_get_transformation_summary (node);
+ if (ipcp_ts)
+ zap_useless_ipcp_results (ifs, ipcp_ts);
vec<ipa_adjusted_param, va_gc> *new_params = NULL;
if (ipa_param_adjustments *old_adjustments
= cinfo ? cinfo->param_adjustments : NULL)