diff --git a/ir/ir_gen.c b/ir/ir_gen.c index 6483443..a9f1a9d 100644 --- a/ir/ir_gen.c +++ b/ir/ir_gen.c @@ -255,6 +255,17 @@ static void _rava_ir_gen_expression(RavaIRGenerator_t *gen, RavaASTNode_t *expr) strcmp(index_name, gen->loop_context->loop_var_name) == 0) { use_unchecked = true; } + } else if (index_node->type == RAVA_AST_BINARY_EXPR && + (index_node->data.binary.op == RAVA_BINOP_ADD || + index_node->data.binary.op == RAVA_BINOP_SUB)) { + RavaASTNode_t *left = index_node->data.binary.left; + RavaASTNode_t *right = index_node->data.binary.right; + if (left->type == RAVA_AST_IDENTIFIER_EXPR && + right->type == RAVA_AST_LITERAL_EXPR && + gen->loop_context->loop_var_name && + strcmp(left->data.identifier.name, gen->loop_context->loop_var_name) == 0) { + use_unchecked = true; + } } } @@ -323,12 +334,24 @@ static void _rava_ir_gen_expression(RavaIRGenerator_t *gen, RavaASTNode_t *expr) bool use_unchecked = false; if (gen->loop_context && gen->loop_context->has_bounds_check) { - if (expr->data.array_access.index->type == RAVA_AST_IDENTIFIER_EXPR) { - const char *index_name = expr->data.array_access.index->data.identifier.name; + RavaASTNode_t *index_node = expr->data.array_access.index; + if (index_node->type == RAVA_AST_IDENTIFIER_EXPR) { + const char *index_name = index_node->data.identifier.name; if (gen->loop_context->loop_var_name && strcmp(index_name, gen->loop_context->loop_var_name) == 0) { use_unchecked = true; } + } else if (index_node->type == RAVA_AST_BINARY_EXPR && + (index_node->data.binary.op == RAVA_BINOP_ADD || + index_node->data.binary.op == RAVA_BINOP_SUB)) { + RavaASTNode_t *left = index_node->data.binary.left; + RavaASTNode_t *right = index_node->data.binary.right; + if (left->type == RAVA_AST_IDENTIFIER_EXPR && + right->type == RAVA_AST_LITERAL_EXPR && + gen->loop_context->loop_var_name && + strcmp(left->data.identifier.name, gen->loop_context->loop_var_name) == 0) { + use_unchecked = true; + } } }