Commit 1275de7d by Eric Botcazou Committed by Eric Botcazou

utils2.c (build_cond_expr): Move SAVE_EXPR ahead of the conditional expression only if...

	* gcc-interface/utils2.c (build_cond_expr): Move SAVE_EXPR ahead of
	the conditional expression only if it is common to both arms.

From-SVN: r146673
parent 6f61bd41
2009-04-24 Eric Botcazou <ebotcazou@adacore.com> 2009-04-24 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils2.c (build_cond_expr): Move SAVE_EXPR ahead of
the conditional expression only if it is common to both arms.
2009-04-24 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/gigi.h (build_call_alloc_dealloc): Update comment. * gcc-interface/gigi.h (build_call_alloc_dealloc): Update comment.
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Pass correct * gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Pass correct
arguments to build_allocator. arguments to build_allocator.
......
...@@ -1410,44 +1410,40 @@ tree ...@@ -1410,44 +1410,40 @@ tree
build_cond_expr (tree result_type, tree condition_operand, build_cond_expr (tree result_type, tree condition_operand,
tree true_operand, tree false_operand) tree true_operand, tree false_operand)
{ {
tree result;
bool addr_p = false; bool addr_p = false;
tree result;
/* The front-end verifies that result, true and false operands have same base /* The front-end verified that result, true and false operands have
type. Convert everything to the result type. */ same base type. Convert everything to the result type. */
true_operand = convert (result_type, true_operand);
true_operand = convert (result_type, true_operand);
false_operand = convert (result_type, false_operand); false_operand = convert (result_type, false_operand);
/* If the result type is unconstrained, take the address of /* If the result type is unconstrained, take the address of the operands
the operands and then dereference our result. */ and then dereference our result. */
if (TREE_CODE (result_type) == UNCONSTRAINED_ARRAY_TYPE if (TREE_CODE (result_type) == UNCONSTRAINED_ARRAY_TYPE
|| CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type))) || CONTAINS_PLACEHOLDER_P (TYPE_SIZE (result_type)))
{ {
addr_p = true;
result_type = build_pointer_type (result_type); result_type = build_pointer_type (result_type);
true_operand = build_unary_op (ADDR_EXPR, result_type, true_operand); true_operand = build_unary_op (ADDR_EXPR, result_type, true_operand);
false_operand = build_unary_op (ADDR_EXPR, result_type, false_operand); false_operand = build_unary_op (ADDR_EXPR, result_type, false_operand);
addr_p = true;
} }
result = fold_build3 (COND_EXPR, result_type, condition_operand, result = fold_build3 (COND_EXPR, result_type, condition_operand,
true_operand, false_operand); true_operand, false_operand);
/* If either operand is a SAVE_EXPR (possibly surrounded by /* If we have a common SAVE_EXPR (possibly surrounded by arithmetics)
arithmetic, make sure it gets done. */ in both arms, make sure it gets evaluated by moving it ahead of the
true_operand = skip_simple_arithmetic (true_operand); conditional expression. This is necessary because it is evaluated
in only one place at run time and would otherwise be uninitialized
in one of the arms. */
true_operand = skip_simple_arithmetic (true_operand);
false_operand = skip_simple_arithmetic (false_operand); false_operand = skip_simple_arithmetic (false_operand);
if (TREE_CODE (true_operand) == SAVE_EXPR) if (true_operand == false_operand && TREE_CODE (true_operand) == SAVE_EXPR)
result = build2 (COMPOUND_EXPR, result_type, true_operand, result); result = build2 (COMPOUND_EXPR, result_type, true_operand, result);
if (TREE_CODE (false_operand) == SAVE_EXPR) if (addr_p)
result = build2 (COMPOUND_EXPR, result_type, false_operand, result);
/* ??? Seems the code above is wrong, as it may move ahead of the COND
SAVE_EXPRs with side effects and not shared by both arms. */
if (addr_p)
result = build_unary_op (INDIRECT_REF, NULL_TREE, result); result = build_unary_op (INDIRECT_REF, NULL_TREE, result);
return result; return result;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment