diff --git a/src/compiler/compiler_internal.h b/src/compiler/compiler_internal.h index c690c65c8..2edc868ac 100644 --- a/src/compiler/compiler_internal.h +++ b/src/compiler/compiler_internal.h @@ -987,6 +987,7 @@ typedef struct { bool has_break : 1; bool no_exit : 1; + bool skip_first : 1; Decl *label; } FlowCommon; diff --git a/src/compiler/llvm_codegen_stmt.c b/src/compiler/llvm_codegen_stmt.c index 728a34d85..75bd8fc9e 100644 --- a/src/compiler/llvm_codegen_stmt.c +++ b/src/compiler/llvm_codegen_stmt.c @@ -10,7 +10,14 @@ static bool ast_is_not_empty(Ast *ast) { if (!ast) return false; if (ast->ast_kind != AST_COMPOUND_STMT) return true; - if (vec_size(ast->compound_stmt.stmts)) return true; + uint32_t stmts = vec_size(ast->compound_stmt.stmts); + if (stmts > 0) + { + if (stmts > 1) return true; + if (ast->compound_stmt.defer_list.start != ast->compound_stmt.defer_list.end) return true; + Ast *first = ast->compound_stmt.stmts[0]; + return ast_is_not_empty(first); + } return ast->compound_stmt.defer_list.start != ast->compound_stmt.defer_list.end; } @@ -353,234 +360,220 @@ void llvm_emit_if(GenContext *c, Ast *ast) } } +typedef enum +{ + LOOP_NORMAL, + LOOP_INFINITE, + LOOP_NONE +} LoopType; -void gencontext_emit_for_stmt(GenContext *c, Ast *ast) +static inline LoopType loop_type_for_cond(Expr *cond, bool skip_first) +{ + if (!cond) + { + // We may have do-while (0) + if (skip_first) return LOOP_NONE; + + // OR we have for (int x;;x++) + return LOOP_INFINITE; + } + + // Fold simple conds + if (cond->expr_kind == EXPR_COND && vec_size(cond->cond_expr) == 1) + { + cond = cond->cond_expr[0]; + } + + // Do we have a constant cond? + if (cond->expr_kind == EXPR_CONST) + { + assert(cond->const_expr.const_kind == CONST_BOOL); + // The result is either infinite or no loop + return cond->const_expr.b ? LOOP_INFINITE : LOOP_NONE; + } + + // Otherwise we have a normal loop. + return LOOP_NORMAL; +} + +void llvm_emit_for_stmt(GenContext *c, Ast *ast) { // First, emit all inits. + BEValue value; + if (ast->for_stmt.init) llvm_emit_expr(c, &value, ast->for_stmt.init); - if (ast->for_stmt.init) llvm_emit_decl_expr_list_ignore_result(c, ast->for_stmt.init); + bool no_exit = ast->for_stmt.flow.no_exit; + Expr *incr = ast->for_stmt.incr; - // We have 3 optional parts, which makes this code bit complicated. - LLVMBasicBlockRef exit_block = llvm_basic_block_new(c, "for.exit"); - LLVMBasicBlockRef inc_block = ast->for_stmt.incr ? llvm_basic_block_new(c, "for.inc") : NULL; - LLVMBasicBlockRef body_block = ast_is_not_empty(ast->for_stmt.body) ? llvm_basic_block_new(c, "for.body") : NULL; - LLVMBasicBlockRef cond_block = ast->for_stmt.cond ? llvm_basic_block_new(c, "for.cond") : NULL; + LLVMBasicBlockRef inc_block = incr ? llvm_basic_block_new(c, "loop.inc") : NULL; + LLVMBasicBlockRef body_block = ast_is_not_empty(ast->for_stmt.body) ? llvm_basic_block_new(c, "loop.body") : NULL; + LLVMBasicBlockRef cond_block = NULL; + + // Skipping first cond? This is do-while semantics + bool skip_first = ast->for_stmt.flow.skip_first; + + Expr *cond = ast->for_stmt.cond; + LoopType loop = loop_type_for_cond(cond, skip_first); + + // This is the starting block to loop back to, and may either be cond, body or inc + LLVMBasicBlockRef loop_start_block = body_block ? body_block : inc_block; + + // We only emit a cond block if we have a normal loop. + if (loop == LOOP_NORMAL) + { + cond_block = llvm_basic_block_new(c, "loop.cond"); + loop_start_block = cond_block; + } + + // In the case that *none* of the blocks exist. + if (!inc_block && !body_block && !cond_block) + { + if (loop == LOOP_INFINITE) + { + SourceLocation *loc = TOKLOC(ast->span.loc); + llvm_emit_debug_output(c, "Infinite loop found", loc->file->name, c->cur_func_decl->external_name, loc->line); + LLVMBuildUnreachable(c->builder); + LLVMBasicBlockRef block = llvm_basic_block_new(c, "unreachable_block"); + c->current_block = NULL; + c->current_block_is_target = false; + llvm_emit_block(c, block); + return; + } + return; + } + + assert(loop_start_block != NULL); + + LLVMBasicBlockRef exit_block = llvm_basic_block_new(c, "loop.exit"); // Break is simple it always jumps out. // For continue: // 1. If there is inc, jump to the condition - // 2. If there is no condition, jump to the body. - LLVMBasicBlockRef continue_block = inc_block ? inc_block : (cond_block ? cond_block : body_block); + // 2. If this is not looping, jump to the exit, otherwise go to cond/body depending on what the start is. + LLVMBasicBlockRef continue_block = inc_block; + if (!continue_block) + { + continue_block = loop == LOOP_NONE ? exit_block : loop_start_block; + } ast->for_stmt.continue_block = continue_block; ast->for_stmt.exit_block = exit_block; - LLVMBasicBlockRef loopback_block = cond_block; - if (cond_block) + // We have a normal loop, so we emit a cond. + if (loop == LOOP_NORMAL) { - // Emit cond - llvm_emit_br(c, cond_block); - llvm_emit_block(c, cond_block); - - BEValue be_value; - llvm_emit_expr(c, &be_value, ast->for_stmt.cond); - llvm_value_rvalue(c, &be_value); - - assert(llvm_value_is_bool(&be_value)); - - // If we have a body, conditionally jump to it. - if (body_block) + // Emit a jump for do-while semantics, to skip the initial cond. + if (skip_first) { - llvm_emit_cond_br(c, &be_value, body_block, exit_block); + LLVMBasicBlockRef do_while_start = body_block ? body_block : inc_block; + // Only jump if we have a body / inc + // if the case is do {} while (...) then we basically can treat this as while (...) {} + llvm_emit_br(c, do_while_start ? do_while_start : cond_block); } else { - // Otherwise jump to inc or cond depending on what's available. - llvm_emit_cond_br(c, &be_value, inc_block ? inc_block : cond_block, exit_block); + llvm_emit_br(c, cond_block); } + + // Emit the block + llvm_emit_block(c, cond_block); + BEValue be_value; + if (cond->expr_kind == EXPR_COND) + { + llvm_emit_decl_expr_list(c, &be_value, ast->for_stmt.cond, true); + } + else + { + llvm_emit_expr(c, &be_value, cond); + } + llvm_value_rvalue(c, &be_value); + assert(llvm_value_is_bool(&be_value)); + + // If we have a body, conditionally jump to it. + LLVMBasicBlockRef cond_success = body_block ? body_block : inc_block; + // If there is a while (...) { } we need to set the success to this block + if (!cond_success) cond_success = cond_block; + // Otherwise jump to inc or cond depending on what's available. + llvm_emit_cond_br(c, &be_value, cond_success, exit_block); } + // The optional cond is emitted, so emit the body if (body_block) { - if (!cond_block) + // If we have LOOP_NONE, then we don't need a new block here + // since we will just exit. That leaves the infinite loop. + switch (loop) { - // We don't have a cond, so we need to unconditionally jump here. - loopback_block = body_block; - llvm_emit_br(c, body_block); + case LOOP_NORMAL: + // If we have LOOP_NORMAL, we already emitted a br to the body. + // so emit the block + llvm_emit_block(c, body_block); + break; + case LOOP_INFINITE: + // In this case we have no cond, so we need to emit the br and + // then the block + llvm_emit_br(c, body_block); + llvm_emit_block(c, body_block); + case LOOP_NONE: + // If there is no loop, then we will just fall through and the + // block is needed. + body_block = NULL; + break; } - llvm_emit_block(c, body_block); + // Now emit the body llvm_emit_stmt(c, ast->for_stmt.body); - // IMPROVE handle continue/break. - if (inc_block) + + // Did we have a jump to inc yet? + if (inc_block && !llvm_basic_block_is_unused(inc_block)) { + // If so we emit the jump to the inc block. llvm_emit_br(c, inc_block); } + else + { + inc_block = NULL; + } } - if (inc_block) + if (incr) { - if (!body_block && !cond_block) + // We might have neither body nor cond + // In that case we do a jump from the init. + if (loop_start_block == inc_block) { - // We have neither cond nor body, so jump here - loopback_block = inc_block; llvm_emit_br(c, inc_block); } - // Emit the block - llvm_emit_block(c, inc_block); + if (inc_block) + { + // Emit the block if it exists. + // The inc block might also be the end of the body block. + llvm_emit_block(c, inc_block); + } BEValue dummy; llvm_emit_expr(c, &dummy, ast->for_stmt.incr); } - if (!loopback_block) - { - loopback_block = llvm_basic_block_new(c, "infiniteloop"); - llvm_emit_br(c, loopback_block); - llvm_emit_block(c, loopback_block); - } // Loop back. - llvm_emit_br(c, loopback_block); - - // And insert exit block - llvm_emit_block(c, exit_block); -} - - -void gencontext_emit_while_stmt(GenContext *context, Ast *ast) -{ - // First, emit all inits. - LLVMBasicBlockRef exit_block = llvm_basic_block_new(context, "while.exit"); - LLVMBasicBlockRef begin_block = llvm_basic_block_new(context, "while.begin"); - LLVMBasicBlockRef body_block = ast->while_stmt.body->compound_stmt.stmts ? llvm_basic_block_new(context, "while.body") : NULL; - - ast->while_stmt.continue_block = begin_block; - ast->while_stmt.break_block = exit_block; - - Expr *cond = ast->while_stmt.cond; - - bool is_infinite_loop = false; - - // Is this while (false) or while (true) - if (cond->expr_kind == EXPR_COND && vec_size(cond->cond_expr) == 1) + if (loop != LOOP_NONE) { - Expr *expr = cond->cond_expr[0]; - if (expr->expr_kind == EXPR_CONST && expr->const_expr.const_kind == CONST_BOOL) - { - is_infinite_loop = expr->const_expr.b; - // This is a NOP - if (!is_infinite_loop) return; - assert(body_block); - } - } - - DeferList defers = { 0, 0 }; - - // Emit cond - llvm_emit_br(context, begin_block); - - if (is_infinite_loop) - { - body_block = begin_block; - goto EMIT_BODY; - } - - llvm_emit_block(context, begin_block); - - if (cond->expr_kind == EXPR_SCOPED_EXPR) - { - defers = cond->expr_scope.defers; - cond = cond->expr_scope.expr; - } - BEValue be_value; - llvm_emit_decl_expr_list(context, &be_value, cond, true); - llvm_value_rvalue(context, &be_value); - - // If we have a body, conditionally jump to it. - if (body_block) - { - llvm_emit_cond_br(context, &be_value, body_block, exit_block); + llvm_emit_br(c, loop_start_block); } else { - // Emit defers - llvm_emit_defer(context, defers.start, defers.end); - - // Otherwise jump to inc or cond depending on what's available. - llvm_emit_cond_br(context, &be_value, begin_block, exit_block); - } - -EMIT_BODY: - if (body_block) - { - llvm_emit_block(context, body_block); - llvm_emit_stmt(context, ast->while_stmt.body); - - // Emit defers - llvm_emit_defer(context, defers.start, defers.end); - } - - // Loop back. - llvm_emit_br(context, begin_block); - - // And insert exit block - llvm_emit_block(context, exit_block); - - // Emit defers - llvm_emit_defer(context, defers.start, defers.end); -} - -void gencontext_emit_do_stmt(GenContext *c, Ast *ast) -{ - LLVMBasicBlockRef exit_block = llvm_basic_block_new(c, "do.exit"); - LLVMBasicBlockRef cond_block = ast->do_stmt.expr ? llvm_basic_block_new(c, "do.cond") : NULL; - LLVMBasicBlockRef body_block = llvm_basic_block_new(c, "do.body"); - - // Break is simple it always jumps out. - // For continue: if there is no condition, exit. - LLVMBasicBlockRef cont_block = cond_block ? cond_block : exit_block; - - Expr *do_expr = ast->do_stmt.expr; - Ast *do_body = ast->do_stmt.body; - - // Overwrite: - ast->do_stmt.break_block = exit_block; - ast->do_stmt.continue_block = cont_block; - - // Emit the body - llvm_emit_br(c, body_block); - llvm_emit_block(c, body_block); - llvm_emit_stmt(c, do_body); - - if (cond_block) - { - llvm_emit_br(c, cond_block); - llvm_emit_block(c, cond_block); - BEValue be_value = { 0 }; - llvm_emit_expr(c, &be_value, do_expr); - llvm_value_rvalue(c, &be_value); - if (llvm_value_is_const(&be_value)) - { - unsigned long v = LLVMConstIntGetZExtValue(be_value.value); - llvm_emit_br(c, v ? body_block : exit_block); - } - else - { - llvm_emit_cond_br(c, &be_value, body_block, exit_block); - } - } - else - { - // Branch to the exit + // If the exit block is unused, just skip it. + if (llvm_basic_block_is_unused(exit_block)) return; llvm_emit_br(c, exit_block); } - // Emit the exit block. + // And insert exit block llvm_emit_block(c, exit_block); - } + + static void llvm_emit_switch_body_if_chain(GenContext *c, Ast **cases, Ast *default_case, @@ -762,9 +755,6 @@ void gencontext_emit_break(GenContext *context, Ast *ast) case AST_IF_STMT: jump = jump_target->if_stmt.break_block; break; - case AST_WHILE_STMT: - jump = jump_target->while_stmt.break_block; - break; case AST_FOREACH_STMT: jump = jump_target->foreach_stmt.exit_block; break; @@ -772,8 +762,8 @@ void gencontext_emit_break(GenContext *context, Ast *ast) jump = jump_target->for_stmt.exit_block; break; case AST_DO_STMT: - jump = jump_target->do_stmt.break_block; - break; + case AST_WHILE_STMT: + UNREACHABLE case AST_IF_CATCH_SWITCH_STMT: case AST_SWITCH_STMT: jump = jump_target->switch_stmt.codegen.exit_block; @@ -796,13 +786,9 @@ void gencontext_emit_continue(GenContext *context, Ast *ast) { case AST_IF_STMT: case AST_SWITCH_STMT: - UNREACHABLE case AST_WHILE_STMT: - jump = jump_target->while_stmt.continue_block; - break; case AST_DO_STMT: - jump = jump_target->do_stmt.continue_block; - break; + UNREACHABLE case AST_FOREACH_STMT: jump = jump_target->foreach_stmt.continue_block; break; @@ -1161,6 +1147,8 @@ void llvm_emit_stmt(GenContext *c, Ast *ast) case AST_IF_CATCH_SWITCH_STMT: case AST_SCOPING_STMT: case AST_FOREACH_STMT: + case AST_WHILE_STMT: + case AST_DO_STMT: UNREACHABLE case AST_SCOPED_STMT: gencontext_emit_scoped_stmt(c, ast); @@ -1190,13 +1178,7 @@ void llvm_emit_stmt(GenContext *c, Ast *ast) gencontext_emit_ct_compound_stmt(c, ast); break; case AST_FOR_STMT: - gencontext_emit_for_stmt(c, ast); - break; - case AST_WHILE_STMT: - gencontext_emit_while_stmt(c, ast); - break; - case AST_DO_STMT: - gencontext_emit_do_stmt(c, ast); + llvm_emit_for_stmt(c, ast); break; case AST_NEXT_STMT: gencontext_emit_next_stmt(c, ast); diff --git a/src/compiler/parse_expr.c b/src/compiler/parse_expr.c index d104a1bd0..456461072 100644 --- a/src/compiler/parse_expr.c +++ b/src/compiler/parse_expr.c @@ -188,6 +188,7 @@ Expr *parse_assert_expr(Context *context) } return parse_expr(context); } + /** * cond_list ::= ((expr | decl-expr) COMMA)* (expr | decl-expr | try_unwrap_chain | catch_unwrap ) * @@ -369,13 +370,27 @@ static Expr *parse_macro_expansion(Context *context, Expr *left) * ; * @return Ast * */ -Expr *parse_expression_list(Context *context) +Expr *parse_expression_list(Context *context, bool allow_decl) { Expr *expr_list = EXPR_NEW_TOKEN(EXPR_EXPRESSION_LIST, context->tok); while (1) { - Expr *expr = NULL; - ASSIGN_EXPR_ELSE(expr, parse_expr_or_initializer_list(context), poisoned_expr); + Expr *expr; + if (parse_next_is_decl(context)) + { + ASSIGN_DECL_ELSE(Decl *decl, parse_decl(context), poisoned_expr); + if (!allow_decl) + { + SEMA_TOKEN_ERROR(context->tok, "This looks like a declaration, which isn't allowed here."); + return poisoned_expr; + } + expr = expr_new(EXPR_DECL, decl->span); + expr->decl_expr = decl; + } + else + { + ASSIGN_EXPR_ELSE(expr, parse_expr(context), poisoned_expr); + } vec_add(expr_list->expression_list, expr); if (!try_consume(context, TOKEN_COMMA)) break; } diff --git a/src/compiler/parse_stmt.c b/src/compiler/parse_stmt.c index a30873af6..0fd6de8dc 100644 --- a/src/compiler/parse_stmt.c +++ b/src/compiler/parse_stmt.c @@ -315,7 +315,7 @@ static inline Ast* parse_for_stmt(Context *context) if (!TOKEN_IS(TOKEN_EOS)) { - ASSIGN_EXPR_ELSE(ast->for_stmt.init, parse_cond(context), poisoned_ast); + ASSIGN_EXPR_ELSE(ast->for_stmt.init, parse_expression_list(context, true), poisoned_ast); } else { @@ -326,14 +326,14 @@ static inline Ast* parse_for_stmt(Context *context) if (!TOKEN_IS(TOKEN_EOS)) { - ASSIGN_EXPR_ELSE(ast->for_stmt.cond, parse_expr(context), poisoned_ast); + ASSIGN_EXPR_ELSE(ast->for_stmt.cond, parse_cond(context), poisoned_ast); } CONSUME_OR(TOKEN_EOS, poisoned_ast); if (!TOKEN_IS(TOKEN_RPAREN)) { - ast->for_stmt.incr = parse_expression_list(context); + ast->for_stmt.incr = parse_expression_list(context, false); } CONSUME_OR(TOKEN_RPAREN, poisoned_ast); @@ -987,7 +987,7 @@ Ast *parse_scoping_stmt(Context *context) Ast *ast = AST_NEW_TOKEN(AST_SCOPING_STMT, context->tok); advance_and_verify(context, TOKEN_SCOPING); CONSUME_OR(TOKEN_LPAREN, poisoned_ast); - ASSIGN_EXPR_ELSE(ast->scoping_stmt.scoped, parse_expression_list(context), poisoned_ast); + ASSIGN_EXPR_ELSE(ast->scoping_stmt.scoped, parse_expression_list(context, false), poisoned_ast); CONSUME_OR(TOKEN_RPAREN, poisoned_ast); ASSIGN_AST_ELSE(ast->scoping_stmt.stmt, parse_compound_stmt(context), poisoned_ast); return ast; diff --git a/src/compiler/parser_internal.h b/src/compiler/parser_internal.h index d9039f384..f18543a1a 100644 --- a/src/compiler/parser_internal.h +++ b/src/compiler/parser_internal.h @@ -47,7 +47,7 @@ bool parse_attributes(Context *context, Attr ***attributes_ref); bool parse_switch_body(Context *context, Ast ***cases, TokenType case_type, TokenType default_type, bool allow_multiple_values); -Expr *parse_expression_list(Context *context); +Expr *parse_expression_list(Context *context, bool allow_decls); Decl *parse_decl_after_type(Context *context, TypeInfo *type); bool parse_parameters(Context *context, Visibility visibility, Decl ***params_ref); diff --git a/src/compiler/sema_stmts.c b/src/compiler/sema_stmts.c index 8f4581a53..162805807 100644 --- a/src/compiler/sema_stmts.c +++ b/src/compiler/sema_stmts.c @@ -529,7 +529,12 @@ static inline bool sema_analyse_cond(Context *context, Expr *expr, bool cast_to_ // 3a. Check for failables in case of an expression. if (IS_FAILABLE(last)) { - sema_failed_cast(last, last->type, cast_to_bool ? type_bool : type_no_fail(last->type)); + if (!cast_to_bool || cast_may_implicit(type_no_fail(last->type), type_bool, false, false)) + { + SEMA_ERROR(last, "The expression may not be a failable, but was %s.", type_quoted_error_string(last->type)); + return false; + } + sema_failed_cast(last, type_no_fail(last->type), type_bool); return false; } // 3b. Cast to bool if that is needed @@ -590,7 +595,14 @@ static inline bool sema_analyse_while_stmt(Context *context, Ast *statement) // 10. Pop the while scope. SCOPE_END; - + statement->ast_kind = AST_FOR_STMT; + AstForStmt for_stmt = { + .cond = cond, + .flow = statement->while_stmt.flow, + .incr = NULL, + .body = statement->while_stmt.body, + }; + statement->for_stmt = for_stmt; return success; } @@ -628,7 +640,10 @@ static inline bool sema_analyse_do_stmt(Context *context, Ast *statement) if (!success) return false; // 8. Handle the do { } expression - if (!statement->do_stmt.expr) return true; + if (!statement->do_stmt.expr) + { + goto END; + } // 9. We next handle the while test. This is its own scope. SCOPE_START @@ -652,6 +667,18 @@ static inline bool sema_analyse_do_stmt(Context *context, Ast *statement) // Unless there is a break, this won't ever exit. context->active_scope.jump_end = !statement->do_stmt.flow.has_break; } + +END:; + FlowCommon flow = statement->do_stmt.flow; + flow.skip_first = true; + statement->ast_kind = AST_FOR_STMT; + AstForStmt for_stmt = { + .cond = expr, + .flow = flow, + .incr = NULL, + .body = body, + }; + statement->for_stmt = for_stmt; return true; } @@ -796,7 +823,7 @@ static inline bool sema_analyse_for_stmt(Context *context, Ast *statement) is_infinite = statement->for_stmt.cond == NULL; if (statement->for_stmt.init) { - success = sema_analyse_cond_list(context, statement->for_stmt.init, false); + success = sema_analyse_expr(context, statement->for_stmt.init); } if (success && statement->for_stmt.cond) @@ -804,7 +831,14 @@ static inline bool sema_analyse_for_stmt(Context *context, Ast *statement) // Conditional scope start SCOPE_START Expr *cond = statement->for_stmt.cond; - success = sema_analyse_cond_expr(context, cond); + if (cond->expr_kind == EXPR_COND) + { + success = sema_analyse_cond(context, cond, true, true); + } + else + { + success = sema_analyse_cond_expr(context, cond); + } statement->for_stmt.cond = context_pop_defers_and_wrap_expr(context, cond); // If this is const true, then set this to infinite and remove the expression. if (statement->for_stmt.cond->expr_kind == EXPR_CONST && statement->for_stmt.cond->const_expr.b) @@ -1254,8 +1288,8 @@ static inline bool sema_analyse_foreach_stmt(Context *context, Ast *statement) // Add all declarations to the init - Expr *init_expr = expr_new(EXPR_COND, value->span); - init_expr->cond_expr = expressions; + Expr *init_expr = expr_new(EXPR_EXPRESSION_LIST, value->span); + init_expr->expression_list = expressions; // Create __idx$ < __len$ Expr *binary = expr_new(EXPR_BINARY, idx_decl->span); diff --git a/test/test_suite/errors/illegal_use_of_failable.c3 b/test/test_suite/errors/illegal_use_of_failable.c3 index 0c6bb1cb2..b5604fb0a 100644 --- a/test/test_suite/errors/illegal_use_of_failable.c3 +++ b/test/test_suite/errors/illegal_use_of_failable.c3 @@ -1,12 +1,12 @@ fn void syntaxErrors() { int! i = 0; - while (i + 1) {} // #error: 'int!' to 'bool' - if (i + 1) {} // #error: 'int!' to 'bool' + while (i + 1) {} // #error: The expression may not be a failable, but was 'int!' + if (i + 1) {} // #error: The expression may not be a failable, but was 'int!' for (int x = i;;) {} // #error: 'int!' to 'int' - for (int x = 0; x < i + 1;) {} // #error: A failable 'bool!' cannot be implicitly converted to a regular boolean + for (int x = 0; x < i + 1;) {} // #error: The expression may not be a failable, but was 'bool!' for (int x = 0; x < 10; x += i + 1) {} // #error: Cannot assign a failable value to a non-failable - switch (i + 1) // #error: 'int!' to 'int' + switch (i + 1) // #error: The expression may not be a failable, but was 'int!' { default: i + 1; diff --git a/test/test_suite/from_docs/examples_forswitch.c3t b/test/test_suite/from_docs/examples_forswitch.c3t index 7aa6ccf21..c867d95c0 100644 --- a/test/test_suite/from_docs/examples_forswitch.c3t +++ b/test/test_suite/from_docs/examples_forswitch.c3t @@ -87,35 +87,31 @@ fn void demo_enum(Height h) io::println("C"); } } -// #expect: examples.ll +/* #expect: examples.ll + define void @examples.example_for() #0 { entry: %i = alloca i32, align 4 store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %0 = load i32, i32* %i, align 4 %lt = icmp slt i32 %0, 10 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %1 = load i32, i32* %i, align 4 %2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) - br label %for.inc - -for.inc: ; preds = %for.body %3 = load i32, i32* %i, align 4 %add = add i32 %3, 1 store i32 %add, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond - br label %infiniteloop - -infiniteloop: ; preds = %infiniteloop, %for.exit - br label %infiniteloop +loop.exit: ; preds = %loop.cond + call void @__assert_rtn(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @0, i64 0, i64 0), i8* getelementptr inbounds ([22 x i8], [22 x i8]* @1, i64 0, i64 0), i32 14, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @2, i64 0, i64 0)) + unreachable } ; Function Attrs: nounwind diff --git a/test/test_suite/functions/test_regression.c3t b/test/test_suite/functions/test_regression.c3t index 9359a2f88..90585871c 100644 --- a/test/test_suite/functions/test_regression.c3t +++ b/test/test_suite/functions/test_regression.c3t @@ -406,9 +406,9 @@ entry: store i64 %1, i64* %3, align 8 store i32 0, i32* %sum, align 4 store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %4 = load i32, i32* %i, align 4 %sisiext = sext i32 %4 to i64 %5 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 @@ -416,9 +416,9 @@ for.cond: ; preds = %for.inc, %entry %lt = icmp slt i64 %sisiext, %6 %check = icmp slt i64 %6, 0 %siui-lt = or i1 %check, %lt - br i1 %siui-lt, label %for.body, label %for.exit + br i1 %siui-lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %7 = load i32, i32* %sum, align 4 %8 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 %9 = load i32*, i32** %8, align 8 @@ -428,15 +428,12 @@ for.body: ; preds = %for.cond %11 = load i32, i32* %ptroffset, align 4 %add = add i32 %7, %11 store i32 %add, i32* %sum, align 4 - br label %for.inc - -for.inc: ; preds = %for.body %12 = load i32, i32* %i, align 4 %add2 = add i32 %12, 1 store i32 %add2, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond %13 = load i32, i32* %sum, align 4 ret i32 %13 } @@ -460,13 +457,13 @@ entry: %vararg = alloca %"int[]", align 8 %z = alloca %"int[]", align 8 %de = alloca [3 x i32], align 4 - %vararg11 = alloca %"int[]", align 8 - %vararg14 = alloca %"int[]", align 8 - %vararg17 = alloca %"int[]", align 8 + %vararg10 = alloca %"int[]", align 8 + %vararg13 = alloca %"int[]", align 8 + %vararg16 = alloca %"int[]", align 8 %varargslots = alloca [4 x i32], align 16 - %vararg20 = alloca %"int[]", align 8 - %varargslots21 = alloca [1 x i32], align 4 - %vararg24 = alloca %"int[]", align 8 + %vararg19 = alloca %"int[]", align 8 + %varargslots20 = alloca [1 x i32], align 4 + %vararg23 = alloca %"int[]", align 8 %a1 = alloca i32 (double, %Bobo*)*, align 8 %b2 = alloca i32 (double, %Bobo*)*, align 8 %0 = call i32 @test.test_static() @@ -479,30 +476,27 @@ entry: call void @"std::array::linkedlist.int.LinkedList__push"(%LinkedList* %list, i32 15) call void @"std::array::linkedlist.int.LinkedList__push"(%LinkedList* %list, i32 30) store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %4 = load i32, i32* %i, align 4 %5 = call i64 @"std::array::linkedlist.int.LinkedList__len"(%LinkedList* %list) #3 %uisitrunc = trunc i64 %5 to i32 %lt = icmp slt i32 %4, %uisitrunc - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %6 = load i32, i32* %i, align 4 %7 = load i32, i32* %i, align 4 %siuiext = zext i32 %7 to i64 %8 = call i32 @"std::array::linkedlist.int.LinkedList__get"(%LinkedList* %list, i64 %siuiext) %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %6, i32 %8) - br label %for.inc - -for.inc: ; preds = %for.body %10 = load i32, i32* %i, align 4 %add = add i32 %10, 1 store i32 %add, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond call void @"std::array::linkedlist.int.LinkedList__free"(%LinkedList* %list) %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.3, i32 0, i32 0), i32 -5, i32 14, i32 3) store i32 14, i32* %max, align 4 @@ -517,30 +511,27 @@ for.exit: ; preds = %for.cond call void @"std::array::list.int.List__push"(%List* %array, i32 600) #3 call void @"std::array::list.int.List__insertAt"(%List* %array, i64 2, i32 300) store i32 0, i32* %i1, align 4 - br label %for.cond2 + br label %loop.cond2 -for.cond2: ; preds = %for.inc7, %for.exit +loop.cond2: ; preds = %loop.body5, %loop.exit %14 = load i32, i32* %i1, align 4 %15 = call i64 @"std::array::list.int.List__len"(%List* %array) %uisitrunc3 = trunc i64 %15 to i32 %lt4 = icmp slt i32 %14, %uisitrunc3 - br i1 %lt4, label %for.body5, label %for.exit9 + br i1 %lt4, label %loop.body5, label %loop.exit8 -for.body5: ; preds = %for.cond2 +loop.body5: ; preds = %loop.cond2 %16 = load i32, i32* %i1, align 4 %17 = load i32, i32* %i1, align 4 %siuiext6 = zext i32 %17 to i64 %18 = call i32 @"std::array::list.int.List__get"(%List* %array, i64 %siuiext6) %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %16, i32 %18) - br label %for.inc7 - -for.inc7: ; preds = %for.body5 %20 = load i32, i32* %i1, align 4 - %add8 = add i32 %20, 1 - store i32 %add8, i32* %i1, align 4 - br label %for.cond2 + %add7 = add i32 %20, 1 + store i32 %add7, i32* %i1, align 4 + br label %loop.cond2 -for.exit9: ; preds = %for.cond2 +loop.exit8: ; preds = %loop.cond2 call void @"std::array::list.int.List__free"(%List* %array) %21 = bitcast %Blob* %a to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %21, i8* align 4 bitcast (%Blob* @.__const.6 to i8*), i32 4, i1 false) @@ -582,8 +573,8 @@ for.exit9: ; preds = %for.cond2 %hi = load i64, i64* %46, align 8 %47 = call i32 @test.sum_us(i8* %lo, i64 %hi) %48 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i32 0, i32 0), i32 %47) - %add10 = add i32 %40, %48 - store i32 %add10, i32* %fro, align 4 + %add9 = add i32 %40, %48 + store i32 %add9, i32* %fro, align 4 %49 = load i32, i32* %fro, align 4 %50 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %49) %51 = bitcast [4 x i32]* %x to i32* @@ -592,26 +583,26 @@ for.exit9: ; preds = %for.cond2 store %"int[]" %53, %"int[]"* %z, align 8 %54 = bitcast [3 x i32]* %de to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %54, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false) - %55 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 1 - %56 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 0 + %55 = getelementptr inbounds %"int[]", %"int[]"* %vararg10, i32 0, i32 1 + %56 = getelementptr inbounds %"int[]", %"int[]"* %vararg10, i32 0, i32 0 store i64 4, i64* %55, align 8 %57 = bitcast [4 x i32]* %x to i32* store i32* %57, i32** %56, align 8 - %58 = bitcast %"int[]"* %vararg11 to { i8*, i64 }* + %58 = bitcast %"int[]"* %vararg10 to { i8*, i64 }* %59 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 0 - %lo12 = load i8*, i8** %59, align 8 + %lo11 = load i8*, i8** %59, align 8 %60 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %58, i32 0, i32 1 - %hi13 = load i64, i64* %60, align 8 - %61 = call i32 @test.sum_us(i8* %lo12, i64 %hi13) + %hi12 = load i64, i64* %60, align 8 + %61 = call i32 @test.sum_us(i8* %lo11, i64 %hi12) %62 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.16, i32 0, i32 0), i32 %61) - %63 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 1 - %64 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 0 + %63 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 1 + %64 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 0 %65 = bitcast %"int[]"* %z to { i8*, i64 }* %66 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 0 - %lo15 = load i8*, i8** %66, align 8 + %lo14 = load i8*, i8** %66, align 8 %67 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %65, i32 0, i32 1 - %hi16 = load i64, i64* %67, align 8 - %68 = call i32 @test.sum_us(i8* %lo15, i64 %hi16) + %hi15 = load i64, i64* %67, align 8 + %68 = call i32 @test.sum_us(i8* %lo14, i64 %hi15) %69 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.17, i32 0, i32 0), i32 %68) %70 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0 store i32 1, i32* %70, align 4 @@ -621,40 +612,40 @@ for.exit9: ; preds = %for.cond2 store i32 4, i32* %72, align 4 %73 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3 store i32 5, i32* %73, align 4 - %74 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 1 + %74 = getelementptr inbounds %"int[]", %"int[]"* %vararg16, i32 0, i32 1 store i64 4, i64* %74, align 8 - %75 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 0 + %75 = getelementptr inbounds %"int[]", %"int[]"* %vararg16, i32 0, i32 0 %76 = bitcast [4 x i32]* %varargslots to i32* store i32* %76, i32** %75, align 8 - %77 = bitcast %"int[]"* %vararg17 to { i8*, i64 }* + %77 = bitcast %"int[]"* %vararg16 to { i8*, i64 }* %78 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %77, i32 0, i32 0 - %lo18 = load i8*, i8** %78, align 8 + %lo17 = load i8*, i8** %78, align 8 %79 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %77, i32 0, i32 1 - %hi19 = load i64, i64* %79, align 8 - %80 = call i32 @test.sum_us(i8* %lo18, i64 %hi19) + %hi18 = load i64, i64* %79, align 8 + %80 = call i32 @test.sum_us(i8* %lo17, i64 %hi18) %81 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %80) - %82 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots21, i64 0, i64 0 + %82 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots20, i64 0, i64 0 store i32 1, i32* %82, align 4 - %83 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 1 + %83 = getelementptr inbounds %"int[]", %"int[]"* %vararg19, i32 0, i32 1 store i64 1, i64* %83, align 8 - %84 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 0 - %85 = bitcast [1 x i32]* %varargslots21 to i32* + %84 = getelementptr inbounds %"int[]", %"int[]"* %vararg19, i32 0, i32 0 + %85 = bitcast [1 x i32]* %varargslots20 to i32* store i32* %85, i32** %84, align 8 - %86 = bitcast %"int[]"* %vararg20 to { i8*, i64 }* + %86 = bitcast %"int[]"* %vararg19 to { i8*, i64 }* %87 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 0 - %lo22 = load i8*, i8** %87, align 8 + %lo21 = load i8*, i8** %87, align 8 %88 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %86, i32 0, i32 1 - %hi23 = load i64, i64* %88, align 8 - %89 = call i32 @test.sum_us(i8* %lo22, i64 %hi23) + %hi22 = load i64, i64* %88, align 8 + %89 = call i32 @test.sum_us(i8* %lo21, i64 %hi22) %90 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %89) - %91 = getelementptr inbounds %"int[]", %"int[]"* %vararg24, i32 0, i32 1 + %91 = getelementptr inbounds %"int[]", %"int[]"* %vararg23, i32 0, i32 1 store i64 0, i64* %91, align 8 - %92 = bitcast %"int[]"* %vararg24 to { i8*, i64 }* + %92 = bitcast %"int[]"* %vararg23 to { i8*, i64 }* %93 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %92, i32 0, i32 0 - %lo25 = load i8*, i8** %93, align 8 + %lo24 = load i8*, i8** %93, align 8 %94 = getelementptr inbounds { i8*, i64 }, { i8*, i64 }* %92, i32 0, i32 1 - %hi26 = load i64, i64* %94, align 8 - %95 = call i32 @test.sum_us(i8* %lo25, i64 %hi26) + %hi25 = load i64, i64* %94, align 8 + %95 = call i32 @test.sum_us(i8* %lo24, i64 %hi25) %96 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %95) store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8 store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8 diff --git a/test/test_suite/functions/test_regression_mingw.c3t b/test/test_suite/functions/test_regression_mingw.c3t index 677157180..25f30d39c 100644 --- a/test/test_suite/functions/test_regression_mingw.c3t +++ b/test/test_suite/functions/test_regression_mingw.c3t @@ -462,9 +462,9 @@ entry: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %1, i8* align 8 %2, i32 16, i1 false) store i32 0, i32* %sum, align 4 store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %3 = load i32, i32* %i, align 4 %sisiext = sext i32 %3 to i64 %4 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 1 @@ -472,9 +472,9 @@ for.cond: ; preds = %for.inc, %entry %lt = icmp slt i64 %sisiext, %5 %check = icmp slt i64 %5, 0 %siui-lt = or i1 %check, %lt - br i1 %siui-lt, label %for.body, label %for.exit + br i1 %siui-lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %6 = load i32, i32* %sum, align 4 %7 = getelementptr inbounds %"int[]", %"int[]"* %x, i32 0, i32 0 %8 = load i32*, i32** %7, align 8 @@ -484,15 +484,12 @@ for.body: ; preds = %for.cond %10 = load i32, i32* %ptroffset, align 4 %add = add i32 %6, %10 store i32 %add, i32* %sum, align 4 - br label %for.inc - -for.inc: ; preds = %for.body %11 = load i32, i32* %i, align 4 %add2 = add i32 %11, 1 store i32 %add2, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond %12 = load i32, i32* %sum, align 4 ret i32 %12 } @@ -517,18 +514,18 @@ entry: %indirectarg = alloca %"int[]", align 8 %z = alloca %"int[]", align 8 %de = alloca [3 x i32], align 4 - %vararg11 = alloca %"int[]", align 8 - %indirectarg12 = alloca %"int[]", align 8 - %vararg13 = alloca %"int[]", align 8 - %indirectarg14 = alloca %"int[]", align 8 - %vararg15 = alloca %"int[]", align 8 + %vararg10 = alloca %"int[]", align 8 + %indirectarg11 = alloca %"int[]", align 8 + %vararg12 = alloca %"int[]", align 8 + %indirectarg13 = alloca %"int[]", align 8 + %vararg14 = alloca %"int[]", align 8 %varargslots = alloca [4 x i32], align 16 - %indirectarg16 = alloca %"int[]", align 8 - %vararg17 = alloca %"int[]", align 8 - %varargslots18 = alloca [1 x i32], align 4 - %indirectarg19 = alloca %"int[]", align 8 - %vararg20 = alloca %"int[]", align 8 - %indirectarg21 = alloca %"int[]", align 8 + %indirectarg15 = alloca %"int[]", align 8 + %vararg16 = alloca %"int[]", align 8 + %varargslots17 = alloca [1 x i32], align 4 + %indirectarg18 = alloca %"int[]", align 8 + %vararg19 = alloca %"int[]", align 8 + %indirectarg20 = alloca %"int[]", align 8 %a1 = alloca i32 (double, %Bobo*)*, align 8 %b2 = alloca i32 (double, %Bobo*)*, align 8 %0 = call i32 @test.test_static() @@ -541,30 +538,27 @@ entry: call void @"std::array::linkedlist.int.LinkedList__push"(%LinkedList* %list, i32 15) call void @"std::array::linkedlist.int.LinkedList__push"(%LinkedList* %list, i32 30) store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %4 = load i32, i32* %i, align 4 %5 = call i64 @"std::array::linkedlist.int.LinkedList__len"(%LinkedList* %list) #3 %uisitrunc = trunc i64 %5 to i32 %lt = icmp slt i32 %4, %uisitrunc - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %6 = load i32, i32* %i, align 4 %7 = load i32, i32* %i, align 4 %siuiext = zext i32 %7 to i64 %8 = call i32 @"std::array::linkedlist.int.LinkedList__get"(%LinkedList* %list, i64 %siuiext) %9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.2, i32 0, i32 0), i32 %6, i32 %8) - br label %for.inc - -for.inc: ; preds = %for.body %10 = load i32, i32* %i, align 4 %add = add i32 %10, 1 store i32 %add, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond call void @"std::array::linkedlist.int.LinkedList__free"(%LinkedList* %list) %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.3, i32 0, i32 0), i32 -5, i32 14, i32 3) store i32 14, i32* %max, align 4 @@ -579,30 +573,27 @@ for.exit: ; preds = %for.cond call void @"std::array::list.int.List__push"(%List* %array, i32 600) #3 call void @"std::array::list.int.List__insertAt"(%List* %array, i64 2, i32 300) store i32 0, i32* %i1, align 4 - br label %for.cond2 + br label %loop.cond2 -for.cond2: ; preds = %for.inc7, %for.exit +loop.cond2: ; preds = %loop.body5, %loop.exit %14 = load i32, i32* %i1, align 4 %15 = call i64 @"std::array::list.int.List__len"(%List* %array) %uisitrunc3 = trunc i64 %15 to i32 %lt4 = icmp slt i32 %14, %uisitrunc3 - br i1 %lt4, label %for.body5, label %for.exit9 + br i1 %lt4, label %loop.body5, label %loop.exit8 -for.body5: ; preds = %for.cond2 +loop.body5: ; preds = %loop.cond2 %16 = load i32, i32* %i1, align 4 %17 = load i32, i32* %i1, align 4 %siuiext6 = zext i32 %17 to i64 %18 = call i32 @"std::array::list.int.List__get"(%List* %array, i64 %siuiext6) %19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.5, i32 0, i32 0), i32 %16, i32 %18) - br label %for.inc7 - -for.inc7: ; preds = %for.body5 %20 = load i32, i32* %i1, align 4 - %add8 = add i32 %20, 1 - store i32 %add8, i32* %i1, align 4 - br label %for.cond2 + %add7 = add i32 %20, 1 + store i32 %add7, i32* %i1, align 4 + br label %loop.cond2 -for.exit9: ; preds = %for.cond2 +loop.exit8: ; preds = %loop.cond2 call void @"std::array::list.int.List__free"(%List* %array) %21 = bitcast %Blob* %a to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %21, i8* align 4 bitcast (%Blob* @.__const.6 to i8*), i32 4, i1 false) @@ -642,8 +633,8 @@ for.exit9: ; preds = %for.cond2 call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %44, i8* align 8 %45, i32 16, i1 false) %46 = call i32 @test.sum_us(%"int[]"* %indirectarg) %47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([22 x i8], [22 x i8]* @.str.13, i32 0, i32 0), i32 %46) - %add10 = add i32 %40, %47 - store i32 %add10, i32* %fro, align 4 + %add9 = add i32 %40, %47 + store i32 %add9, i32* %fro, align 4 %48 = load i32, i32* %fro, align 4 %49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.14, i32 0, i32 0), i32 %48) %50 = bitcast [4 x i32]* %x to i32* @@ -652,22 +643,22 @@ for.exit9: ; preds = %for.cond2 store %"int[]" %52, %"int[]"* %z, align 8 %53 = bitcast [3 x i32]* %de to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %53, i8* align 4 bitcast ([3 x i32]* @.__const.15 to i8*), i32 12, i1 false) - %54 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 1 - %55 = getelementptr inbounds %"int[]", %"int[]"* %vararg11, i32 0, i32 0 + %54 = getelementptr inbounds %"int[]", %"int[]"* %vararg10, i32 0, i32 1 + %55 = getelementptr inbounds %"int[]", %"int[]"* %vararg10, i32 0, i32 0 store i64 4, i64* %54, align 8 %56 = bitcast [4 x i32]* %x to i32* store i32* %56, i32** %55, align 8 - %57 = bitcast %"int[]"* %indirectarg12 to i8* - %58 = bitcast %"int[]"* %vararg11 to i8* + %57 = bitcast %"int[]"* %indirectarg11 to i8* + %58 = bitcast %"int[]"* %vararg10 to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %57, i8* align 8 %58, i32 16, i1 false) - %59 = call i32 @test.sum_us(%"int[]"* %indirectarg12) + %59 = call i32 @test.sum_us(%"int[]"* %indirectarg11) %60 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.16, i32 0, i32 0), i32 %59) - %61 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 1 - %62 = getelementptr inbounds %"int[]", %"int[]"* %vararg13, i32 0, i32 0 - %63 = bitcast %"int[]"* %indirectarg14 to i8* + %61 = getelementptr inbounds %"int[]", %"int[]"* %vararg12, i32 0, i32 1 + %62 = getelementptr inbounds %"int[]", %"int[]"* %vararg12, i32 0, i32 0 + %63 = bitcast %"int[]"* %indirectarg13 to i8* %64 = bitcast %"int[]"* %z to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %63, i8* align 8 %64, i32 16, i1 false) - %65 = call i32 @test.sum_us(%"int[]"* %indirectarg14) + %65 = call i32 @test.sum_us(%"int[]"* %indirectarg13) %66 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.17, i32 0, i32 0), i32 %65) %67 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 0 store i32 1, i32* %67, align 4 @@ -677,34 +668,34 @@ for.exit9: ; preds = %for.cond2 store i32 4, i32* %69, align 4 %70 = getelementptr inbounds [4 x i32], [4 x i32]* %varargslots, i64 0, i64 3 store i32 5, i32* %70, align 4 - %71 = getelementptr inbounds %"int[]", %"int[]"* %vararg15, i32 0, i32 1 + %71 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 1 store i64 4, i64* %71, align 8 - %72 = getelementptr inbounds %"int[]", %"int[]"* %vararg15, i32 0, i32 0 + %72 = getelementptr inbounds %"int[]", %"int[]"* %vararg14, i32 0, i32 0 %73 = bitcast [4 x i32]* %varargslots to i32* store i32* %73, i32** %72, align 8 - %74 = bitcast %"int[]"* %indirectarg16 to i8* - %75 = bitcast %"int[]"* %vararg15 to i8* + %74 = bitcast %"int[]"* %indirectarg15 to i8* + %75 = bitcast %"int[]"* %vararg14 to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %74, i8* align 8 %75, i32 16, i1 false) - %76 = call i32 @test.sum_us(%"int[]"* %indirectarg16) + %76 = call i32 @test.sum_us(%"int[]"* %indirectarg15) %77 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.18, i32 0, i32 0), i32 %76) - %78 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots18, i64 0, i64 0 + %78 = getelementptr inbounds [1 x i32], [1 x i32]* %varargslots17, i64 0, i64 0 store i32 1, i32* %78, align 4 - %79 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 1 + %79 = getelementptr inbounds %"int[]", %"int[]"* %vararg16, i32 0, i32 1 store i64 1, i64* %79, align 8 - %80 = getelementptr inbounds %"int[]", %"int[]"* %vararg17, i32 0, i32 0 - %81 = bitcast [1 x i32]* %varargslots18 to i32* + %80 = getelementptr inbounds %"int[]", %"int[]"* %vararg16, i32 0, i32 0 + %81 = bitcast [1 x i32]* %varargslots17 to i32* store i32* %81, i32** %80, align 8 - %82 = bitcast %"int[]"* %indirectarg19 to i8* - %83 = bitcast %"int[]"* %vararg17 to i8* + %82 = bitcast %"int[]"* %indirectarg18 to i8* + %83 = bitcast %"int[]"* %vararg16 to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %82, i8* align 8 %83, i32 16, i1 false) - %84 = call i32 @test.sum_us(%"int[]"* %indirectarg19) + %84 = call i32 @test.sum_us(%"int[]"* %indirectarg18) %85 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.19, i32 0, i32 0), i32 %84) - %86 = getelementptr inbounds %"int[]", %"int[]"* %vararg20, i32 0, i32 1 + %86 = getelementptr inbounds %"int[]", %"int[]"* %vararg19, i32 0, i32 1 store i64 0, i64* %86, align 8 - %87 = bitcast %"int[]"* %indirectarg21 to i8* - %88 = bitcast %"int[]"* %vararg20 to i8* + %87 = bitcast %"int[]"* %indirectarg20 to i8* + %88 = bitcast %"int[]"* %vararg19 to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 8 %87, i8* align 8 %88, i32 16, i1 false) - %89 = call i32 @test.sum_us(%"int[]"* %indirectarg21) + %89 = call i32 @test.sum_us(%"int[]"* %indirectarg20) %90 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i32 0, i32 0), i32 %89) store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %a1, align 8 store i32 (double, %Bobo*)* null, i32 (double, %Bobo*)** %b2, align 8 diff --git a/test/test_suite/initializer_lists/fasta.c3t b/test/test_suite/initializer_lists/fasta.c3t index 9b190ffd3..ce651a91a 100644 --- a/test/test_suite/initializer_lists/fasta.c3t +++ b/test/test_suite/initializer_lists/fasta.c3t @@ -105,7 +105,8 @@ fn void main(int argc, char **argv) } -// #expect: fasta.ll +/* #expect: fasta.ll + %"char[]" = type { i8*, i64 } %"double[]" = type { double*, i64 } @@ -173,15 +174,15 @@ entry: %6 = load i64, i64* %5, align 8 store i64 %6, i64* %len, align 8 store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %if.exit, %entry %7 = load i32, i32* %i, align 4 %8 = load i32, i32* %n, align 4 %lt = icmp slt i32 %7, %8 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %9 = getelementptr inbounds %"char[]", %"char[]"* %seq, i32 0, i32 0 %10 = load i8*, i8** %9, align 8 %11 = load i32, i32* %i, align 4 @@ -197,30 +198,27 @@ for.body: ; preds = %for.cond %eq = icmp eq i32 %smod1, 59 br i1 %eq, label %if.then, label %if.exit -if.then: ; preds = %for.body +if.then: ; preds = %loop.body call void @putchar(i32 10) br label %if.exit -if.exit: ; preds = %if.then, %for.body - br label %for.inc - -for.inc: ; preds = %if.exit +if.exit: ; preds = %if.then, %loop.body %15 = load i32, i32* %i, align 4 %add = add i32 %15, 1 store i32 %add, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond %16 = load i32, i32* %i, align 4 %smod2 = srem i32 %16, 60 %neq = icmp ne i32 %smod2, 0 br i1 %neq, label %if.then3, label %if.exit4 -if.then3: ; preds = %for.exit +if.then3: ; preds = %loop.exit call void @putchar(i32 10) br label %if.exit4 -if.exit4: ; preds = %if.then3, %for.exit +if.exit4: ; preds = %if.then3, %loop.exit ret void } @@ -256,29 +254,29 @@ entry: %uisitrunc = trunc i64 %14 to i32 store i32 %uisitrunc, i32* %len, align 4 store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc11, %entry +loop.cond: ; preds = %if.exit10, %entry %15 = load i32, i32* %i, align 4 %16 = load i32, i32* %n, align 4 %lt = icmp slt i32 %15, %16 - br i1 %lt, label %for.body, label %for.exit13 + br i1 %lt, label %loop.body, label %loop.exit12 -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %17 = call float @fasta.fasta_rand(float 1.000000e+00) %fpfpext = fpext float %17 to double store double %fpfpext, double* %v, align 8 store i32 0, i32* %j, align 4 - br label %for.cond2 + br label %loop.cond2 -for.cond2: ; preds = %for.inc, %for.body +loop.cond2: ; preds = %if.exit, %loop.body %18 = load i32, i32* %j, align 4 %19 = load i32, i32* %len, align 4 %sub = sub i32 %19, 1 %lt3 = icmp slt i32 %18, %sub - br i1 %lt3, label %for.body4, label %for.exit + br i1 %lt3, label %loop.body4, label %loop.exit -for.body4: ; preds = %for.cond2 +loop.body4: ; preds = %loop.cond2 %20 = load double, double* %v, align 8 %21 = getelementptr inbounds %"double[]", %"double[]"* %probability, i32 0, i32 0 %22 = load double*, double** %21, align 8 @@ -292,19 +290,16 @@ for.body4: ; preds = %for.cond2 %lt5 = fcmp olt double %25, 0.000000e+00 br i1 %lt5, label %if.then, label %if.exit -if.then: ; preds = %for.body4 - br label %for.exit +if.then: ; preds = %loop.body4 + br label %loop.exit -if.exit: ; preds = %for.body4 - br label %for.inc - -for.inc: ; preds = %if.exit +if.exit: ; preds = %loop.body4 %26 = load i32, i32* %j, align 4 %add = add i32 %26, 1 store i32 %add, i32* %j, align 4 - br label %for.cond2 + br label %loop.cond2 -for.exit: ; preds = %if.then, %for.cond2 +loop.exit: ; preds = %if.then, %loop.cond2 %27 = getelementptr inbounds %"char[]", %"char[]"* %symb, i32 0, i32 0 %28 = load i8*, i8** %27, align 8 %29 = load i32, i32* %j, align 4 @@ -318,30 +313,27 @@ for.exit: ; preds = %if.then, %for.cond2 %eq8 = icmp eq i32 %smod, 59 br i1 %eq8, label %if.then9, label %if.exit10 -if.then9: ; preds = %for.exit +if.then9: ; preds = %loop.exit call void @putchar(i32 10) br label %if.exit10 -if.exit10: ; preds = %if.then9, %for.exit - br label %for.inc11 - -for.inc11: ; preds = %if.exit10 +if.exit10: ; preds = %if.then9, %loop.exit %32 = load i32, i32* %i, align 4 - %add12 = add i32 %32, 1 - store i32 %add12, i32* %i, align 4 - br label %for.cond + %add11 = add i32 %32, 1 + store i32 %add11, i32* %i, align 4 + br label %loop.cond -for.exit13: ; preds = %for.cond +loop.exit12: ; preds = %loop.cond %33 = load i32, i32* %i, align 4 - %smod14 = srem i32 %33, 60 - %neq = icmp ne i32 %smod14, 0 - br i1 %neq, label %if.then15, label %if.exit16 + %smod13 = srem i32 %33, 60 + %neq = icmp ne i32 %smod13, 0 + br i1 %neq, label %if.then14, label %if.exit15 -if.then15: ; preds = %for.exit13 +if.then14: ; preds = %loop.exit12 call void @putchar(i32 10) - br label %if.exit16 + br label %if.exit15 -if.exit16: ; preds = %if.then15, %for.exit13 +if.exit15: ; preds = %if.then14, %loop.exit12 ret void } diff --git a/test/test_suite/initializer_lists/ranges_to_dynamic.c3t b/test/test_suite/initializer_lists/ranges_to_dynamic.c3t index f03864184..01e2227f8 100644 --- a/test/test_suite/initializer_lists/ranges_to_dynamic.c3t +++ b/test/test_suite/initializer_lists/ranges_to_dynamic.c3t @@ -44,28 +44,25 @@ entry: %9 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 8 store i32 %7, i32* %9, align 4 store i64 0, i64* %"__idx$", align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %10 = load i64, i64* %"__idx$", align 8 %gt = icmp ugt i64 10, %10 - br i1 %gt, label %for.body, label %for.exit + br i1 %gt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %11 = load i64, i64* %"__idx$", align 8 %12 = getelementptr inbounds [10 x i32], [10 x i32]* %y, i64 0, i64 %11 %13 = load i32, i32* %12, align 4 store i32 %13, i32* %v, align 4 %14 = load i32, i32* %v, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %14) - br label %for.inc - -for.inc: ; preds = %for.body %15 = load i64, i64* %"__idx$", align 8 %add = add i64 %15, 1 store i64 %add, i64* %"__idx$", align 8 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond ret void -} +} \ No newline at end of file diff --git a/test/test_suite/macros/macro_nested_labels.c3t b/test/test_suite/macros/macro_nested_labels.c3t index 3639006bc..f0f1355bc 100644 --- a/test/test_suite/macros/macro_nested_labels.c3t +++ b/test/test_suite/macros/macro_nested_labels.c3t @@ -33,292 +33,324 @@ entry: %ab = alloca i32, align 4 %x = alloca i32, align 4 %i = alloca i32, align 4 - %i1 = alloca i32, align 4 - %x8 = alloca i32, align 4 - %i9 = alloca i32, align 4 + %i3 = alloca i32, align 4 + %x9 = alloca i32, align 4 + %i10 = alloca i32, align 4 %i20 = alloca i32, align 4 - %x27 = alloca i32, align 4 - %i28 = alloca i32, align 4 - %i39 = alloca i32, align 4 - %x46 = alloca i32, align 4 - %i47 = alloca i32, align 4 - %i58 = alloca i32, align 4 - %i65 = alloca i32, align 4 - %i77 = alloca i32, align 4 - %i89 = alloca i32, align 4 - %i101 = alloca i32, align 4 + %x26 = alloca i32, align 4 + %i27 = alloca i32, align 4 + %i37 = alloca i32, align 4 + %x43 = alloca i32, align 4 + %i44 = alloca i32, align 4 + %i54 = alloca i32, align 4 + %i61 = alloca i32, align 4 + %i72 = alloca i32, align 4 + %i83 = alloca i32, align 4 + %i94 = alloca i32, align 4 store i32 7, i32* %ab, align 4 %0 = load i32, i32* %ab, align 4 store i32 %0, i32* %x, align 4 store i32 0, i32* %i, align 4 - br label %for.cond -for.cond: ; preds = %for.inc, %entry + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry %1 = load i32, i32* %i, align 4 %lt = icmp slt i32 %1, 0 - br i1 %lt, label %for.body, label %for.exit -for.body: ; preds = %for.cond + br i1 %lt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) - br label %for.inc -for.inc: ; preds = %for.body %2 = load i32, i32* %i, align 4 %add = add i32 %2, 1 store i32 %add, i32* %i, align 4 - br label %for.cond -for.exit: ; preds = %for.cond + br label %loop.cond + +loop.exit: ; preds = %loop.cond call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.1, i32 0, i32 0), i32 3) - br label %while.begin -while.begin: ; preds = %if.exit99, %for.exit + br label %loop.cond1 + +loop.cond1: ; preds = %if.exit92, %loop.exit %3 = load i32, i32* %x, align 4 %sub = sub i32 %3, 1 store i32 %sub, i32* %x, align 4 %gt = icmp sgt i32 %3, 0 - br i1 %gt, label %while.body, label %while.exit100 -while.body: ; preds = %while.begin - store i32 0, i32* %i1, align 4 - br label %for.cond2 -for.cond2: ; preds = %for.inc5, %while.body - %4 = load i32, i32* %i1, align 4 - %lt3 = icmp slt i32 %4, 0 - br i1 %lt3, label %for.body4, label %for.exit7 -for.body4: ; preds = %for.cond2 + br i1 %gt, label %loop.body2, label %loop.exit93 + +loop.body2: ; preds = %loop.cond1 + store i32 0, i32* %i3, align 4 + br label %loop.cond4 + +loop.cond4: ; preds = %loop.body6, %loop.body2 + %4 = load i32, i32* %i3, align 4 + %lt5 = icmp slt i32 %4, 0 + br i1 %lt5, label %loop.body6, label %loop.exit8 + +loop.body6: ; preds = %loop.cond4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i32 0, i32 0)) - br label %for.inc5 -for.inc5: ; preds = %for.body4 - %5 = load i32, i32* %i1, align 4 - %add6 = add i32 %5, 1 - store i32 %add6, i32* %i1, align 4 - br label %for.cond2 -for.exit7: ; preds = %for.cond2 + %5 = load i32, i32* %i3, align 4 + %add7 = add i32 %5, 1 + store i32 %add7, i32* %i3, align 4 + br label %loop.cond4 + +loop.exit8: ; preds = %loop.cond4 %6 = load i32, i32* %x, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.3, i32 0, i32 0), i32 %6) %7 = load i32, i32* %x, align 4 - store i32 %7, i32* %x8, align 4 - store i32 0, i32* %i9, align 4 - br label %for.cond10 -for.cond10: ; preds = %for.inc13, %for.exit7 - %8 = load i32, i32* %i9, align 4 - %lt11 = icmp slt i32 %8, 1 - br i1 %lt11, label %for.body12, label %for.exit15 -for.body12: ; preds = %for.cond10 + store i32 %7, i32* %x9, align 4 + store i32 0, i32* %i10, align 4 + br label %loop.cond11 + +loop.cond11: ; preds = %loop.body13, %loop.exit8 + %8 = load i32, i32* %i10, align 4 + %lt12 = icmp slt i32 %8, 1 + br i1 %lt12, label %loop.body13, label %loop.exit15 + +loop.body13: ; preds = %loop.cond11 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.4, i32 0, i32 0)) - br label %for.inc13 -for.inc13: ; preds = %for.body12 - %9 = load i32, i32* %i9, align 4 + %9 = load i32, i32* %i10, align 4 %add14 = add i32 %9, 1 - store i32 %add14, i32* %i9, align 4 - br label %for.cond10 -for.exit15: ; preds = %for.cond10 + store i32 %add14, i32* %i10, align 4 + br label %loop.cond11 + +loop.exit15: ; preds = %loop.cond11 call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.5, i32 0, i32 0), i32 2) - br label %while.begin16 -while.begin16: ; preds = %if.exit87, %for.exit15 - %10 = load i32, i32* %x8, align 4 + br label %loop.cond16 + +loop.cond16: ; preds = %if.exit81, %loop.exit15 + %10 = load i32, i32* %x9, align 4 %sub17 = sub i32 %10, 1 - store i32 %sub17, i32* %x8, align 4 + store i32 %sub17, i32* %x9, align 4 %gt18 = icmp sgt i32 %10, 0 - br i1 %gt18, label %while.body19, label %while.exit88 -while.body19: ; preds = %while.begin16 + br i1 %gt18, label %loop.body19, label %loop.exit82 + +loop.body19: ; preds = %loop.cond16 store i32 0, i32* %i20, align 4 - br label %for.cond21 -for.cond21: ; preds = %for.inc24, %while.body19 + br label %loop.cond21 + +loop.cond21: ; preds = %loop.body23, %loop.body19 %11 = load i32, i32* %i20, align 4 %lt22 = icmp slt i32 %11, 1 - br i1 %lt22, label %for.body23, label %for.exit26 -for.body23: ; preds = %for.cond21 + br i1 %lt22, label %loop.body23, label %loop.exit25 + +loop.body23: ; preds = %loop.cond21 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.6, i32 0, i32 0)) - br label %for.inc24 -for.inc24: ; preds = %for.body23 %12 = load i32, i32* %i20, align 4 - %add25 = add i32 %12, 1 - store i32 %add25, i32* %i20, align 4 - br label %for.cond21 -for.exit26: ; preds = %for.cond21 - %13 = load i32, i32* %x8, align 4 + %add24 = add i32 %12, 1 + store i32 %add24, i32* %i20, align 4 + br label %loop.cond21 + +loop.exit25: ; preds = %loop.cond21 + %13 = load i32, i32* %x9, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.7, i32 0, i32 0), i32 %13) - %14 = load i32, i32* %x8, align 4 - store i32 %14, i32* %x27, align 4 - store i32 0, i32* %i28, align 4 - br label %for.cond29 -for.cond29: ; preds = %for.inc32, %for.exit26 - %15 = load i32, i32* %i28, align 4 - %lt30 = icmp slt i32 %15, 2 - br i1 %lt30, label %for.body31, label %for.exit34 -for.body31: ; preds = %for.cond29 + %14 = load i32, i32* %x9, align 4 + store i32 %14, i32* %x26, align 4 + store i32 0, i32* %i27, align 4 + br label %loop.cond28 + +loop.cond28: ; preds = %loop.body30, %loop.exit25 + %15 = load i32, i32* %i27, align 4 + %lt29 = icmp slt i32 %15, 2 + br i1 %lt29, label %loop.body30, label %loop.exit32 + +loop.body30: ; preds = %loop.cond28 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.8, i32 0, i32 0)) - br label %for.inc32 -for.inc32: ; preds = %for.body31 - %16 = load i32, i32* %i28, align 4 - %add33 = add i32 %16, 1 - store i32 %add33, i32* %i28, align 4 - br label %for.cond29 -for.exit34: ; preds = %for.cond29 + %16 = load i32, i32* %i27, align 4 + %add31 = add i32 %16, 1 + store i32 %add31, i32* %i27, align 4 + br label %loop.cond28 + +loop.exit32: ; preds = %loop.cond28 call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.9, i32 0, i32 0), i32 1) - br label %while.begin35 -while.begin35: ; preds = %if.exit75, %for.exit34 - %17 = load i32, i32* %x27, align 4 - %sub36 = sub i32 %17, 1 - store i32 %sub36, i32* %x27, align 4 - %gt37 = icmp sgt i32 %17, 0 - br i1 %gt37, label %while.body38, label %while.exit76 -while.body38: ; preds = %while.begin35 - store i32 0, i32* %i39, align 4 - br label %for.cond40 -for.cond40: ; preds = %for.inc43, %while.body38 - %18 = load i32, i32* %i39, align 4 - %lt41 = icmp slt i32 %18, 2 - br i1 %lt41, label %for.body42, label %for.exit45 -for.body42: ; preds = %for.cond40 + br label %loop.cond33 + +loop.cond33: ; preds = %if.exit70, %loop.exit32 + %17 = load i32, i32* %x26, align 4 + %sub34 = sub i32 %17, 1 + store i32 %sub34, i32* %x26, align 4 + %gt35 = icmp sgt i32 %17, 0 + br i1 %gt35, label %loop.body36, label %loop.exit71 + +loop.body36: ; preds = %loop.cond33 + store i32 0, i32* %i37, align 4 + br label %loop.cond38 + +loop.cond38: ; preds = %loop.body40, %loop.body36 + %18 = load i32, i32* %i37, align 4 + %lt39 = icmp slt i32 %18, 2 + br i1 %lt39, label %loop.body40, label %loop.exit42 + +loop.body40: ; preds = %loop.cond38 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.10, i32 0, i32 0)) - br label %for.inc43 -for.inc43: ; preds = %for.body42 - %19 = load i32, i32* %i39, align 4 - %add44 = add i32 %19, 1 - store i32 %add44, i32* %i39, align 4 - br label %for.cond40 -for.exit45: ; preds = %for.cond40 - %20 = load i32, i32* %x27, align 4 + %19 = load i32, i32* %i37, align 4 + %add41 = add i32 %19, 1 + store i32 %add41, i32* %i37, align 4 + br label %loop.cond38 + +loop.exit42: ; preds = %loop.cond38 + %20 = load i32, i32* %x26, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.11, i32 0, i32 0), i32 %20) - %21 = load i32, i32* %x27, align 4 - store i32 %21, i32* %x46, align 4 - store i32 0, i32* %i47, align 4 - br label %for.cond48 -for.cond48: ; preds = %for.inc51, %for.exit45 - %22 = load i32, i32* %i47, align 4 - %lt49 = icmp slt i32 %22, 3 - br i1 %lt49, label %for.body50, label %for.exit53 -for.body50: ; preds = %for.cond48 + %21 = load i32, i32* %x26, align 4 + store i32 %21, i32* %x43, align 4 + store i32 0, i32* %i44, align 4 + br label %loop.cond45 + +loop.cond45: ; preds = %loop.body47, %loop.exit42 + %22 = load i32, i32* %i44, align 4 + %lt46 = icmp slt i32 %22, 3 + br i1 %lt46, label %loop.body47, label %loop.exit49 + +loop.body47: ; preds = %loop.cond45 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.12, i32 0, i32 0)) - br label %for.inc51 -for.inc51: ; preds = %for.body50 - %23 = load i32, i32* %i47, align 4 - %add52 = add i32 %23, 1 - store i32 %add52, i32* %i47, align 4 - br label %for.cond48 -for.exit53: ; preds = %for.cond48 + %23 = load i32, i32* %i44, align 4 + %add48 = add i32 %23, 1 + store i32 %add48, i32* %i44, align 4 + br label %loop.cond45 + +loop.exit49: ; preds = %loop.cond45 call void (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.13, i32 0, i32 0), i32 0) - br label %while.begin54 -while.begin54: ; preds = %if.exit, %for.exit53 - %24 = load i32, i32* %x46, align 4 - %sub55 = sub i32 %24, 1 - store i32 %sub55, i32* %x46, align 4 - %gt56 = icmp sgt i32 %24, 0 - br i1 %gt56, label %while.body57, label %while.exit -while.body57: ; preds = %while.begin54 - store i32 0, i32* %i58, align 4 - br label %for.cond59 -for.cond59: ; preds = %for.inc62, %while.body57 - %25 = load i32, i32* %i58, align 4 - %lt60 = icmp slt i32 %25, 3 - br i1 %lt60, label %for.body61, label %for.exit64 -for.body61: ; preds = %for.cond59 + br label %loop.cond50 + +loop.cond50: ; preds = %if.exit, %loop.exit49 + %24 = load i32, i32* %x43, align 4 + %sub51 = sub i32 %24, 1 + store i32 %sub51, i32* %x43, align 4 + %gt52 = icmp sgt i32 %24, 0 + br i1 %gt52, label %loop.body53, label %loop.exit60 + +loop.body53: ; preds = %loop.cond50 + store i32 0, i32* %i54, align 4 + br label %loop.cond55 + +loop.cond55: ; preds = %loop.body57, %loop.body53 + %25 = load i32, i32* %i54, align 4 + %lt56 = icmp slt i32 %25, 3 + br i1 %lt56, label %loop.body57, label %loop.exit59 + +loop.body57: ; preds = %loop.cond55 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.14, i32 0, i32 0)) - br label %for.inc62 -for.inc62: ; preds = %for.body61 - %26 = load i32, i32* %i58, align 4 - %add63 = add i32 %26, 1 - store i32 %add63, i32* %i58, align 4 - br label %for.cond59 -for.exit64: ; preds = %for.cond59 - %27 = load i32, i32* %x46, align 4 + %26 = load i32, i32* %i54, align 4 + %add58 = add i32 %26, 1 + store i32 %add58, i32* %i54, align 4 + br label %loop.cond55 + +loop.exit59: ; preds = %loop.cond55 + %27 = load i32, i32* %x43, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.15, i32 0, i32 0), i32 %27) - %28 = load i32, i32* %x46, align 4 + %28 = load i32, i32* %x43, align 4 %smod = srem i32 %28, 2 %eq = icmp eq i32 %smod, 0 br i1 %eq, label %if.then, label %if.exit -if.then: ; preds = %for.exit64 - br label %while.exit -if.exit: ; preds = %for.exit64 - br label %while.begin54 -while.exit: ; preds = %if.then, %while.begin54 - store i32 0, i32* %i65, align 4 - br label %for.cond66 -for.cond66: ; preds = %for.inc69, %while.exit - %29 = load i32, i32* %i65, align 4 - %lt67 = icmp slt i32 %29, 3 - br i1 %lt67, label %for.body68, label %for.exit71 -for.body68: ; preds = %for.cond66 + +if.then: ; preds = %loop.exit59 + br label %loop.exit60 + +if.exit: ; preds = %loop.exit59 + br label %loop.cond50 + +loop.exit60: ; preds = %if.then, %loop.cond50 + store i32 0, i32* %i61, align 4 + br label %loop.cond62 + +loop.cond62: ; preds = %loop.body64, %loop.exit60 + %29 = load i32, i32* %i61, align 4 + %lt63 = icmp slt i32 %29, 3 + br i1 %lt63, label %loop.body64, label %loop.exit66 + +loop.body64: ; preds = %loop.cond62 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.16, i32 0, i32 0)) - br label %for.inc69 -for.inc69: ; preds = %for.body68 - %30 = load i32, i32* %i65, align 4 - %add70 = add i32 %30, 1 - store i32 %add70, i32* %i65, align 4 - br label %for.cond66 -for.exit71: ; preds = %for.cond66 + %30 = load i32, i32* %i61, align 4 + %add65 = add i32 %30, 1 + store i32 %add65, i32* %i61, align 4 + br label %loop.cond62 + +loop.exit66: ; preds = %loop.cond62 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.17, i32 0, i32 0), i32 0) - %31 = load i32, i32* %x27, align 4 - %smod72 = srem i32 %31, 2 - %eq73 = icmp eq i32 %smod72, 0 - br i1 %eq73, label %if.then74, label %if.exit75 -if.then74: ; preds = %for.exit71 - br label %while.exit76 -if.exit75: ; preds = %for.exit71 - br label %while.begin35 -while.exit76: ; preds = %if.then74, %while.begin35 - store i32 0, i32* %i77, align 4 - br label %for.cond78 -for.cond78: ; preds = %for.inc81, %while.exit76 - %32 = load i32, i32* %i77, align 4 - %lt79 = icmp slt i32 %32, 2 - br i1 %lt79, label %for.body80, label %for.exit83 -for.body80: ; preds = %for.cond78 + %31 = load i32, i32* %x26, align 4 + %smod67 = srem i32 %31, 2 + %eq68 = icmp eq i32 %smod67, 0 + br i1 %eq68, label %if.then69, label %if.exit70 + +if.then69: ; preds = %loop.exit66 + br label %loop.exit71 + +if.exit70: ; preds = %loop.exit66 + br label %loop.cond33 + +loop.exit71: ; preds = %if.then69, %loop.cond33 + store i32 0, i32* %i72, align 4 + br label %loop.cond73 + +loop.cond73: ; preds = %loop.body75, %loop.exit71 + %32 = load i32, i32* %i72, align 4 + %lt74 = icmp slt i32 %32, 2 + br i1 %lt74, label %loop.body75, label %loop.exit77 + +loop.body75: ; preds = %loop.cond73 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.18, i32 0, i32 0)) - br label %for.inc81 -for.inc81: ; preds = %for.body80 - %33 = load i32, i32* %i77, align 4 - %add82 = add i32 %33, 1 - store i32 %add82, i32* %i77, align 4 - br label %for.cond78 -for.exit83: ; preds = %for.cond78 + %33 = load i32, i32* %i72, align 4 + %add76 = add i32 %33, 1 + store i32 %add76, i32* %i72, align 4 + br label %loop.cond73 + +loop.exit77: ; preds = %loop.cond73 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.19, i32 0, i32 0), i32 1) - %34 = load i32, i32* %x8, align 4 - %smod84 = srem i32 %34, 2 - %eq85 = icmp eq i32 %smod84, 0 - br i1 %eq85, label %if.then86, label %if.exit87 -if.then86: ; preds = %for.exit83 - br label %while.exit88 -if.exit87: ; preds = %for.exit83 - br label %while.begin16 -while.exit88: ; preds = %if.then86, %while.begin16 - store i32 0, i32* %i89, align 4 - br label %for.cond90 -for.cond90: ; preds = %for.inc93, %while.exit88 - %35 = load i32, i32* %i89, align 4 - %lt91 = icmp slt i32 %35, 1 - br i1 %lt91, label %for.body92, label %for.exit95 -for.body92: ; preds = %for.cond90 + %34 = load i32, i32* %x9, align 4 + %smod78 = srem i32 %34, 2 + %eq79 = icmp eq i32 %smod78, 0 + br i1 %eq79, label %if.then80, label %if.exit81 + +if.then80: ; preds = %loop.exit77 + br label %loop.exit82 + +if.exit81: ; preds = %loop.exit77 + br label %loop.cond16 + +loop.exit82: ; preds = %if.then80, %loop.cond16 + store i32 0, i32* %i83, align 4 + br label %loop.cond84 + +loop.cond84: ; preds = %loop.body86, %loop.exit82 + %35 = load i32, i32* %i83, align 4 + %lt85 = icmp slt i32 %35, 1 + br i1 %lt85, label %loop.body86, label %loop.exit88 + +loop.body86: ; preds = %loop.cond84 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.20, i32 0, i32 0)) - br label %for.inc93 -for.inc93: ; preds = %for.body92 - %36 = load i32, i32* %i89, align 4 - %add94 = add i32 %36, 1 - store i32 %add94, i32* %i89, align 4 - br label %for.cond90 -for.exit95: ; preds = %for.cond90 + %36 = load i32, i32* %i83, align 4 + %add87 = add i32 %36, 1 + store i32 %add87, i32* %i83, align 4 + br label %loop.cond84 + +loop.exit88: ; preds = %loop.cond84 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.21, i32 0, i32 0), i32 2) %37 = load i32, i32* %x, align 4 - %smod96 = srem i32 %37, 2 - %eq97 = icmp eq i32 %smod96, 0 - br i1 %eq97, label %if.then98, label %if.exit99 -if.then98: ; preds = %for.exit95 - br label %while.exit100 -if.exit99: ; preds = %for.exit95 - br label %while.begin -while.exit100: ; preds = %if.then98, %while.begin - store i32 0, i32* %i101, align 4 - br label %for.cond102 -for.cond102: ; preds = %for.inc105, %while.exit100 - %38 = load i32, i32* %i101, align 4 - %lt103 = icmp slt i32 %38, 0 - br i1 %lt103, label %for.body104, label %for.exit107 -for.body104: ; preds = %for.cond102 + %smod89 = srem i32 %37, 2 + %eq90 = icmp eq i32 %smod89, 0 + br i1 %eq90, label %if.then91, label %if.exit92 + +if.then91: ; preds = %loop.exit88 + br label %loop.exit93 + +if.exit92: ; preds = %loop.exit88 + br label %loop.cond1 + +loop.exit93: ; preds = %if.then91, %loop.cond1 + store i32 0, i32* %i94, align 4 + br label %loop.cond95 + +loop.cond95: ; preds = %loop.body97, %loop.exit93 + %38 = load i32, i32* %i94, align 4 + %lt96 = icmp slt i32 %38, 0 + br i1 %lt96, label %loop.body97, label %loop.exit99 + +loop.body97: ; preds = %loop.cond95 call void (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.22, i32 0, i32 0)) - br label %for.inc105 -for.inc105: ; preds = %for.body104 - %39 = load i32, i32* %i101, align 4 - %add106 = add i32 %39, 1 - store i32 %add106, i32* %i101, align 4 - br label %for.cond102 -for.exit107: ; preds = %for.cond102 + %39 = load i32, i32* %i94, align 4 + %add98 = add i32 %39, 1 + store i32 %add98, i32* %i94, align 4 + br label %loop.cond95 + +loop.exit99: ; preds = %loop.cond95 call void (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.23, i32 0, i32 0), i32 3) ret void } diff --git a/test/test_suite/macros/macro_with_body.c3t b/test/test_suite/macros/macro_with_body.c3t index 76af6d816..5767d802e 100644 --- a/test/test_suite/macros/macro_with_body.c3t +++ b/test/test_suite/macros/macro_with_body.c3t @@ -45,7 +45,8 @@ fn void main() /* #expect: withbody.ll -define i32 @withbody.Foo__mutate(%Foo* %0) + +define i32 @withbody.Foo__mutate(%Foo* %0) #0 { entry: %foo = alloca %Foo*, align 8 store %Foo* %0, %Foo** %foo, align 8 @@ -57,9 +58,10 @@ entry: store i32 %add, i32* %3, align 8 %mul = mul i32 10, %add ret i32 %mul +} - -define void @main() +define void @main() #0 { +entry: %f = alloca %Foo, align 4 %y = alloca i32, align 4 %foo = alloca %Foo, align 4 @@ -85,28 +87,25 @@ define void @main() %8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str, i32 0, i32 0), i32 %6, i32 %7) store i32 10, i32* %times, align 4 store i32 0, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %9 = load i32, i32* %i, align 4 %10 = load i32, i32* %times, align 4 %lt = icmp slt i32 %9, %10 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %11 = load i32, i32* %i, align 4 %add = add i32 %11, 1 store i32 %add, i32* %loop, align 4 %12 = load i32, i32* %loop, align 4 %13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), i32 %12) - br label %for.inc - -for.inc: ; preds = %for.body %14 = load i32, i32* %i, align 4 %add1 = add i32 %14, 1 store i32 %add1, i32* %i, align 4 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond ret void } diff --git a/test/test_suite/macros/userland_bitcast.c3t b/test/test_suite/macros/userland_bitcast.c3t index ce085654d..92b7945e0 100644 --- a/test/test_suite/macros/userland_bitcast.c3t +++ b/test/test_suite/macros/userland_bitcast.c3t @@ -112,14 +112,14 @@ entry: %ptrptr2 = bitcast i64* %x1 to i16* store i16* %ptrptr2, i16** %to, align 8 store i64 0, i64* %i, align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %9 = load i64, i64* %i, align 8 %lt = icmp ult i64 %9, 8 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %10 = load i16*, i16** %to, align 8 %11 = load i64, i64* %i, align 8 %ptroffset = getelementptr inbounds i16, i16* %10, i64 %11 @@ -128,15 +128,12 @@ for.body: ; preds = %for.cond %ptroffset3 = getelementptr inbounds i16, i16* %12, i64 %13 %14 = load i16, i16* %ptroffset3, align 2 store i16 %14, i16* %ptroffset, align 2 - br label %for.inc - -for.inc: ; preds = %for.body %15 = load i64, i64* %i, align 8 %add = add i64 %15, 2 store i64 %add, i64* %i, align 8 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond %16 = load i64, i64* %x1, align 8 ret i64 %16 } @@ -159,14 +156,14 @@ entry: %ptrptr2 = bitcast [4 x i8]* %x1 to i8* store i8* %ptrptr2, i8** %to, align 8 store i64 0, i64* %i, align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %2 = load i64, i64* %i, align 8 %lt = icmp ult i64 %2, 4 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %3 = load i8*, i8** %to, align 8 %4 = load i64, i64* %i, align 8 %ptroffset = getelementptr inbounds i8, i8* %3, i64 %4 @@ -175,15 +172,12 @@ for.body: ; preds = %for.cond %ptroffset3 = getelementptr inbounds i8, i8* %5, i64 %6 %7 = load i8, i8* %ptroffset3, align 1 store i8 %7, i8* %ptroffset, align 1 - br label %for.inc - -for.inc: ; preds = %for.body %8 = load i64, i64* %i, align 8 %add = add i64 %8, 1 store i64 %add, i64* %i, align 8 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond %9 = bitcast i32* %tempcoerce to i8* %10 = bitcast [4 x i8]* %x1 to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %9, i8* align 1 %10, i32 4, i1 false) @@ -209,17 +203,17 @@ entry: %i8 = alloca i64, align 8 %d = alloca double, align 8 %l = alloca i64, align 8 - %expr18 = alloca double, align 8 - %x19 = alloca i64, align 8 - %b20 = alloca i64*, align 8 - %to22 = alloca i64*, align 8 - %i23 = alloca i64, align 8 + %expr17 = alloca double, align 8 + %x18 = alloca i64, align 8 + %b19 = alloca i64*, align 8 + %to21 = alloca i64*, align 8 + %i22 = alloca i64, align 8 %d2 = alloca double, align 8 - %expr32 = alloca double, align 8 - %x33 = alloca double, align 8 - %b34 = alloca i64*, align 8 - %to36 = alloca i64*, align 8 - %i38 = alloca i64, align 8 + %expr30 = alloca double, align 8 + %x31 = alloca double, align 8 + %b32 = alloca i64*, align 8 + %to34 = alloca i64*, align 8 + %i36 = alloca i64, align 8 store float 0x4028B4BC60000000, float* %f, align 4 %0 = load float, float* %f, align 4 store float %0, float* %expr, align 4 @@ -227,14 +221,14 @@ entry: store i32* %ptrptr, i32** %b, align 8 store i32* %x, i32** %to, align 8 store i64 0, i64* %i1, align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %1 = load i64, i64* %i1, align 8 %lt = icmp ult i64 %1, 4 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %2 = load i32*, i32** %to, align 8 %3 = load i64, i64* %i1, align 8 %ptroffset = getelementptr inbounds i32, i32* %2, i64 %3 @@ -243,15 +237,12 @@ for.body: ; preds = %for.cond %ptroffset2 = getelementptr inbounds i32, i32* %4, i64 %5 %6 = load i32, i32* %ptroffset2, align 4 store i32 %6, i32* %ptroffset, align 4 - br label %for.inc - -for.inc: ; preds = %for.body %7 = load i64, i64* %i1, align 8 %add = add i64 %7, 4 store i64 %add, i64* %i1, align 8 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond %8 = load i32, i32* %x, align 4 store i32 %8, i32* %i, align 4 %9 = load i32, i32* %i, align 4 @@ -260,14 +251,14 @@ for.exit: ; preds = %for.cond %ptrptr7 = bitcast float* %x4 to i32* store i32* %ptrptr7, i32** %to6, align 8 store i64 0, i64* %i8, align 8 - br label %for.cond9 + br label %loop.cond9 -for.cond9: ; preds = %for.inc14, %for.exit +loop.cond9: ; preds = %loop.body11, %loop.exit %10 = load i64, i64* %i8, align 8 %lt10 = icmp ult i64 %10, 4 - br i1 %lt10, label %for.body11, label %for.exit16 + br i1 %lt10, label %loop.body11, label %loop.exit15 -for.body11: ; preds = %for.cond9 +loop.body11: ; preds = %loop.cond9 %11 = load i32*, i32** %to6, align 8 %12 = load i64, i64* %i8, align 8 %ptroffset12 = getelementptr inbounds i32, i32* %11, i64 %12 @@ -276,90 +267,81 @@ for.body11: ; preds = %for.cond9 %ptroffset13 = getelementptr inbounds i32, i32* %13, i64 %14 %15 = load i32, i32* %ptroffset13, align 4 store i32 %15, i32* %ptroffset12, align 4 - br label %for.inc14 - -for.inc14: ; preds = %for.body11 %16 = load i64, i64* %i8, align 8 - %add15 = add i64 %16, 4 - store i64 %add15, i64* %i8, align 8 - br label %for.cond9 + %add14 = add i64 %16, 4 + store i64 %add14, i64* %i8, align 8 + br label %loop.cond9 -for.exit16: ; preds = %for.cond9 +loop.exit15: ; preds = %loop.cond9 %17 = load float, float* %x4, align 4 store float %17, float* %f2, align 4 %18 = load float, float* %f, align 4 %fpfpext = fpext float %18 to double %19 = load i32, i32* %i, align 4 %20 = load float, float* %f2, align 4 - %fpfpext17 = fpext float %20 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i32 0, i32 0), double %fpfpext, i32 %19, double %fpfpext17) + %fpfpext16 = fpext float %20 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i32 0, i32 0), double %fpfpext, i32 %19, double %fpfpext16) store double 1.235300e+268, double* %d, align 8 %21 = load double, double* %d, align 8 - store double %21, double* %expr18, align 8 - %ptrptr21 = bitcast double* %expr18 to i64* - store i64* %ptrptr21, i64** %b20, align 8 - store i64* %x19, i64** %to22, align 8 - store i64 0, i64* %i23, align 8 - br label %for.cond24 + store double %21, double* %expr17, align 8 + %ptrptr20 = bitcast double* %expr17 to i64* + store i64* %ptrptr20, i64** %b19, align 8 + store i64* %x18, i64** %to21, align 8 + store i64 0, i64* %i22, align 8 + br label %loop.cond23 -for.cond24: ; preds = %for.inc29, %for.exit16 - %22 = load i64, i64* %i23, align 8 - %lt25 = icmp ult i64 %22, 8 - br i1 %lt25, label %for.body26, label %for.exit31 +loop.cond23: ; preds = %loop.body25, %loop.exit15 + %22 = load i64, i64* %i22, align 8 + %lt24 = icmp ult i64 %22, 8 + br i1 %lt24, label %loop.body25, label %loop.exit29 -for.body26: ; preds = %for.cond24 - %23 = load i64*, i64** %to22, align 8 - %24 = load i64, i64* %i23, align 8 - %ptroffset27 = getelementptr inbounds i64, i64* %23, i64 %24 - %25 = load i64*, i64** %b20, align 8 - %26 = load i64, i64* %i23, align 8 - %ptroffset28 = getelementptr inbounds i64, i64* %25, i64 %26 - %27 = load i64, i64* %ptroffset28, align 8 - store i64 %27, i64* %ptroffset27, align 8 - br label %for.inc29 +loop.body25: ; preds = %loop.cond23 + %23 = load i64*, i64** %to21, align 8 + %24 = load i64, i64* %i22, align 8 + %ptroffset26 = getelementptr inbounds i64, i64* %23, i64 %24 + %25 = load i64*, i64** %b19, align 8 + %26 = load i64, i64* %i22, align 8 + %ptroffset27 = getelementptr inbounds i64, i64* %25, i64 %26 + %27 = load i64, i64* %ptroffset27, align 8 + store i64 %27, i64* %ptroffset26, align 8 + %28 = load i64, i64* %i22, align 8 + %add28 = add i64 %28, 8 + store i64 %add28, i64* %i22, align 8 + br label %loop.cond23 -for.inc29: ; preds = %for.body26 - %28 = load i64, i64* %i23, align 8 - %add30 = add i64 %28, 8 - store i64 %add30, i64* %i23, align 8 - br label %for.cond24 - -for.exit31: ; preds = %for.cond24 - %29 = load i64, i64* %x19, align 8 +loop.exit29: ; preds = %loop.cond23 + %29 = load i64, i64* %x18, align 8 store i64 %29, i64* %l, align 8 %30 = load double, double* %d, align 8 - store double %30, double* %expr32, align 8 - %ptrptr35 = bitcast double* %expr32 to i64* - store i64* %ptrptr35, i64** %b34, align 8 - %ptrptr37 = bitcast double* %x33 to i64* - store i64* %ptrptr37, i64** %to36, align 8 - store i64 0, i64* %i38, align 8 - br label %for.cond39 + store double %30, double* %expr30, align 8 + %ptrptr33 = bitcast double* %expr30 to i64* + store i64* %ptrptr33, i64** %b32, align 8 + %ptrptr35 = bitcast double* %x31 to i64* + store i64* %ptrptr35, i64** %to34, align 8 + store i64 0, i64* %i36, align 8 + br label %loop.cond37 -for.cond39: ; preds = %for.inc44, %for.exit31 - %31 = load i64, i64* %i38, align 8 - %lt40 = icmp ult i64 %31, 8 - br i1 %lt40, label %for.body41, label %for.exit46 +loop.cond37: ; preds = %loop.body39, %loop.exit29 + %31 = load i64, i64* %i36, align 8 + %lt38 = icmp ult i64 %31, 8 + br i1 %lt38, label %loop.body39, label %loop.exit43 -for.body41: ; preds = %for.cond39 - %32 = load i64*, i64** %to36, align 8 - %33 = load i64, i64* %i38, align 8 - %ptroffset42 = getelementptr inbounds i64, i64* %32, i64 %33 - %34 = load i64*, i64** %b34, align 8 - %35 = load i64, i64* %i38, align 8 - %ptroffset43 = getelementptr inbounds i64, i64* %34, i64 %35 - %36 = load i64, i64* %ptroffset43, align 8 - store i64 %36, i64* %ptroffset42, align 8 - br label %for.inc44 +loop.body39: ; preds = %loop.cond37 + %32 = load i64*, i64** %to34, align 8 + %33 = load i64, i64* %i36, align 8 + %ptroffset40 = getelementptr inbounds i64, i64* %32, i64 %33 + %34 = load i64*, i64** %b32, align 8 + %35 = load i64, i64* %i36, align 8 + %ptroffset41 = getelementptr inbounds i64, i64* %34, i64 %35 + %36 = load i64, i64* %ptroffset41, align 8 + store i64 %36, i64* %ptroffset40, align 8 + %37 = load i64, i64* %i36, align 8 + %add42 = add i64 %37, 8 + store i64 %add42, i64* %i36, align 8 + br label %loop.cond37 -for.inc44: ; preds = %for.body41 - %37 = load i64, i64* %i38, align 8 - %add45 = add i64 %37, 8 - store i64 %add45, i64* %i38, align 8 - br label %for.cond39 - -for.exit46: ; preds = %for.cond39 - %38 = load double, double* %x33, align 8 +loop.exit43: ; preds = %loop.cond37 + %38 = load double, double* %x31, align 8 store double %38, double* %d2, align 8 %39 = load double, double* %d, align 8 %40 = load i64, i64* %l, align 8 diff --git a/test/test_suite/slices/slice_assign.c3t b/test/test_suite/slices/slice_assign.c3t index fffa98bed..0ac292681 100644 --- a/test/test_suite/slices/slice_assign.c3t +++ b/test/test_suite/slices/slice_assign.c3t @@ -44,28 +44,27 @@ entry: %7 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 7 store i32 52, i32* %7, align 4 store i64 0, i64* %"__idx$", align 8 - br label %for.cond -for.cond: ; preds = %for.inc, %entry + br label %loop.cond + +loop.cond: ; preds = %loop.body, %entry %8 = load i64, i64* %"__idx$", align 8 %gt = icmp ugt i64 8, %8 - br i1 %gt, label %for.body, label %for.exit -for.body: ; preds = %for.cond + br i1 %gt, label %loop.body, label %loop.exit +loop.body: ; preds = %loop.cond %9 = load i64, i64* %"__idx$", align 8 %10 = getelementptr inbounds [8 x i32], [8 x i32]* %x, i64 0, i64 %9 %11 = load i32, i32* %10, align 4 store i32 %11, i32* %i, align 4 %12 = load i32, i32* %i, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %12) - br label %for.inc -for.inc: ; preds = %for.body %13 = load i64, i64* %"__idx$", align 8 %add = add i64 %13, 1 store i64 %add, i64* %"__idx$", align 8 - br label %for.cond -for.exit: ; preds = %for.cond + br label %loop.cond +loop.exit: ; preds = %loop.cond br label %cond -cond: ; preds = %assign, %for.exit - %14 = phi i64 [ 0, %for.exit ], [ %add1, %assign ] +cond: ; preds = %assign, %loop.exit + %14 = phi i64 [ 0, %loop.exit ], [ %add1, %assign ] %le = icmp sle i64 %14, 7 br i1 %le, label %assign, label %exit assign: ; preds = %cond diff --git a/test/test_suite/statements/custom_foreach_with_ref.c3t b/test/test_suite/statements/custom_foreach_with_ref.c3t index 1c6891bd2..b769e78c6 100644 --- a/test/test_suite/statements/custom_foreach_with_ref.c3t +++ b/test/test_suite/statements/custom_foreach_with_ref.c3t @@ -85,7 +85,6 @@ fn void main() %Foo = type { [3 x i32] } - @Foo = linkonce_odr constant i8 1 @.str = private constant [11 x i8] c"getFields\0A\00", align 1 @.str.1 = private constant [11 x i8] c"Call made\0A\00", align 1 @@ -102,10 +101,8 @@ fn void main() @.str.11 = private constant [27 x i8] c"Pull value tempptr %d: %d\0A\00", align 1 @.str.12 = private constant [7 x i8] c"%d %d\0A\00", align 1 @.str.13 = private constant [7 x i8] c"%d %d\0A\00", align 1 - ; Function Attrs: nounwind declare void @printf(i8*, ...) #0 - ; Function Attrs: nounwind define void @foo.getFields([5 x i32]* sret([5 x i32]) align 4 %0) #0 { entry: @@ -126,7 +123,6 @@ entry: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %6, i8* align 4 %7, i32 20, i1 false) ret void } - ; Function Attrs: nounwind define %Foo* @foo.call(%Foo* %0) #0 { entry: @@ -136,7 +132,6 @@ entry: %1 = load %Foo*, %Foo** %f, align 8 ret %Foo* %1 } - ; Function Attrs: nounwind define void @main() #0 { entry: @@ -155,41 +150,41 @@ entry: %i12 = alloca i32, align 4 %y13 = alloca i32*, align 8 %a14 = alloca i32, align 4 - %"__idx$20" = alloca i32, align 4 - %"__len$21" = alloca i32, align 4 - %i25 = alloca i32, align 4 - %y26 = alloca i32, align 4 - %a27 = alloca i32, align 4 - %"__idx$32" = alloca i32, align 4 - %"__len$33" = alloca i32, align 4 - %i37 = alloca i32, align 4 - %y38 = alloca i32, align 4 - %a39 = alloca i32, align 4 - %"__idx$44" = alloca i32, align 4 - %"__len$45" = alloca i32, align 4 - %i49 = alloca i32, align 4 - %y50 = alloca i32, align 4 - %a51 = alloca i32, align 4 - %"__idx$57" = alloca i64, align 8 - %"__enum$58" = alloca [5 x i32], align 16 - %i61 = alloca i64, align 8 - %y62 = alloca i32, align 4 - %"__idx$67" = alloca i64, align 8 - %"__enum$68" = alloca [5 x i32], align 16 + %"__idx$19" = alloca i32, align 4 + %"__len$20" = alloca i32, align 4 + %i24 = alloca i32, align 4 + %y25 = alloca i32, align 4 + %a26 = alloca i32, align 4 + %"__idx$30" = alloca i32, align 4 + %"__len$31" = alloca i32, align 4 + %i35 = alloca i32, align 4 + %y36 = alloca i32, align 4 + %a37 = alloca i32, align 4 + %"__idx$41" = alloca i32, align 4 + %"__len$42" = alloca i32, align 4 + %i46 = alloca i32, align 4 + %y47 = alloca i32, align 4 + %a48 = alloca i32, align 4 + %"__idx$53" = alloca i64, align 8 + %"__enum$54" = alloca [5 x i32], align 16 + %i57 = alloca i64, align 8 + %y58 = alloca i32, align 4 + %"__idx$62" = alloca i64, align 8 + %"__enum$63" = alloca [5 x i32], align 16 %sretparam = alloca [5 x i32], align 4 - %i72 = alloca i64, align 8 - %y73 = alloca i32, align 4 - %"__idx$77" = alloca i64, align 8 - %"__enum$78" = alloca [5 x i32]*, align 8 - %sretparam79 = alloca [5 x i32], align 4 - %i83 = alloca i64, align 8 - %y84 = alloca i32, align 4 - %a88 = alloca i32, align 4 - %a90 = alloca i32, align 4 - %y92 = alloca i32*, align 8 - %a93 = alloca i32, align 4 - %a96 = alloca i32, align 4 - %a98 = alloca i32, align 4 + %i67 = alloca i64, align 8 + %y68 = alloca i32, align 4 + %"__idx$71" = alloca i64, align 8 + %"__enum$72" = alloca [5 x i32]*, align 8 + %sretparam73 = alloca [5 x i32], align 4 + %i77 = alloca i64, align 8 + %y78 = alloca i32, align 4 + %a81 = alloca i32, align 4 + %a83 = alloca i32, align 4 + %y85 = alloca i32*, align 8 + %a86 = alloca i32, align 4 + %a89 = alloca i32, align 4 + %a91 = alloca i32, align 4 %0 = bitcast %Foo* %x to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast (%Foo* @.__const to i8*), i32 12, i1 false) store i32 0, i32* %a, align 4 @@ -215,15 +210,13 @@ entry: %13 = call %Foo* @foo.call(%Foo* %x) store %Foo* %13, %Foo** %"__enum$", align 8 store i32 3, i32* %"__len$", align 4 - br label %for.cond - -for.cond: ; preds = %for.inc, %entry + br label %loop.cond +loop.cond: ; preds = %loop.body, %entry %14 = load i32, i32* %"__idx$", align 4 %15 = load i32, i32* %"__len$", align 4 %lt = icmp slt i32 %14, %15 - br i1 %lt, label %for.body, label %for.exit - -for.body: ; preds = %for.cond + br i1 %lt, label %loop.body, label %loop.exit +loop.body: ; preds = %loop.cond %16 = load i32, i32* %"__idx$", align 4 store i32 %16, i32* %i, align 4 %17 = load %Foo*, %Foo** %"__enum$", align 8 @@ -238,26 +231,20 @@ for.body: ; preds = %for.cond %23 = load i32, i32* %i, align 4 %24 = load i32, i32* %y, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i32 0, i32 0), i32 %23, i32 %24) - br label %for.inc - -for.inc: ; preds = %for.body %25 = load i32, i32* %"__idx$", align 4 %add = add i32 %25, 1 store i32 %add, i32* %"__idx$", align 4 - br label %for.cond - -for.exit: ; preds = %for.cond + br label %loop.cond +loop.exit: ; preds = %loop.cond store i32 0, i32* %"__idx$7", align 4 store i32 3, i32* %"__len$8", align 4 - br label %for.cond9 - -for.cond9: ; preds = %for.inc17, %for.exit + br label %loop.cond9 +loop.cond9: ; preds = %loop.body11, %loop.exit %26 = load i32, i32* %"__idx$7", align 4 %27 = load i32, i32* %"__len$8", align 4 %lt10 = icmp slt i32 %26, %27 - br i1 %lt10, label %for.body11, label %for.exit19 - -for.body11: ; preds = %for.cond9 + br i1 %lt10, label %loop.body11, label %loop.exit18 +loop.body11: ; preds = %loop.cond9 %28 = load i32, i32* %"__idx$7", align 4 store i32 %28, i32* %i12, align 4 %29 = load i32, i32* %"__idx$7", align 4 @@ -275,244 +262,204 @@ for.body11: ; preds = %for.cond9 %36 = load i32*, i32** %y13, align 8 %37 = load i32, i32* %36, align 8 call void (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i32 0, i32 0), i32 %35, i32 %37) - br label %for.inc17 - -for.inc17: ; preds = %for.body11 %38 = load i32, i32* %"__idx$7", align 4 - %add18 = add i32 %38, 1 - store i32 %add18, i32* %"__idx$7", align 4 - br label %for.cond9 - -for.exit19: ; preds = %for.cond9 - store i32 0, i32* %"__idx$20", align 4 - store i32 3, i32* %"__len$21", align 4 - br label %for.cond22 - -for.cond22: ; preds = %for.inc29, %for.exit19 - %39 = load i32, i32* %"__idx$20", align 4 - %40 = load i32, i32* %"__len$21", align 4 - %lt23 = icmp slt i32 %39, %40 - br i1 %lt23, label %for.body24, label %for.exit31 - -for.body24: ; preds = %for.cond22 - %41 = load i32, i32* %"__idx$20", align 4 - store i32 %41, i32* %i25, align 4 - %42 = load i32, i32* %"__idx$20", align 4 - store i32 %42, i32* %a27, align 4 + %add17 = add i32 %38, 1 + store i32 %add17, i32* %"__idx$7", align 4 + br label %loop.cond9 +loop.exit18: ; preds = %loop.cond9 + store i32 0, i32* %"__idx$19", align 4 + store i32 3, i32* %"__len$20", align 4 + br label %loop.cond21 +loop.cond21: ; preds = %loop.body23, %loop.exit18 + %39 = load i32, i32* %"__idx$19", align 4 + %40 = load i32, i32* %"__len$20", align 4 + %lt22 = icmp slt i32 %39, %40 + br i1 %lt22, label %loop.body23, label %loop.exit29 +loop.body23: ; preds = %loop.cond21 + %41 = load i32, i32* %"__idx$19", align 4 + store i32 %41, i32* %i24, align 4 + %42 = load i32, i32* %"__idx$19", align 4 + store i32 %42, i32* %a26, align 4 %43 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %44 = load i32, i32* %a27, align 4 - %sisiext28 = sext i32 %44 to i64 - %45 = getelementptr inbounds [3 x i32], [3 x i32]* %43, i64 0, i64 %sisiext28 + %44 = load i32, i32* %a26, align 4 + %sisiext27 = sext i32 %44 to i64 + %45 = getelementptr inbounds [3 x i32], [3 x i32]* %43, i64 0, i64 %sisiext27 %46 = load i32, i32* %45, align 4 - store i32 %46, i32* %y26, align 4 - %47 = load i32, i32* %i25, align 4 - %48 = load i32, i32* %y26, align 4 + store i32 %46, i32* %y25, align 4 + %47 = load i32, i32* %i24, align 4 + %48 = load i32, i32* %y25, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([18 x i8], [18 x i8]* @.str.5, i32 0, i32 0), i32 %47, i32 %48) - br label %for.inc29 - -for.inc29: ; preds = %for.body24 - %49 = load i32, i32* %"__idx$20", align 4 - %add30 = add i32 %49, 1 - store i32 %add30, i32* %"__idx$20", align 4 - br label %for.cond22 - -for.exit31: ; preds = %for.cond22 - store i32 0, i32* %"__idx$32", align 4 - store i32 3, i32* %"__len$33", align 4 - br label %for.cond34 - -for.cond34: ; preds = %for.inc41, %for.exit31 - %50 = load i32, i32* %"__idx$32", align 4 - %51 = load i32, i32* %"__len$33", align 4 - %lt35 = icmp slt i32 %50, %51 - br i1 %lt35, label %for.body36, label %for.exit43 - -for.body36: ; preds = %for.cond34 - %52 = load i32, i32* %"__idx$32", align 4 - store i32 %52, i32* %i37, align 4 - %53 = load i32, i32* %"__idx$32", align 4 - store i32 %53, i32* %a39, align 4 + %49 = load i32, i32* %"__idx$19", align 4 + %add28 = add i32 %49, 1 + store i32 %add28, i32* %"__idx$19", align 4 + br label %loop.cond21 +loop.exit29: ; preds = %loop.cond21 + store i32 0, i32* %"__idx$30", align 4 + store i32 3, i32* %"__len$31", align 4 + br label %loop.cond32 +loop.cond32: ; preds = %loop.body34, %loop.exit29 + %50 = load i32, i32* %"__idx$30", align 4 + %51 = load i32, i32* %"__len$31", align 4 + %lt33 = icmp slt i32 %50, %51 + br i1 %lt33, label %loop.body34, label %loop.exit40 +loop.body34: ; preds = %loop.cond32 + %52 = load i32, i32* %"__idx$30", align 4 + store i32 %52, i32* %i35, align 4 + %53 = load i32, i32* %"__idx$30", align 4 + store i32 %53, i32* %a37, align 4 %54 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %55 = load i32, i32* %a39, align 4 - %sisiext40 = sext i32 %55 to i64 - %56 = getelementptr inbounds [3 x i32], [3 x i32]* %54, i64 0, i64 %sisiext40 + %55 = load i32, i32* %a37, align 4 + %sisiext38 = sext i32 %55 to i64 + %56 = getelementptr inbounds [3 x i32], [3 x i32]* %54, i64 0, i64 %sisiext38 %57 = load i32, i32* %56, align 4 - store i32 %57, i32* %y38, align 4 - %58 = load i32, i32* %i37, align 4 - %59 = load i32, i32* %y38, align 4 + store i32 %57, i32* %y36, align 4 + %58 = load i32, i32* %i35, align 4 + %59 = load i32, i32* %y36, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.6, i32 0, i32 0), i32 %58, i32 %59) - br label %for.inc41 - -for.inc41: ; preds = %for.body36 - %60 = load i32, i32* %"__idx$32", align 4 - %add42 = add i32 %60, 1 - store i32 %add42, i32* %"__idx$32", align 4 - br label %for.cond34 - -for.exit43: ; preds = %for.cond34 - store i32 0, i32* %"__idx$44", align 4 - store i32 3, i32* %"__len$45", align 4 - br label %for.cond46 - -for.cond46: ; preds = %for.inc54, %for.exit43 - %61 = load i32, i32* %"__idx$44", align 4 - %62 = load i32, i32* %"__len$45", align 4 - %lt47 = icmp slt i32 %61, %62 - br i1 %lt47, label %for.body48, label %for.exit56 - -for.body48: ; preds = %for.cond46 - %63 = load i32, i32* %"__idx$44", align 4 - store i32 %63, i32* %i49, align 4 - %64 = load i32, i32* %"__idx$44", align 4 - store i32 %64, i32* %a51, align 4 + %60 = load i32, i32* %"__idx$30", align 4 + %add39 = add i32 %60, 1 + store i32 %add39, i32* %"__idx$30", align 4 + br label %loop.cond32 +loop.exit40: ; preds = %loop.cond32 + store i32 0, i32* %"__idx$41", align 4 + store i32 3, i32* %"__len$42", align 4 + br label %loop.cond43 +loop.cond43: ; preds = %loop.body45, %loop.exit40 + %61 = load i32, i32* %"__idx$41", align 4 + %62 = load i32, i32* %"__len$42", align 4 + %lt44 = icmp slt i32 %61, %62 + br i1 %lt44, label %loop.body45, label %loop.exit52 +loop.body45: ; preds = %loop.cond43 + %63 = load i32, i32* %"__idx$41", align 4 + store i32 %63, i32* %i46, align 4 + %64 = load i32, i32* %"__idx$41", align 4 + store i32 %64, i32* %a48, align 4 %65 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %66 = load i32, i32* %a51, align 4 - %sisiext52 = sext i32 %66 to i64 - %67 = getelementptr inbounds [3 x i32], [3 x i32]* %65, i64 0, i64 %sisiext52 + %66 = load i32, i32* %a48, align 4 + %sisiext49 = sext i32 %66 to i64 + %67 = getelementptr inbounds [3 x i32], [3 x i32]* %65, i64 0, i64 %sisiext49 %68 = load i32, i32* %67, align 4 - store i32 %68, i32* %y50, align 4 - %69 = load i32, i32* %i49, align 4 - %70 = load i32, i32* %y50, align 4 + store i32 %68, i32* %y47, align 4 + %69 = load i32, i32* %i46, align 4 + %70 = load i32, i32* %y47, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.7, i32 0, i32 0), i32 %69, i32 %70) - %71 = load i32, i32* %i49, align 4 - %add53 = add i32 %71, 1 - store i32 %add53, i32* %i49, align 4 - br label %for.inc54 - -for.inc54: ; preds = %for.body48 - %72 = load i32, i32* %"__idx$44", align 4 - %add55 = add i32 %72, 1 - store i32 %add55, i32* %"__idx$44", align 4 - br label %for.cond46 - -for.exit56: ; preds = %for.cond46 - store i64 0, i64* %"__idx$57", align 8 - %73 = bitcast [5 x i32]* %"__enum$58" to i8* + %71 = load i32, i32* %i46, align 4 + %add50 = add i32 %71, 1 + store i32 %add50, i32* %i46, align 4 + %72 = load i32, i32* %"__idx$41", align 4 + %add51 = add i32 %72, 1 + store i32 %add51, i32* %"__idx$41", align 4 + br label %loop.cond43 +loop.exit52: ; preds = %loop.cond43 + store i64 0, i64* %"__idx$53", align 8 + %73 = bitcast [5 x i32]* %"__enum$54" to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %73, i8* align 16 bitcast ([5 x i32]* @.__const.8 to i8*), i32 20, i1 false) - br label %for.cond59 - -for.cond59: ; preds = %for.inc64, %for.exit56 - %74 = load i64, i64* %"__idx$57", align 8 + br label %loop.cond55 +loop.cond55: ; preds = %loop.body56, %loop.exit52 + %74 = load i64, i64* %"__idx$53", align 8 %gt = icmp ugt i64 5, %74 - br i1 %gt, label %for.body60, label %for.exit66 - -for.body60: ; preds = %for.cond59 - %75 = load i64, i64* %"__idx$57", align 8 - store i64 %75, i64* %i61, align 8 - %76 = load i64, i64* %"__idx$57", align 8 - %77 = getelementptr inbounds [5 x i32], [5 x i32]* %"__enum$58", i64 0, i64 %76 + br i1 %gt, label %loop.body56, label %loop.exit61 +loop.body56: ; preds = %loop.cond55 + %75 = load i64, i64* %"__idx$53", align 8 + store i64 %75, i64* %i57, align 8 + %76 = load i64, i64* %"__idx$53", align 8 + %77 = getelementptr inbounds [5 x i32], [5 x i32]* %"__enum$54", i64 0, i64 %76 %78 = load i32, i32* %77, align 4 - store i32 %78, i32* %y62, align 4 - %79 = load i64, i64* %i61, align 8 - %80 = load i32, i32* %y62, align 4 + store i32 %78, i32* %y58, align 4 + %79 = load i64, i64* %i57, align 8 + %80 = load i32, i32* %y58, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.9, i32 0, i32 0), i64 %79, i32 %80) - %81 = load i64, i64* %i61, align 8 - %add63 = add i64 %81, 1 - store i64 %add63, i64* %i61, align 8 - br label %for.inc64 - -for.inc64: ; preds = %for.body60 - %82 = load i64, i64* %"__idx$57", align 8 - %add65 = add i64 %82, 1 - store i64 %add65, i64* %"__idx$57", align 8 - br label %for.cond59 - -for.exit66: ; preds = %for.cond59 - store i64 0, i64* %"__idx$67", align 8 + %81 = load i64, i64* %i57, align 8 + %add59 = add i64 %81, 1 + store i64 %add59, i64* %i57, align 8 + %82 = load i64, i64* %"__idx$53", align 8 + %add60 = add i64 %82, 1 + store i64 %add60, i64* %"__idx$53", align 8 + br label %loop.cond55 +loop.exit61: ; preds = %loop.cond55 + store i64 0, i64* %"__idx$62", align 8 call void @foo.getFields([5 x i32]* sret([5 x i32]) align 4 %sretparam) - %83 = bitcast [5 x i32]* %"__enum$68" to i8* + %83 = bitcast [5 x i32]* %"__enum$63" to i8* %84 = bitcast [5 x i32]* %sretparam to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 16 %83, i8* align 4 %84, i32 20, i1 false) - br label %for.cond69 - -for.cond69: ; preds = %for.inc74, %for.exit66 - %85 = load i64, i64* %"__idx$67", align 8 - %gt70 = icmp ugt i64 5, %85 - br i1 %gt70, label %for.body71, label %for.exit76 - -for.body71: ; preds = %for.cond69 - %86 = load i64, i64* %"__idx$67", align 8 - store i64 %86, i64* %i72, align 8 - %87 = load i64, i64* %"__idx$67", align 8 - %88 = getelementptr inbounds [5 x i32], [5 x i32]* %"__enum$68", i64 0, i64 %87 + br label %loop.cond64 +loop.cond64: ; preds = %loop.body66, %loop.exit61 + %85 = load i64, i64* %"__idx$62", align 8 + %gt65 = icmp ugt i64 5, %85 + br i1 %gt65, label %loop.body66, label %loop.exit70 +loop.body66: ; preds = %loop.cond64 + %86 = load i64, i64* %"__idx$62", align 8 + store i64 %86, i64* %i67, align 8 + %87 = load i64, i64* %"__idx$62", align 8 + %88 = getelementptr inbounds [5 x i32], [5 x i32]* %"__enum$63", i64 0, i64 %87 %89 = load i32, i32* %88, align 4 - store i32 %89, i32* %y73, align 4 - %90 = load i64, i64* %i72, align 8 - %91 = load i32, i32* %y73, align 4 + store i32 %89, i32* %y68, align 4 + %90 = load i64, i64* %i67, align 8 + %91 = load i32, i32* %y68, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.10, i32 0, i32 0), i64 %90, i32 %91) - br label %for.inc74 - -for.inc74: ; preds = %for.body71 - %92 = load i64, i64* %"__idx$67", align 8 - %add75 = add i64 %92, 1 - store i64 %add75, i64* %"__idx$67", align 8 - br label %for.cond69 - -for.exit76: ; preds = %for.cond69 - store i64 0, i64* %"__idx$77", align 8 - call void @foo.getFields([5 x i32]* sret([5 x i32]) align 4 %sretparam79) - store [5 x i32]* %sretparam79, [5 x i32]** %"__enum$78", align 8 - br label %for.cond80 - -for.cond80: ; preds = %for.inc85, %for.exit76 - %93 = load i64, i64* %"__idx$77", align 8 - %gt81 = icmp ugt i64 5, %93 - br i1 %gt81, label %for.body82, label %for.exit87 - -for.body82: ; preds = %for.cond80 - %94 = load i64, i64* %"__idx$77", align 8 - store i64 %94, i64* %i83, align 8 - %95 = load [5 x i32]*, [5 x i32]** %"__enum$78", align 8 - %96 = load i64, i64* %"__idx$77", align 8 + %92 = load i64, i64* %"__idx$62", align 8 + %add69 = add i64 %92, 1 + store i64 %add69, i64* %"__idx$62", align 8 + br label %loop.cond64 +loop.exit70: ; preds = %loop.cond64 + store i64 0, i64* %"__idx$71", align 8 + call void @foo.getFields([5 x i32]* sret([5 x i32]) align 4 %sretparam73) + store [5 x i32]* %sretparam73, [5 x i32]** %"__enum$72", align 8 + br label %loop.cond74 +loop.cond74: ; preds = %loop.body76, %loop.exit70 + %93 = load i64, i64* %"__idx$71", align 8 + %gt75 = icmp ugt i64 5, %93 + br i1 %gt75, label %loop.body76, label %loop.exit80 +loop.body76: ; preds = %loop.cond74 + %94 = load i64, i64* %"__idx$71", align 8 + store i64 %94, i64* %i77, align 8 + %95 = load [5 x i32]*, [5 x i32]** %"__enum$72", align 8 + %96 = load i64, i64* %"__idx$71", align 8 %97 = getelementptr inbounds [5 x i32], [5 x i32]* %95, i64 0, i64 %96 %98 = load i32, i32* %97, align 4 - store i32 %98, i32* %y84, align 4 - %99 = load i64, i64* %i83, align 8 - %100 = load i32, i32* %y84, align 4 + store i32 %98, i32* %y78, align 4 + %99 = load i64, i64* %i77, align 8 + %100 = load i32, i32* %y78, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.11, i32 0, i32 0), i64 %99, i32 %100) - br label %for.inc85 - -for.inc85: ; preds = %for.body82 - %101 = load i64, i64* %"__idx$77", align 8 - %add86 = add i64 %101, 1 - store i64 %add86, i64* %"__idx$77", align 8 - br label %for.cond80 - -for.exit87: ; preds = %for.cond80 - store i32 0, i32* %a88, align 4 + %101 = load i64, i64* %"__idx$71", align 8 + %add79 = add i64 %101, 1 + store i64 %add79, i64* %"__idx$71", align 8 + br label %loop.cond74 +loop.exit80: ; preds = %loop.cond74 + store i32 0, i32* %a81, align 4 %102 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %103 = load i32, i32* %a88, align 4 - %sisiext89 = sext i32 %103 to i64 - %104 = getelementptr inbounds [3 x i32], [3 x i32]* %102, i64 0, i64 %sisiext89 + %103 = load i32, i32* %a81, align 4 + %sisiext82 = sext i32 %103 to i64 + %104 = getelementptr inbounds [3 x i32], [3 x i32]* %102, i64 0, i64 %sisiext82 %105 = load i32, i32* %104, align 4 - store i32 1, i32* %a90, align 4 + store i32 1, i32* %a83, align 4 %106 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %107 = load i32, i32* %a90, align 4 - %sisiext91 = sext i32 %107 to i64 - %108 = getelementptr inbounds [3 x i32], [3 x i32]* %106, i64 0, i64 %sisiext91 + %107 = load i32, i32* %a83, align 4 + %sisiext84 = sext i32 %107 to i64 + %108 = getelementptr inbounds [3 x i32], [3 x i32]* %106, i64 0, i64 %sisiext84 %109 = load i32, i32* %108, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.12, i32 0, i32 0), i32 %105, i32 %109) - store i32 1, i32* %a93, align 4 + store i32 1, i32* %a86, align 4 %110 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %111 = load i32, i32* %a93, align 4 - %sisiext94 = sext i32 %111 to i64 - %112 = getelementptr inbounds [3 x i32], [3 x i32]* %110, i64 0, i64 %sisiext94 - store i32* %112, i32** %y92, align 8 - %113 = load i32*, i32** %y92, align 8 + %111 = load i32, i32* %a86, align 4 + %sisiext87 = sext i32 %111 to i64 + %112 = getelementptr inbounds [3 x i32], [3 x i32]* %110, i64 0, i64 %sisiext87 + store i32* %112, i32** %y85, align 8 + %113 = load i32*, i32** %y85, align 8 %114 = load i32, i32* %113, align 8 - %add95 = add i32 %114, 1 - store i32 %add95, i32* %113, align 8 - store i32 0, i32* %a96, align 4 + %add88 = add i32 %114, 1 + store i32 %add88, i32* %113, align 8 + store i32 0, i32* %a89, align 4 %115 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %116 = load i32, i32* %a96, align 4 - %sisiext97 = sext i32 %116 to i64 - %117 = getelementptr inbounds [3 x i32], [3 x i32]* %115, i64 0, i64 %sisiext97 + %116 = load i32, i32* %a89, align 4 + %sisiext90 = sext i32 %116 to i64 + %117 = getelementptr inbounds [3 x i32], [3 x i32]* %115, i64 0, i64 %sisiext90 %118 = load i32, i32* %117, align 4 - store i32 1, i32* %a98, align 4 + store i32 1, i32* %a91, align 4 %119 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 - %120 = load i32, i32* %a98, align 4 - %sisiext99 = sext i32 %120 to i64 - %121 = getelementptr inbounds [3 x i32], [3 x i32]* %119, i64 0, i64 %sisiext99 + %120 = load i32, i32* %a91, align 4 + %sisiext92 = sext i32 %120 to i64 + %121 = getelementptr inbounds [3 x i32], [3 x i32]* %119, i64 0, i64 %sisiext92 %122 = load i32, i32* %121, align 4 call void (i8*, ...) @printf(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.13, i32 0, i32 0), i32 %118, i32 %122) ret void diff --git a/test/test_suite/statements/defer_break.c3t b/test/test_suite/statements/defer_break.c3t index 6461ebf70..3278bbe20 100644 --- a/test/test_suite/statements/defer_break.c3t +++ b/test/test_suite/statements/defer_break.c3t @@ -46,70 +46,77 @@ fn int main(int argc) return 0; } -// #expect: foo.ll - call void @foo.defer2() - %1 = load i32, i32* %a - %eq = icmp eq i32 %1, 1 - br i1 %eq, label %if.then, label %if.exit -if.then: - br label %exit -if.exit: - call void @foo.defer1() - br label %exit -exit: - br label %while.begin -while.begin: - %2 = load i32, i32* %a - %intbool = icmp ne i32 %2, 0 - br i1 %intbool, label %while.body, label %while.exit -while.body: - %3 = load i32, i32* %argc - %eq1 = icmp eq i32 %3, 1 - br i1 %eq1, label %if.then2, label %if.exit4 -if.then2: - call void @foo.defer4() - br label %exit3 -exit3: - br label %while.exit -if.exit4: - call void @foo.defer6() - call void @foo.defer5() - br label %exit5 -exit5: - call void @foo.defer4() - br label %exit6 -exit6: - br label %while.begin -while.exit: - br label %while.begin7 -while.begin7: - %4 = load i32, i32* %a - %intbool8 = icmp ne i32 %4, 0 - br i1 %intbool8, label %while.body9, label %while.exit18 -while.body9: - %5 = load i32, i32* %argc - %eq10 = icmp eq i32 %5, 1 - br i1 %eq10, label %if.then11, label %if.exit13 -if.then11: - call void @foo.defer8() - br label %exit12 -exit12: - br label %while.exit18 -if.exit13: - call void @foo.defer10() - call void @foo.defer9() - br label %exit14 -exit14: - call void @foo.defer8() - br label %exit15 -exit15: - br label %while.exit18 -while.exit18: - call void @foo.defer7() - br label %exit19 -exit19: - call void @foo.defer3() - br label %exit20 -exit20: - ret i32 0 +/* #expect: foo.ll + +define i32 @main(i32 %0) #0 { +entry: + %argc = alloca i32, align 4 + %a = alloca i32, align 4 + store i32 %0, i32* %argc, align 4 + store i32 0, i32* %a, align 4 + call void @foo.defer2() + %1 = load i32, i32* %a, align 4 + %eq = icmp eq i32 %1, 1 + br i1 %eq, label %if.then, label %if.exit +if.then: ; preds = %entry + br label %exit +if.exit: ; preds = %entry + call void @foo.defer1() + br label %exit +exit: ; preds = %if.exit, %if.then + br label %loop.cond +loop.cond: ; preds = %exit6, %exit + %2 = load i32, i32* %a, align 4 + %intbool = icmp ne i32 %2, 0 + br i1 %intbool, label %loop.body, label %loop.exit +loop.body: ; preds = %loop.cond + %3 = load i32, i32* %argc, align 4 + %eq1 = icmp eq i32 %3, 1 + br i1 %eq1, label %if.then2, label %if.exit4 +if.then2: ; preds = %loop.body + call void @foo.defer4() + br label %exit3 +exit3: ; preds = %if.then2 + br label %loop.exit +if.exit4: ; preds = %loop.body + call void @foo.defer6() + call void @foo.defer5() + br label %exit5 +exit5: ; preds = %if.exit4 + call void @foo.defer4() + br label %exit6 +exit6: ; preds = %exit5 + br label %loop.cond +loop.exit: ; preds = %exit3, %loop.cond + br label %loop.cond7 +loop.cond7: ; preds = %loop.exit + %4 = load i32, i32* %a, align 4 + %intbool8 = icmp ne i32 %4, 0 + br i1 %intbool8, label %loop.body9, label %loop.exit18 +loop.body9: ; preds = %loop.cond7 + %5 = load i32, i32* %argc, align 4 + %eq10 = icmp eq i32 %5, 1 + br i1 %eq10, label %if.then11, label %if.exit13 +if.then11: ; preds = %loop.body9 + call void @foo.defer8() + br label %exit12 +exit12: ; preds = %if.then11 + br label %loop.exit18 +if.exit13: ; preds = %loop.body9 + call void @foo.defer10() + call void @foo.defer9() + br label %exit14 +exit14: ; preds = %if.exit13 + call void @foo.defer8() + br label %exit15 +exit15: ; preds = %exit14 + br label %loop.exit18 +loop.exit18: ; preds = %exit15, %exit12, %loop.cond7 + call void @foo.defer7() + br label %exit19 +exit19: ; preds = %loop.exit18 + call void @foo.defer3() + br label %exit20 +exit20: ; preds = %exit19 + ret i32 0 } \ No newline at end of file diff --git a/test/test_suite/statements/defer_break_simple.c3t b/test/test_suite/statements/defer_break_simple.c3t index bd1fda0d8..91a8ea516 100644 --- a/test/test_suite/statements/defer_break_simple.c3t +++ b/test/test_suite/statements/defer_break_simple.c3t @@ -1,3 +1,4 @@ +// #target: x64-darwin module test; fn void test2() {} @@ -24,35 +25,50 @@ fn int main(int argc) // #expect: test.ll -store i32 0, i32* %a -br label %while.begin -while.begin: - %1 = load i32, i32* %a - %intbool = icmp ne i32 %1, 0 - br i1 %intbool, label %while.body, label %while.exit -while.body: - %2 = load i32, i32* %argc - %eq = icmp eq i32 %2, 1 - br i1 %eq, label %if.then, label %if.exit -if.then: - call void @test.testA() - call void @test.testB() - br label %exit -exit: - call void @test.test2() - br label %exit1 -exit1: - br label %while.exit -if.exit: - call void @test.test3() - call void @test.testA() - call void @test.testB() - br label %exit2 -exit2: - call void @test.test2() - br label %exit3 -exit3: - br label %while.begin -while.exit: - ret i32 0 +define i32 @main(i32 %0) #0 { +entry: + %argc = alloca i32, align 4 + %a = alloca i32, align 4 + store i32 %0, i32* %argc, align 4 + store i32 0, i32* %a, align 4 + br label %loop.cond + +loop.cond: ; preds = %exit3, %entry + %1 = load i32, i32* %a, align 4 + %intbool = icmp ne i32 %1, 0 + br i1 %intbool, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %2 = load i32, i32* %argc, align 4 + %eq = icmp eq i32 %2, 1 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %loop.body + call void @test.testA() + call void @test.testB() + br label %exit + +exit: ; preds = %if.then + call void @test.test2() + br label %exit1 + +exit1: ; preds = %exit + br label %loop.exit + +if.exit: ; preds = %loop.body + call void @test.test3() + call void @test.testA() + call void @test.testB() + br label %exit2 + +exit2: ; preds = %if.exit + call void @test.test2() + br label %exit3 + +exit3: ; preds = %exit2 + br label %loop.cond + +loop.exit: ; preds = %exit1, %loop.cond + ret i32 0 +} diff --git a/test/test_suite/statements/defer_return.c3t b/test/test_suite/statements/defer_return.c3t index 1435ed567..648dbc6b9 100644 --- a/test/test_suite/statements/defer_return.c3t +++ b/test/test_suite/statements/defer_return.c3t @@ -1,3 +1,4 @@ +// #target: x64-darwin module test; fn void test1() {} fn void test2() {} @@ -33,84 +34,113 @@ fn int main(int argc) return 0 + argc; } -// #expect: test.ll +/* #expect: test.ll -while.begin: - %1 = load i32, i32* %a - %intbool = icmp ne i32 %1, 0 - br i1 %intbool, label %while.body, label %while.exit -while.body: - %2 = load i32, i32* %argc - %eq = icmp eq i32 %2, 1 - br i1 %eq, label %if.then, label %if.exit +define i32 @main(i32 %0) #0 { +entry: + %argc = alloca i32, align 4 + %a = alloca i32, align 4 + store i32 %0, i32* %argc, align 4 + store i32 0, i32* %a, align 4 + br label %loop.cond -if.then: - %3 = load i32, i32* %a - %4 = load i32, i32* %argc - %add = add i32 %3, %4 - call void @test.test2() - br label %exit -exit: - call void @test.test1() - br label %exit1 -exit1: - ret i32 %add -if.exit: - call void @test.test4() - call void @test.test3() - br label %exit2 -exit2: - call void @test.test2() - br label %exit3 -exit3: - br label %while.begin -while.exit: - br label %while.begin4 -while.begin4: - %5 = load i32, i32* %a - %intbool5 = icmp ne i32 %5, 0 - br i1 %intbool5, label %while.body6, label %while.exit21 -while.body6: - %6 = load i32, i32* %argc - %eq7 = icmp eq i32 %6, 1 - br i1 %eq7, label %if.then8, label %if.exit13 -if.then8: - %7 = load i32, i32* %a - %add9 = add i32 %7, 2 - call void @test.test6() - br label %exit10 -exit10: - call void @test.test5() - br label %exit11 -exit11: - call void @test.test1() - br label %exit12 -exit12: - ret i32 %add9 -if.exit13: - call void @test.test8() - call void @test.test7() - br label %exit14 -exit14: - call void @test.test6() - br label %exit15 -exit15: - call void @test.test5() - br label %exit16 -exit16: - call void @test.test1() - br label %exit17 -exit17: - ret i32 4 -while.exit21: - %8 = load i32, i32* %argc - %add22 = add i32 0, %8 - call void @test.test5() - br label %exit23 -exit23: - call void @test.test1() - br label %exit24 -exit24: - ret i32 %add22 +loop.cond: ; preds = %exit3, %entry + %1 = load i32, i32* %a, align 4 + %intbool = icmp ne i32 %1, 0 + br i1 %intbool, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond + %2 = load i32, i32* %argc, align 4 + %eq = icmp eq i32 %2, 1 + br i1 %eq, label %if.then, label %if.exit + +if.then: ; preds = %loop.body + %3 = load i32, i32* %a, align 4 + %4 = load i32, i32* %argc, align 4 + %add = add i32 %3, %4 + call void @test.test2() + br label %exit + +exit: ; preds = %if.then + call void @test.test1() + br label %exit1 + +exit1: ; preds = %exit + ret i32 %add + +if.exit: ; preds = %loop.body + call void @test.test4() + call void @test.test3() + br label %exit2 + +exit2: ; preds = %if.exit + call void @test.test2() + br label %exit3 + +exit3: ; preds = %exit2 + br label %loop.cond + +loop.exit: ; preds = %loop.cond + br label %loop.cond4 + +loop.cond4: ; preds = %loop.exit + %5 = load i32, i32* %a, align 4 + %intbool5 = icmp ne i32 %5, 0 + br i1 %intbool5, label %loop.body6, label %loop.exit21 + +loop.body6: ; preds = %loop.cond4 + %6 = load i32, i32* %argc, align 4 + %eq7 = icmp eq i32 %6, 1 + br i1 %eq7, label %if.then8, label %if.exit13 + +if.then8: ; preds = %loop.body6 + %7 = load i32, i32* %a, align 4 + %add9 = add i32 %7, 2 + call void @test.test6() + br label %exit10 + +exit10: ; preds = %if.then8 + call void @test.test5() + br label %exit11 + +exit11: ; preds = %exit10 + call void @test.test1() + br label %exit12 + +exit12: ; preds = %exit11 + ret i32 %add9 + +if.exit13: ; preds = %loop.body6 + call void @test.test8() + call void @test.test7() + br label %exit14 + +exit14: ; preds = %if.exit13 + call void @test.test6() + br label %exit15 + +exit15: ; preds = %exit14 + call void @test.test5() + br label %exit16 + +exit16: ; preds = %exit15 + call void @test.test1() + br label %exit17 + +exit17: ; preds = %exit16 + ret i32 4 + +loop.exit21: ; preds = %loop.cond4 + %8 = load i32, i32* %argc, align 4 + %add22 = add i32 0, %8 + call void @test.test5() + br label %exit23 + +exit23: ; preds = %loop.exit21 + call void @test.test1() + br label %exit24 + +exit24: ; preds = %exit23 + ret i32 %add22 } diff --git a/test/test_suite/statements/fallthough_do.c3t b/test/test_suite/statements/fallthough_do.c3t new file mode 100644 index 000000000..e0d175dbf --- /dev/null +++ b/test/test_suite/statements/fallthough_do.c3t @@ -0,0 +1,75 @@ +// #target: x64-darwin + +module foo; +fn int test() +{ + static int x = 0; + return 1 + x++; +} + +extern fn void printf(char*, ...); + +fn void main() +{ + int i = 10; + do + { + printf("%d\n", test()); + } while (false); + do + { + printf("%d, %d\n", i, test()); + }; + do + { + if (i < 0) continue; + printf("A\n", i, test()); + }; + do + { + if (i < 0) break; + printf("B\n", i, test()); + }; + +} + +/* #expect: foo.ll + + +@test.x = hidden global i32 0, align 4 +@.str = private constant [4 x i8] c"%d\0A\00", align 1 +@.str.1 = private constant [8 x i8] c"%d, %d\0A\00", align 1 + +define void @main() #0 { +entry: + %i = alloca i32, align 4 + store i32 10, i32* %i, align 4 + %0 = call i32 @foo.test() + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %0) + %1 = load i32, i32* %i, align 4 + %2 = call i32 @foo.test() + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %1, i32 %2) + %3 = load i32, i32* %i, align 4 + %lt = icmp slt i32 %3, 0 + br i1 %lt, label %if.then, label %if.exit +if.then: ; preds = %entry + br label %loop.exit +if.exit: ; preds = %entry + %4 = load i32, i32* %i, align 4 + %5 = call i32 @foo.test() + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i32 0, i32 0), i32 %4, i32 %5) + br label %loop.exit +loop.exit: ; preds = %if.exit, %if.then + %6 = load i32, i32* %i, align 4 + %lt1 = icmp slt i32 %6, 0 + br i1 %lt1, label %if.then2, label %if.exit3 +if.then2: ; preds = %loop.exit + br label %loop.exit4 +if.exit3: ; preds = %loop.exit + %7 = load i32, i32* %i, align 4 + %8 = call i32 @foo.test() + call void (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.3, i32 0, i32 0), i32 %7, i32 %8) + br label %loop.exit4 +loop.exit4: ; preds = %if.exit3, %if.then2 + ret void +} diff --git a/test/test_suite/statements/for_errors.c3 b/test/test_suite/statements/for_errors.c3 index 5da7a96e1..c013a65bc 100644 --- a/test/test_suite/statements/for_errors.c3 +++ b/test/test_suite/statements/for_errors.c3 @@ -2,6 +2,6 @@ fn void foo() {} fn int main() { - for (; foo() ; ) {} // #error: 'void' into 'bool' + for (; foo() ; ) {} // #error: Expected a boolean expression return 0; } \ No newline at end of file diff --git a/test/test_suite/statements/foreach_break.c3t b/test/test_suite/statements/foreach_break.c3t index 0703d737a..9844380d0 100644 --- a/test/test_suite/statements/foreach_break.c3t +++ b/test/test_suite/statements/foreach_break.c3t @@ -29,14 +29,14 @@ entry: store i32 0, i32* %2, align 4 store i32 0, i32* %g, align 4 store i64 0, i64* %"__idx$", align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.inc, %entry %3 = load i64, i64* %"__idx$", align 8 %gt = icmp ugt i64 3, %3 - br i1 %gt, label %for.body, label %for.exit + br i1 %gt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %4 = load i64, i64* %"__idx$", align 8 %5 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 %4 %6 = load i32, i32* %5, align 4 @@ -45,30 +45,30 @@ for.body: ; preds = %for.cond %gt1 = icmp sgt i32 %7, 0 br i1 %gt1, label %if.then, label %if.exit -if.then: ; preds = %for.body - br label %for.exit +if.then: ; preds = %loop.body + br label %loop.exit -if.exit: ; preds = %for.body +if.exit: ; preds = %loop.body %8 = load i32, i32* %z, align 4 %eq = icmp eq i32 %8, 1 br i1 %eq, label %if.then2, label %if.exit3 if.then2: ; preds = %if.exit - br label %for.inc + br label %loop.inc if.exit3: ; preds = %if.exit %9 = load i32, i32* %g, align 4 %10 = load i32, i32* %z, align 4 %add = add i32 %9, %10 store i32 %add, i32* %g, align 4 - br label %for.inc + br label %loop.inc -for.inc: ; preds = %if.exit3, %if.then2 +loop.inc: ; preds = %if.exit3, %if.then2 %11 = load i64, i64* %"__idx$", align 8 %add4 = add i64 %11, 1 store i64 %add4, i64* %"__idx$", align 8 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %if.then, %for.cond +loop.exit: ; preds = %if.then, %loop.cond ret void } \ No newline at end of file diff --git a/test/test_suite/statements/foreach_common.c3t b/test/test_suite/statements/foreach_common.c3t index 33595c4c9..6711e80df 100644 --- a/test/test_suite/statements/foreach_common.c3t +++ b/test/test_suite/statements/foreach_common.c3t @@ -41,27 +41,27 @@ entry: %a = alloca float, align 4 %"__idx$1" = alloca i64, align 8 %a5 = alloca float*, align 8 - %"__idx$10" = alloca i64, align 8 - %a14 = alloca i8*, align 8 - %"__idx$20" = alloca i64, align 8 + %"__idx$9" = alloca i64, align 8 + %a13 = alloca i8*, align 8 + %"__idx$18" = alloca i64, align 8 %i = alloca i64, align 8 - %a24 = alloca float, align 4 - %"__idx$29" = alloca i64, align 8 - %i33 = alloca i8, align 1 - %a34 = alloca double, align 8 - %"__idx$39" = alloca i64, align 8 - %a43 = alloca double, align 8 + %a22 = alloca float, align 4 + %"__idx$26" = alloca i64, align 8 + %i30 = alloca i8, align 1 + %a31 = alloca double, align 8 + %"__idx$35" = alloca i64, align 8 + %a39 = alloca double, align 8 %0 = bitcast [3 x float]* %foo to i8* call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %0, i8* align 4 bitcast ([3 x float]* @.__const to i8*), i32 12, i1 false) store i64 0, i64* %"__idx$", align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %for.inc, %entry +loop.cond: ; preds = %loop.body, %entry %1 = load i64, i64* %"__idx$", align 8 %gt = icmp ugt i64 3, %1 - br i1 %gt, label %for.body, label %for.exit + br i1 %gt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %2 = load i64, i64* %"__idx$", align 8 %3 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %2 %4 = load float, float* %3, align 4 @@ -69,24 +69,21 @@ for.body: ; preds = %for.cond %5 = load float, float* %a, align 4 %fpfpext = fpext float %5 to double call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0), double %fpfpext) - br label %for.inc - -for.inc: ; preds = %for.body %6 = load i64, i64* %"__idx$", align 8 %add = add i64 %6, 1 store i64 %add, i64* %"__idx$", align 8 - br label %for.cond + br label %loop.cond -for.exit: ; preds = %for.cond +loop.exit: ; preds = %loop.cond store i64 0, i64* %"__idx$1", align 8 - br label %for.cond2 + br label %loop.cond2 -for.cond2: ; preds = %for.inc7, %for.exit +loop.cond2: ; preds = %loop.body4, %loop.exit %7 = load i64, i64* %"__idx$1", align 8 %gt3 = icmp ugt i64 3, %7 - br i1 %gt3, label %for.body4, label %for.exit9 + br i1 %gt3, label %loop.body4, label %loop.exit8 -for.body4: ; preds = %for.cond2 +loop.body4: ; preds = %loop.cond2 %8 = load i64, i64* %"__idx$1", align 8 %9 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %8 store float* %9, float** %a5, align 8 @@ -98,124 +95,109 @@ for.body4: ; preds = %for.cond2 %13 = load float, float* %12, align 8 %fpfpext6 = fpext float %13 to double call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i32 0, i32 0), double %fpfpext6) - br label %for.inc7 - -for.inc7: ; preds = %for.body4 %14 = load i64, i64* %"__idx$1", align 8 - %add8 = add i64 %14, 1 - store i64 %add8, i64* %"__idx$1", align 8 - br label %for.cond2 + %add7 = add i64 %14, 1 + store i64 %add7, i64* %"__idx$1", align 8 + br label %loop.cond2 -for.exit9: ; preds = %for.cond2 - store i64 0, i64* %"__idx$10", align 8 - br label %for.cond11 +loop.exit8: ; preds = %loop.cond2 + store i64 0, i64* %"__idx$9", align 8 + br label %loop.cond10 -for.cond11: ; preds = %for.inc17, %for.exit9 - %15 = load i64, i64* %"__idx$10", align 8 - %gt12 = icmp ugt i64 3, %15 - br i1 %gt12, label %for.body13, label %for.exit19 +loop.cond10: ; preds = %loop.body12, %loop.exit8 + %15 = load i64, i64* %"__idx$9", align 8 + %gt11 = icmp ugt i64 3, %15 + br i1 %gt11, label %loop.body12, label %loop.exit17 -for.body13: ; preds = %for.cond11 - %16 = load i64, i64* %"__idx$10", align 8 +loop.body12: ; preds = %loop.cond10 + %16 = load i64, i64* %"__idx$9", align 8 %17 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %16 %ptrptr = bitcast float* %17 to i8* - store i8* %ptrptr, i8** %a14, align 8 - %18 = load i8*, i8** %a14, align 8 - %ptrptr15 = bitcast i8* %18 to float* - %19 = load float, float* %ptrptr15, align 8 - %fpfpext16 = fpext float %19 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), double %fpfpext16) - br label %for.inc17 + store i8* %ptrptr, i8** %a13, align 8 + %18 = load i8*, i8** %a13, align 8 + %ptrptr14 = bitcast i8* %18 to float* + %19 = load float, float* %ptrptr14, align 8 + %fpfpext15 = fpext float %19 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i32 0, i32 0), double %fpfpext15) + %20 = load i64, i64* %"__idx$9", align 8 + %add16 = add i64 %20, 1 + store i64 %add16, i64* %"__idx$9", align 8 + br label %loop.cond10 -for.inc17: ; preds = %for.body13 - %20 = load i64, i64* %"__idx$10", align 8 - %add18 = add i64 %20, 1 - store i64 %add18, i64* %"__idx$10", align 8 - br label %for.cond11 +loop.exit17: ; preds = %loop.cond10 + store i64 0, i64* %"__idx$18", align 8 + br label %loop.cond19 -for.exit19: ; preds = %for.cond11 - store i64 0, i64* %"__idx$20", align 8 - br label %for.cond21 +loop.cond19: ; preds = %loop.body21, %loop.exit17 + %21 = load i64, i64* %"__idx$18", align 8 + %gt20 = icmp ugt i64 3, %21 + br i1 %gt20, label %loop.body21, label %loop.exit25 -for.cond21: ; preds = %for.inc26, %for.exit19 - %21 = load i64, i64* %"__idx$20", align 8 - %gt22 = icmp ugt i64 3, %21 - br i1 %gt22, label %for.body23, label %for.exit28 - -for.body23: ; preds = %for.cond21 - %22 = load i64, i64* %"__idx$20", align 8 +loop.body21: ; preds = %loop.cond19 + %22 = load i64, i64* %"__idx$18", align 8 store i64 %22, i64* %i, align 8 - %23 = load i64, i64* %"__idx$20", align 8 + %23 = load i64, i64* %"__idx$18", align 8 %24 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %23 %25 = load float, float* %24, align 4 - store float %25, float* %a24, align 4 + store float %25, float* %a22, align 4 %26 = load i64, i64* %i, align 8 - %27 = load float, float* %a24, align 4 - %fpfpext25 = fpext float %27 to double - call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 %26, double %fpfpext25) - br label %for.inc26 + %27 = load float, float* %a22, align 4 + %fpfpext23 = fpext float %27 to double + call void (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i32 0, i32 0), i64 %26, double %fpfpext23) + %28 = load i64, i64* %"__idx$18", align 8 + %add24 = add i64 %28, 1 + store i64 %add24, i64* %"__idx$18", align 8 + br label %loop.cond19 -for.inc26: ; preds = %for.body23 - %28 = load i64, i64* %"__idx$20", align 8 - %add27 = add i64 %28, 1 - store i64 %add27, i64* %"__idx$20", align 8 - br label %for.cond21 +loop.exit25: ; preds = %loop.cond19 + store i64 0, i64* %"__idx$26", align 8 + br label %loop.cond27 -for.exit28: ; preds = %for.cond21 - store i64 0, i64* %"__idx$29", align 8 - br label %for.cond30 +loop.cond27: ; preds = %loop.body29, %loop.exit25 + %29 = load i64, i64* %"__idx$26", align 8 + %gt28 = icmp ugt i64 3, %29 + br i1 %gt28, label %loop.body29, label %loop.exit34 -for.cond30: ; preds = %for.inc36, %for.exit28 - %29 = load i64, i64* %"__idx$29", align 8 - %gt31 = icmp ugt i64 3, %29 - br i1 %gt31, label %for.body32, label %for.exit38 - -for.body32: ; preds = %for.cond30 - %30 = load i64, i64* %"__idx$29", align 8 +loop.body29: ; preds = %loop.cond27 + %30 = load i64, i64* %"__idx$26", align 8 %uiuitrunc = trunc i64 %30 to i8 - store i8 %uiuitrunc, i8* %i33, align 1 - %31 = load i64, i64* %"__idx$29", align 8 + store i8 %uiuitrunc, i8* %i30, align 1 + %31 = load i64, i64* %"__idx$26", align 8 %32 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %31 %33 = load float, float* %32, align 4 - %fpfpext35 = fpext float %33 to double - store double %fpfpext35, double* %a34, align 8 - %34 = load i8, i8* %i33, align 1 + %fpfpext32 = fpext float %33 to double + store double %fpfpext32, double* %a31, align 8 + %34 = load i8, i8* %i30, align 1 %uisiext = zext i8 %34 to i32 - %35 = load double, double* %a34, align 8 + %35 = load double, double* %a31, align 8 call void (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.4, i32 0, i32 0), i32 %uisiext, double %35) - br label %for.inc36 + %36 = load i64, i64* %"__idx$26", align 8 + %add33 = add i64 %36, 1 + store i64 %add33, i64* %"__idx$26", align 8 + br label %loop.cond27 -for.inc36: ; preds = %for.body32 - %36 = load i64, i64* %"__idx$29", align 8 - %add37 = add i64 %36, 1 - store i64 %add37, i64* %"__idx$29", align 8 - br label %for.cond30 +loop.exit34: ; preds = %loop.cond27 + store i64 0, i64* %"__idx$35", align 8 + br label %loop.cond36 -for.exit38: ; preds = %for.cond30 - store i64 0, i64* %"__idx$39", align 8 - br label %for.cond40 +loop.cond36: ; preds = %loop.body38, %loop.exit34 + %37 = load i64, i64* %"__idx$35", align 8 + %gt37 = icmp ugt i64 3, %37 + br i1 %gt37, label %loop.body38, label %loop.exit42 -for.cond40: ; preds = %for.inc45, %for.exit38 - %37 = load i64, i64* %"__idx$39", align 8 - %gt41 = icmp ugt i64 3, %37 - br i1 %gt41, label %for.body42, label %for.exit47 - -for.body42: ; preds = %for.cond40 - %38 = load i64, i64* %"__idx$39", align 8 +loop.body38: ; preds = %loop.cond36 + %38 = load i64, i64* %"__idx$35", align 8 %39 = getelementptr inbounds [3 x float], [3 x float]* %foo, i64 0, i64 %38 %40 = load float, float* %39, align 4 - %fpfpext44 = fpext float %40 to double - store double %fpfpext44, double* %a43, align 8 - %41 = load double, double* %a43, align 8 + %fpfpext40 = fpext float %40 to double + store double %fpfpext40, double* %a39, align 8 + %41 = load double, double* %a39, align 8 call void (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.5, i32 0, i32 0), double %41) - br label %for.inc45 + %42 = load i64, i64* %"__idx$35", align 8 + %add41 = add i64 %42, 1 + store i64 %add41, i64* %"__idx$35", align 8 + br label %loop.cond36 -for.inc45: ; preds = %for.body42 - %42 = load i64, i64* %"__idx$39", align 8 - %add46 = add i64 %42, 1 - store i64 %add46, i64* %"__idx$39", align 8 - br label %for.cond40 - -for.exit47: ; preds = %for.cond40 +loop.exit42: ; preds = %loop.cond36 ret void } \ No newline at end of file diff --git a/test/test_suite/statements/foreach_custom.c3t b/test/test_suite/statements/foreach_custom.c3t index 91f695897..55af3127c 100644 --- a/test/test_suite/statements/foreach_custom.c3t +++ b/test/test_suite/statements/foreach_custom.c3t @@ -54,15 +54,13 @@ entry: %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 %7 = load i64, i64* %6, align 8 store i64 %7, i64* %"__len$", align 8 - br label %for.cond - -for.cond: ; preds = %entry + br label %loop.cond +loop.cond: ; preds = %entry %8 = load i64, i64* %"__idx$", align 8 %9 = load i64, i64* %"__len$", align 8 %lt = icmp ult i64 %8, %9 - br i1 %lt, label %for.body, label %for.exit - -for.body: ; preds = %for.cond + br i1 %lt, label %loop.body, label %loop.exit +loop.body: ; preds = %loop.cond %10 = load i64, i64* %"__idx$", align 8 store i64 %10, i64* %index, align 8 %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 @@ -74,11 +72,9 @@ for.body: ; preds = %for.cond store i32 %15, i32* %f, align 4 %16 = load i32, i32* %f, align 4 %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) - br label %while.begin - -while.begin: ; preds = %for.body - br label %for.exit - -for.exit: ; preds = %while.begin, %for.cond + br label %loop.body1 +loop.body1: ; preds = %loop.body + br label %loop.exit +loop.exit: ; preds = %loop.body1, %loop.cond ret void } \ No newline at end of file diff --git a/test/test_suite/statements/foreach_custom_errors.c3 b/test/test_suite/statements/foreach_custom_errors.c3 index e98d72275..127d0df9f 100644 --- a/test/test_suite/statements/foreach_custom_errors.c3 +++ b/test/test_suite/statements/foreach_custom_errors.c3 @@ -1,4 +1,3 @@ -// #skip fn void test1() { int x; @@ -10,7 +9,7 @@ define Test1 = distinct int; fn void test2() { Test1 x; - foreach (a : x) { }; // #error: This type cannot be iterated over, implement a method or method macro called 'iteratofefer' + foreach (a : x) { }; // #error: It's not possible to enumerate an expression of type 'Test1' } diff --git a/test/test_suite/statements/foreach_custom_macro.c3t b/test/test_suite/statements/foreach_custom_macro.c3t index 3c4127b58..a16226da7 100644 --- a/test/test_suite/statements/foreach_custom_macro.c3t +++ b/test/test_suite/statements/foreach_custom_macro.c3t @@ -52,15 +52,15 @@ entry: %6 = getelementptr inbounds %"int[]", %"int[]"* %5, i32 0, i32 1 %7 = load i64, i64* %6, align 8 store i64 %7, i64* %"__len$", align 8 - br label %for.cond + br label %loop.cond -for.cond: ; preds = %entry +loop.cond: ; preds = %entry %8 = load i64, i64* %"__idx$", align 8 %9 = load i64, i64* %"__len$", align 8 %lt = icmp ult i64 %8, %9 - br i1 %lt, label %for.body, label %for.exit + br i1 %lt, label %loop.body, label %loop.exit -for.body: ; preds = %for.cond +loop.body: ; preds = %loop.cond %10 = load i64, i64* %"__idx$", align 8 store i64 %10, i64* %index, align 8 %11 = getelementptr inbounds %Foo, %Foo* %x, i32 0, i32 0 @@ -72,11 +72,11 @@ for.body: ; preds = %for.cond store i32 %15, i32* %f, align 4 %16 = load i32, i32* %f, align 4 %17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %16) - br label %while.begin + br label %loop.body1 -while.begin: ; preds = %for.body - br label %for.exit +loop.body1: ; preds = %loop.body + br label %loop.exit -for.exit: ; preds = %while.begin, %for.cond +loop.exit: ; preds = %loop.body1, %loop.cond ret void } diff --git a/test/test_suite/statements/if_while_do_error.c3 b/test/test_suite/statements/if_while_do_error.c3 index d987de523..c0cd3312a 100644 --- a/test/test_suite/statements/if_while_do_error.c3 +++ b/test/test_suite/statements/if_while_do_error.c3 @@ -3,7 +3,7 @@ module test; fn void test1() { bool! x = 0; - if (x) // #error: 'bool!' to 'bool' + if (x) // #error: The expression may not be a failable, but was 'bool!' { x = 100; } @@ -12,7 +12,7 @@ fn void test1() fn void test2() { bool! x = 0; - while (x) // #error: 'bool!' to 'bool' + while (x) // #error: The expression may not be a failable, but was 'bool!' { x = false; } diff --git a/test/test_suite/statements/labelled_continue_for.c3t b/test/test_suite/statements/labelled_continue_for.c3t index 9d9eae177..b9b066c23 100644 --- a/test/test_suite/statements/labelled_continue_for.c3t +++ b/test/test_suite/statements/labelled_continue_for.c3t @@ -1,3 +1,4 @@ +// #target: x64-darwin fn void errored() {} @@ -20,16 +21,51 @@ fn void testBreak() } } -// #expect: labelled_continue_for.ll +/* #expect: labelled_continue_for.ll -for.cond: +define void @labelled_continue_for.testBreak() #0 { +entry: + %i = alloca i32, align 4 + %j = alloca i32, align 4 + %k = alloca i32, align 4 + store i32 0, i32* %i, align 4 + br label %loop.cond +loop.cond: ; preds = %loop.inc, %entry + %0 = load i32, i32* %i, align 4 + %lt = icmp slt i32 %0, 10 + br i1 %lt, label %loop.body, label %loop.exit9 +loop.body: ; preds = %loop.cond + store i32 0, i32* %j, align 4 + br label %loop.cond1 +loop.cond1: ; preds = %loop.exit, %loop.body + %1 = load i32, i32* %j, align 4 + %lt2 = icmp slt i32 %1, 10 + br i1 %lt2, label %loop.body3, label %loop.exit7 +loop.body3: ; preds = %loop.cond1 + store i32 0, i32* %k, align 4 + br label %loop.cond4 +loop.cond4: ; preds = %loop.body3 + %2 = load i32, i32* %k, align 4 + %lt5 = icmp slt i32 %2, 10 + br i1 %lt5, label %loop.body6, label %loop.exit +loop.body6: ; preds = %loop.cond4 call void @labelled_continue_for.test() - br label %for.inc8 - -for.inc8: - %4 = load i32, i32* %i - %add9 = add i32 %4, 1 - store i32 %add9, i32* %i - br label %for.cond - + br label %loop.inc +loop.exit: ; preds = %loop.cond4 + call void @labelled_continue_for.errored() + %3 = load i32, i32* %j, align 4 + %add = add i32 %3, 1 + store i32 %add, i32* %j, align 4 + br label %loop.cond1 +loop.exit7: ; preds = %loop.cond1 + call void @labelled_continue_for.errored() + br label %loop.inc +loop.inc: ; preds = %loop.exit7, %loop.body6 + %4 = load i32, i32* %i, align 4 + %add8 = add i32 %4, 1 + store i32 %add8, i32* %i, align 4 + br label %loop.cond +loop.exit9: ; preds = %loop.cond + ret void +} diff --git a/test/test_suite/statements/simple_do.c3t b/test/test_suite/statements/simple_do.c3t new file mode 100644 index 000000000..1b38decec --- /dev/null +++ b/test/test_suite/statements/simple_do.c3t @@ -0,0 +1,84 @@ +// #target: x64-darwin + +module foo; +fn int test() +{ + static int x = 0; + return 1 + x++; +} + +extern fn void printf(char*, ...); + +fn void main() +{ + int i = 10; + do + { + printf("%d\n", test()); + if (i > 100) break; + } while (i-- > 0); + i = 1; + do + { + printf("%d, %d\n", i, test()); + if (i % 3 == 0) break; + } while (i++ < 100); +} + +// #expect: foo.ll + +define void @main() #0 { +entry: + %i = alloca i32, align 4 + store i32 10, i32* %i, align 4 + br label %loop.body + +loop.cond: ; preds = %if.exit + %0 = load i32, i32* %i, align 4 + %sub = sub i32 %0, 1 + store i32 %sub, i32* %i, align 4 + %gt = icmp sgt i32 %0, 0 + br i1 %gt, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond, %entry + %1 = call i32 @foo.test() + call void (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %1) + %2 = load i32, i32* %i, align 4 + %gt1 = icmp sgt i32 %2, 100 + br i1 %gt1, label %if.then, label %if.exit + +if.then: ; preds = %loop.body + br label %loop.exit + +if.exit: ; preds = %loop.body + br label %loop.cond + +loop.exit: ; preds = %if.then, %loop.cond + store i32 1, i32* %i, align 4 + br label %loop.body3 + +loop.cond2: ; preds = %if.exit5 + %3 = load i32, i32* %i, align 4 + %add = add i32 %3, 1 + store i32 %add, i32* %i, align 4 + %lt = icmp slt i32 %3, 100 + br i1 %lt, label %loop.body3, label %loop.exit6 + +loop.body3: ; preds = %loop.cond2, %loop.exit + %4 = load i32, i32* %i, align 4 + %5 = call i32 @foo.test() + call void (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str.1, i32 0, i32 0), i32 %4, i32 %5) + %6 = load i32, i32* %i, align 4 + %smod = srem i32 %6, 3 + %eq = icmp eq i32 %smod, 0 + br i1 %eq, label %if.then4, label %if.exit5 + +if.then4: ; preds = %loop.body3 + br label %loop.exit6 + +if.exit5: ; preds = %loop.body3 + br label %loop.cond2 + +loop.exit6: ; preds = %if.then4, %loop.cond2 + ret void +} \ No newline at end of file diff --git a/test/test_suite/statements/while_switch.c3t b/test/test_suite/statements/while_switch.c3t index 72ce1e662..dc589accb 100644 --- a/test/test_suite/statements/while_switch.c3t +++ b/test/test_suite/statements/while_switch.c3t @@ -1,6 +1,6 @@ +// #target: x64-darwin module test; - extern fn int printf(char*, ...); extern fn int foo(); @@ -28,24 +28,28 @@ fn int main() return 0; } -// #expect: test.ll +/* #expect: test.ll -@.str = private constant [2 x i8] c"3\00" -@.str.1 = private constant [2 x i8] c"4\00" +@.str = private constant [2 x i8] c"3\00", align 1 +@.str.1 = private constant [2 x i8] c"4\00", align 1 +define i32 @main() #0 { entry: %switch = alloca i32, align 4 - br label %while.begin -while.begin: + br label %loop.cond + +loop.cond: ; preds = %switch.exit, %entry %0 = call i32 @foo() %intbool = icmp ne i32 %0, 0 - br i1 %intbool, label %while.body, label %while.exit -while.body: + br i1 %intbool, label %loop.body, label %loop.exit + +loop.body: ; preds = %loop.cond %1 = call i32 @foo() store i32 %1, i32* %switch, align 4 br label %switch.entry -switch.entry: + +switch.entry: ; preds = %loop.body %2 = load i32, i32* %switch, align 4 switch i32 %2, label %switch.default [ i32 0, label %switch.case @@ -56,16 +60,22 @@ switch.entry: i32 5, label %switch.default i32 6, label %switch.default ] -switch.case: + +switch.case: ; preds = %switch.entry, %switch.entry, %switch.entry, %switch.entry %3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)) br label %switch.case1 -switch.case1: + +switch.case1: ; preds = %switch.entry, %switch.case %4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i32 0, i32 0)) br label %switch.default -switch.default: - br label %switch.exit -switch.exit: - br label %while.begin -while.exit: - ret i32 0 + +switch.default: ; preds = %switch.entry, %switch.entry, %switch.case1, %switch.entry + br label %switch.exit + +switch.exit: ; preds = %switch.default + br label %loop.cond + +loop.exit: ; preds = %loop.cond + ret i32 0 +}