{
unsigned n;
+ morph = isl_morph_cow(morph);
if (!morph)
return NULL;
n = isl_basic_set_dim(morph->dom, isl_dim_set);
{
unsigned n;
+ morph = isl_morph_cow(morph);
if (!morph)
return NULL;
n = isl_basic_set_dim(morph->ran, isl_dim_set);
return NULL;
}
-void isl_morph_dump(__isl_take isl_morph *morph, FILE *out)
+void isl_morph_print_internal(__isl_take isl_morph *morph, FILE *out)
{
if (!morph)
return;
isl_mat_print_internal(morph->inv, out, 4);
}
+void isl_morph_dump(__isl_take isl_morph *morph)
+{
+ isl_morph_print_internal(morph, stderr);
+}
+
__isl_give isl_morph *isl_morph_identity(__isl_keep isl_basic_set *bset)
{
isl_mat *id;
return NULL;
}
-/* Given a basic set, exploit the equalties in the a basic set to construct
+/* Given a basic set, exploit the equalties in the basic set to construct
* a morphishm that maps the basic set to a lower-dimensional space.
* Specifically, the morphism reduces the number of dimensions of type "type".
*
return morph;
}
+/* We detect all the equalities first to avoid implicit equalties
+ * being discovered during the computations. In particular,
+ * the compression on the variables could expose additional stride
+ * constraints on the parameters. This would result in existentially
+ * quantified variables after applying the resulting morph, which
+ * in turn could break invariants of the calling functions.
+ */
__isl_give isl_morph *isl_basic_set_full_compression(
__isl_keep isl_basic_set *bset)
{
isl_morph *morph, *morph2;
bset = isl_basic_set_copy(bset);
+ bset = isl_basic_set_detect_equalities(bset);
morph = isl_basic_set_variable_compression(bset, isl_dim_param);
bset = isl_morph_basic_set(isl_morph_copy(morph), bset);