aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-complex.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-complex.c')
-rw-r--r--gcc/tree-complex.c22
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)
{