summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/segtree.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/segtree.c b/src/segtree.c
index 1970265a..5939d8fc 100644
--- a/src/segtree.c
+++ b/src/segtree.c
@@ -857,21 +857,25 @@ void interval_map_decompose(struct expr *set)
expr_free(i);
}
- /* Unclosed interval */
- if (low != NULL) {
- i = constant_expr_alloc(&low->location, low->dtype,
- low->byteorder, expr_value(low)->len,
- NULL);
- mpz_init_bitmask(i->value, i->len);
+ if (!low) /* no unclosed interval at end */
+ goto out;
+ i = constant_expr_alloc(&low->location, low->dtype,
+ low->byteorder, expr_value(low)->len, NULL);
+ mpz_init_bitmask(i->value, i->len);
+
+ if (!mpz_cmp(i->value, expr_value(low)->value)) {
+ expr_free(i);
+ i = low;
+ } else {
i = range_expr_alloc(&low->location, expr_value(low), i);
i = set_elem_expr_alloc(&low->location, i);
if (low->ops->type == EXPR_MAPPING)
i = mapping_expr_alloc(&i->location, i, low->right);
-
- compound_expr_add(set, i);
}
+ compound_expr_add(set, i);
+out:
mpz_clear(range);
mpz_clear(p);