diff options
Diffstat (limited to 'gcc/tree-complex.c')
-rw-r--r-- | gcc/tree-complex.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c index 4703e78..8d680df 100644 --- a/gcc/tree-complex.c +++ b/gcc/tree-complex.c @@ -1047,22 +1047,30 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type, tree ar, tree ai, tree br, tree bi, enum tree_code code) { - tree rr, ri, ratio, div, t1, t2, tr, ti, cond; + tree rr, ri, ratio, div, t1, t2, tr, ti, compare; basic_block bb_cond, bb_true, bb_false, bb_join; /* Examine |br| < |bi|, and branch. */ t1 = gimplify_build1 (bsi, ABS_EXPR, inner_type, br); t2 = gimplify_build1 (bsi, ABS_EXPR, inner_type, bi); - cond = fold_build2 (LT_EXPR, boolean_type_node, t1, t2); - STRIP_NOPS (cond); + compare = fold_build2 (LT_EXPR, boolean_type_node, t1, t2); + STRIP_NOPS (compare); bb_cond = bb_true = bb_false = bb_join = NULL; rr = ri = tr = ti = NULL; - if (!TREE_CONSTANT (cond)) + if (!TREE_CONSTANT (compare)) { edge e; + tree cond, tmp; - cond = build3 (COND_EXPR, void_type_node, cond, NULL_TREE, NULL_TREE); + tmp = create_tmp_var (boolean_type_node, NULL); + cond = build_gimple_modify_stmt (tmp, compare); + if (gimple_in_ssa_p (cfun)) + tmp = make_ssa_name (tmp, cond); + GIMPLE_STMT_OPERAND (cond, 0) = tmp; + bsi_insert_before (bsi, cond, BSI_SAME_STMT); + + cond = build3 (COND_EXPR, void_type_node, tmp, NULL_TREE, NULL_TREE); bsi_insert_before (bsi, cond, BSI_SAME_STMT); /* Split the original block, and create the TRUE and FALSE blocks. */ @@ -1098,7 +1106,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type, ti = (ai * ratio) - ar; tr = tr / div; ti = ti / div; */ - if (bb_true || integer_nonzerop (cond)) + if (bb_true || integer_nonzerop (compare)) { if (bb_true) { @@ -1137,7 +1145,7 @@ expand_complex_div_wide (block_stmt_iterator *bsi, tree inner_type, ti = b - (a * ratio); tr = tr / div; ti = ti / div; */ - if (bb_false || integer_zerop (cond)) + if (bb_false || integer_zerop (compare)) { if (bb_false) { |