From 1f2c340b7a8df661f31a1f0fdbac2bf69da7f463 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 1 Aug 2021 23:02:59 +0800 Subject: [PATCH] Try to reduce unnecessary lowering of left/right --- src/lower.c | 44 ++++++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/src/lower.c b/src/lower.c index cfc62d81..1749b583 100644 --- a/src/lower.c +++ b/src/lower.c @@ -318,9 +318,30 @@ static vcode_reg_t lower_array_data(vcode_reg_t reg) } } +static bool lower_should_use_uarray(type_t type, int dim, vcode_reg_t reg) +{ + if (reg == VCODE_INVALID_REG) + return false; + else if (type_is_unconstrained(type)) + return true; + else if (vcode_reg_kind(reg) != VCODE_TYPE_UARRAY) + return false; + else { + tree_t r = range_of(type, dim); + if (tree_subkind(r) == RANGE_EXPR) + return false; + + const tree_kind_t lkind = tree_kind(tree_left(r)); + const tree_kind_t rkind = tree_kind(tree_right(r)); + + return (lkind != T_LITERAL && lkind != T_REF) + || (rkind != T_LITERAL && rkind != T_REF); + } +} + static vcode_reg_t lower_array_left(type_t type, int dim, vcode_reg_t reg) { - if (type_is_unconstrained(type)) { + if (lower_should_use_uarray(type, dim, reg)) { assert(reg != VCODE_INVALID_REG); type_t index_type = index_type_of(type, dim); return emit_cast(lower_type(index_type), lower_bounds(index_type), @@ -332,7 +353,7 @@ static vcode_reg_t lower_array_left(type_t type, int dim, vcode_reg_t reg) static vcode_reg_t lower_array_right(type_t type, int dim, vcode_reg_t reg) { - if (type_is_unconstrained(type)) { + if (lower_should_use_uarray(type, dim, reg)) { assert(reg != VCODE_INVALID_REG); type_t index_type = index_type_of(type, dim); return emit_cast(lower_type(index_type), lower_bounds(index_type), @@ -344,7 +365,7 @@ static vcode_reg_t lower_array_right(type_t type, int dim, vcode_reg_t reg) static vcode_reg_t lower_array_dir(type_t type, int dim, vcode_reg_t reg) { - if (type_is_unconstrained(type)) { + if (lower_should_use_uarray(type, dim, reg)) { assert(reg != VCODE_INVALID_REG); assert(vcode_reg_kind(reg) == VCODE_TYPE_UARRAY); return emit_uarray_dir(reg, dim); @@ -357,7 +378,7 @@ static vcode_reg_t lower_array_dir(type_t type, int dim, vcode_reg_t reg) static vcode_reg_t lower_array_len(type_t type, int dim, vcode_reg_t reg) { - if (type_is_unconstrained(type)) { + if (lower_should_use_uarray(type, dim, reg)) { assert(reg != VCODE_INVALID_REG); return emit_uarray_len(reg, dim); } @@ -4984,21 +5005,20 @@ static void lower_signal_decl(tree_t decl) name, VAR_SIGNAL); lower_put_vcode_obj(decl, var, top_scope); - vcode_reg_t shared = VCODE_INVALID_REG; + vcode_reg_t shared, wrapped; if (vtype_kind(signal_type) == VCODE_TYPE_UARRAY) { shared = emit_link_signal(name, vtype_elem(signal_type)); - emit_store(lower_wrap(type, shared), var); - } - else { - shared = emit_link_signal(name, signal_type); - emit_store(shared, var); + wrapped = lower_wrap(type, shared); } + else + shared = wrapped = emit_link_signal(name, signal_type); + + emit_store(wrapped, var); tree_t value = tree_value(decl); vcode_reg_t init_reg = lower_expr(value, EXPR_RVALUE), len_reg; if (type_is_array(tree_type(value))) { - lower_check_array_sizes(decl, type, tree_type(value), - VCODE_INVALID_REG, init_reg); + lower_check_array_sizes(decl, type, tree_type(value), shared, init_reg); init_reg = lower_array_data(init_reg); len_reg = lower_array_total_len(type, init_reg); } -- 2.39.2