Both functions perform interval set lookups with either start and end or only start values as input. Interestingly, in practice they either see values which are not contained or which match an existing range exactly. Make use of the above and just return a clone of the matching entry instead of creating a new one based on input data. Signed-off-by: Phil Sutter <phil@xxxxxx> --- src/segtree.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/segtree.c b/src/segtree.c index 002ee41a16db0..f81a66e185990 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -708,9 +708,7 @@ static struct expr *get_set_interval_find(const struct table *table, range_expr_value_high(high, i); if (mpz_cmp(left->key->value, low) >= 0 && mpz_cmp(right->key->value, high) <= 0) { - range = range_expr_alloc(&internal_location, - expr_clone(left->key), - expr_clone(right->key)); + range = expr_clone(i->key); goto out; } break; @@ -742,9 +740,7 @@ static struct expr *get_set_interval_end(const struct table *table, case EXPR_RANGE: range_expr_value_low(low, i); if (mpz_cmp(low, left->key->value) == 0) { - range = range_expr_alloc(&internal_location, - expr_clone(left->key), - expr_clone(i->key->right)); + range = expr_clone(i->key); goto out; } break; -- 2.25.1