isl_int_init(r);
for (i = 1; i < set->n; ++i) {
- if (isl_basic_set_dim_residue_class(set->p[0], pos, &m, &r) < 0)
+ if (isl_basic_set_dim_residue_class(set->p[i], pos, &m, &r) < 0)
goto error;
isl_int_gcd(*modulo, *modulo, m);
+ isl_int_sub(m, *residue, r);
+ isl_int_gcd(*modulo, *modulo, m);
if (!isl_int_is_zero(*modulo))
isl_int_fdiv_r(*residue, *residue, *modulo);
if (isl_int_is_one(*modulo))
break;
- if (!isl_int_is_zero(*modulo))
- isl_int_fdiv_r(r, r, *modulo);
- if (isl_int_ne(*residue, r)) {
- isl_int_set_si(*modulo, 1);
- isl_int_set_si(*residue, 0);
- break;
- }
}
isl_int_clear(m);
return 0;
}
+/* Check that isl_set_dim_residue_class detects that the values of j
+ * in the set below are all odd and that it does not detect any spurious
+ * strides.
+ */
+static int test_residue_class(isl_ctx *ctx)
+{
+ const char *str;
+ isl_set *set;
+ isl_int m, r;
+ int res;
+
+ str = "{ [i,j] : j = 4 i + 1 and 0 <= i <= 100; "
+ "[i,j] : j = 4 i + 3 and 500 <= i <= 600 }";
+ set = isl_set_read_from_str(ctx, str);
+ isl_int_init(m);
+ isl_int_init(r);
+ res = isl_set_dim_residue_class(set, 1, &m, &r);
+ if (res >= 0 &&
+ (isl_int_cmp_si(m, 2) != 0 || isl_int_cmp_si(r, 1) != 0))
+ isl_die(ctx, isl_error_unknown, "incorrect residue class",
+ res = -1);
+ isl_int_clear(r);
+ isl_int_clear(m);
+ isl_set_free(set);
+
+ return res;
+}
+
int test_align_parameters(isl_ctx *ctx)
{
const char *str;
} tests [] = {
{ "align parameters", &test_align_parameters },
{ "eliminate", &test_eliminate },
+ { "reisdue class", &test_residue_class },
{ "div", &test_div },
{ "slice", &test_slice },
{ "fixed power", &test_fixed_power },