instruction_list * isl_if_to_noclock (isl_ast_node * if_node) { /* Extract the if then else information. */ isl_ast_expr * cond = isl_ast_node_if_get_cond (if_node); isl_ast_node * if_body = isl_ast_node_if_get_then (if_node); bool has_else = isl_ast_node_if_has_else (if_node); instruction * if_i = instruction_alloc (); if_i->type = INSTR_IF; if_i->content.branch.condition = isl_expr_to_noclock_expr (cond); if_i->content.branch.true_body = isl_ast_to_noclock_ast (if_body); if_i->content.branch.false_body = NULL; if (has_else) { isl_ast_node * else_body = isl_ast_node_if_get_else (if_node); if_i->content.branch.false_body = isl_ast_to_noclock_ast (else_body); if_i->content.branch.has_else = true; } /* Wrap the if then else in an instruction list node. */ instruction_list * list = instruction_list_alloc (); list->element = if_i; list->next = NULL; return list; }
void cpp_from_isl::process_if(isl_ast_node *node) { auto cond_expr = isl_ast_node_if_get_cond(node); auto true_node = isl_ast_node_if_get_then(node); auto false_node = isl_ast_node_if_get_else(node); auto if_stmt = make_shared<if_statement>(); if_stmt->condition = process_expr(cond_expr); { vector<statement_ptr> stmts; m_ctx->push(&stmts); process_node(true_node); m_ctx->pop(); if (stmts.size() == 1) if_stmt->true_part = stmts.front(); else if_stmt->true_part = block(stmts); } if (false_node) { vector<statement_ptr> stmts; m_ctx->push(&stmts); process_node(false_node); m_ctx->pop(); if (stmts.size() == 1) if_stmt->false_part = stmts.front(); else if_stmt->false_part = block(stmts); } m_ctx->add(if_stmt); isl_ast_expr_free(cond_expr); isl_ast_node_free(true_node); isl_ast_node_free(false_node); }