diff options
Diffstat (limited to 'linearize.c')
| -rw-r--r-- | linearize.c | 41 |
1 files changed, 14 insertions, 27 deletions
diff --git a/linearize.c b/linearize.c index 3dfe45c0..eeef0ba7 100644 --- a/linearize.c +++ b/linearize.c @@ -1644,48 +1644,35 @@ static pseudo_t linearize_conditional(struct entrypoint *ep, struct expression * static pseudo_t linearize_logical(struct entrypoint *ep, struct expression *expr) { - struct basic_block *merge; + struct basic_block *other, *merge; pseudo_t phi1, phi2; if (!ep->active || !expr->left || !expr->right) return VOID; - if (expr->op == SPECIAL_LOGICAL_OR) { - struct expression *expr_false = expr->right; - struct basic_block *bb_true = alloc_basic_block(ep, expr->pos); - struct basic_block *bb_false = alloc_basic_block(ep, expr_false->pos); - pseudo_t src1, src2; + other = alloc_basic_block(ep, expr->right->pos); + merge = alloc_basic_block(ep, expr->pos); - merge = alloc_basic_block(ep, expr->pos); - linearize_cond_branch(ep, expr->left, bb_true, bb_false); + if (expr->op == SPECIAL_LOGICAL_OR) { + pseudo_t src2; - set_activeblock(ep, bb_true); - src1 = value_pseudo(1); - phi1 = alloc_phi(ep->active, src1, expr->ctype); - add_goto(ep, merge); + phi1 = alloc_phi(ep->active, value_pseudo(1), expr->ctype); + linearize_cond_branch(ep, expr->left, merge, other); - set_activeblock(ep, bb_false); - src2 = linearize_expression_to_bool(ep, expr_false); + set_activeblock(ep, other); + src2 = linearize_expression_to_bool(ep, expr->right); src2 = cast_pseudo(ep, src2, &bool_ctype, expr->ctype); phi2 = alloc_phi(ep->active, src2, expr->ctype); } else { - struct expression *expr_true = expr->right; - struct basic_block *bb_true = alloc_basic_block(ep, expr_true->pos); - struct basic_block *bb_false = alloc_basic_block(ep, expr->pos); - pseudo_t src1, src2; + pseudo_t src1; - merge = alloc_basic_block(ep, expr->pos); - linearize_cond_branch(ep, expr->left, bb_true, bb_false); + phi2 = alloc_phi(ep->active, value_pseudo(0), expr->ctype); + linearize_cond_branch(ep, expr->left, other, merge); - set_activeblock(ep, bb_true); - src1 = linearize_expression_to_bool(ep, expr_true); + set_activeblock(ep, other); + src1 = linearize_expression_to_bool(ep, expr->right); src1 = cast_pseudo(ep, src1, &bool_ctype, expr->ctype); phi1 = alloc_phi(ep->active, src1, expr->ctype); - add_goto(ep, merge); - - set_activeblock(ep, bb_false); - src2 = value_pseudo(0); - phi2 = alloc_phi(ep->active, src2, expr->ctype); } set_activeblock(ep, merge); |
