void cpp_from_isl::process_for(isl_ast_node *node) { auto iter_expr = isl_ast_node_for_get_iterator(node); auto init_expr = isl_ast_node_for_get_init(node); auto cond_expr = isl_ast_node_for_get_cond(node); auto inc_expr = isl_ast_node_for_get_inc(node); auto body_node = isl_ast_node_for_get_body(node); auto iter = process_expr(iter_expr); auto init = process_expr(init_expr); auto cond = process_expr(cond_expr); auto inc = process_expr(inc_expr); auto iter_id = dynamic_pointer_cast<id_expression>(iter); if (!iter_id) throw error("Iterator expression is not an identifier."); auto iter_decl = decl_expr(make_shared<basic_type>("int"), *iter_id, init); auto for_stmt = make_shared<for_statement>(); for_stmt->initialization = iter_decl; for_stmt->condition = cond; for_stmt->update = binop(op::assign_add, iter, inc); { vector<statement_ptr> stmts; m_ctx->push(&stmts); process_node(body_node); m_ctx->pop(); if (stmts.size() == 1) for_stmt->body = stmts.front(); else for_stmt->body = block(stmts); } m_ctx->add(for_stmt); isl_ast_expr_free(iter_expr); isl_ast_expr_free(init_expr); isl_ast_expr_free(cond_expr); isl_ast_expr_free(inc_expr); isl_ast_node_free(body_node); }
instruction_list * isl_for_to_noclock (isl_ast_node * for_node) { /* Extract the for loop information. */ isl_ast_expr * iterator = isl_ast_node_for_get_iterator (for_node); isl_id * id = isl_ast_expr_get_id (iterator); isl_ast_expr * init = isl_ast_node_for_get_init (for_node); isl_ast_expr * cond = isl_ast_node_for_get_cond (for_node); isl_ast_node * body = isl_ast_node_for_get_body (for_node); /* Construct the for loop. */ instruction * loop = instruction_for_loop ( strdup (isl_id_get_name (id)), isl_init_to_expr (init), isl_cond_to_expr (cond), isl_ast_to_noclock_ast (body)); /* Wrap the loop in an instruction list node. */ instruction_list * list = instruction_list_alloc (); list->element = loop; list->next = NULL; return list; }