SsaNode* cond = expression(p);
check_bool(p, cond);
expect(p, THEN);
+ SsaNode* if_node = ssa_if(p, cond, NULL, NULL);
SsaBlock* block = p->curr_block;
block->links[0] = statement_seq(p);
{
block->links[1] = statement_seq(p);
block->links[1]->links[0] = p->curr_join;
- /* reset vars to backup values */
}
else
{
block->links[1] = p->curr_join;
}
+ if_node->left.block = block->links[0];
+ if_node->right.block = block->links[1];
+
/* pop the join node */
p->curr_block = p->curr_join;
p->curr_join = p->curr_join->next;
SsaNode* ssa_if(Parser* p, SsaNode* cond, SsaBlock* br1, SsaBlock* br2)
{
- (void)br1, (void)br2;
cond = load(p, cond);
- return NULL;
+ SsaNode* node = ssa_node(IF, MODE_CONTROL);
+ node->type = &VoidType;
+ node->left.block = br1;
+ node->right.block = br2;
+ node = load(p, node);
+ node->dest = cond->dest;
+ return node;
}
SsaNode* ssa_return(SsaNode* expr);
static void print_dest(Parser* p, SsaNode* node)
{
- print_ident(p, &(node->dest));
- printf(" = ");
+ if (node->mode != MODE_CONTROL)
+ {
+ print_ident(p, &(node->dest));
+ printf(" = ");
+ }
}
static void print_opcode(SsaNode* node)
}
else if (op == EQ)
{
- printf("==");
+ printf(" == ");
}
else if (op == NEQ)
{
- printf("!=");
+ printf(" != ");
}
else if (op == LTEQ)
{
- printf("<=");
+ printf(" <= ");
}
else if (op == GTEQ)
{
- printf(">=");
+ printf(" >= ");
}
else
{
printf("(Real)%f", ssa_asreal(expr));
break;
+ case IF:
+ printf("if ");
+ print_ident(p, &(expr->dest));
+ printf(" then block%lu else block%lu", expr->left.block->id, expr->right.block->id);
+ break;
+
default:
if (expr->mode == MODE_VAR)
{
{
/* print the phis */
- for (SsaPhi* phi = block->phis; phi; phi = phi->next)
+ for (SsaPhi* phi = curr->phis; phi; phi = phi->next)
{
Symbol* s = symbol_getbyid(p, phi->symid);
s->version++;