コード例 #1
0
ファイル: isl_to_noclock.c プロジェクト: Harenome/noclock
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;
}
コード例 #2
0
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);
}