Commit 06ec59e6 by Eric Botcazou

gimplify.c (gimplify_cond_expr): Use THEN_ and ELSE_ local variables.

	* gimplify.c (gimplify_cond_expr): Use THEN_ and ELSE_ local variables.
	Use VOID_TYPE_P for all void type tests.  Adjust TYPE variable instead
	of shadowing it.  Fix comments.

From-SVN: r158737
parent 2b50b170
2010-04-26 Eric Botcazou <ebotcazou@adacore.com>
* gimplify.c (gimplify_cond_expr): Use THEN_ and ELSE_ local variables.
Use VOID_TYPE_P for all void type tests. Adjust TYPE variable instead
of shadowing it. Fix comments.
2010-04-26 Jan Hubicka <jh@suse.cz> 2010-04-26 Jan Hubicka <jh@suse.cz>
* cgraph.c (cgraph_create_node): Set node frequency to normal. * cgraph.c (cgraph_create_node): Set node frequency to normal.
...@@ -8,15 +14,19 @@ ...@@ -8,15 +14,19 @@
* lto-cgraph.c (lto_output_node): Output node frequency. * lto-cgraph.c (lto_output_node): Output node frequency.
(input_overwrite_node): Input node frequency. (input_overwrite_node): Input node frequency.
* tre-ssa-loop-ivopts (computation_cost): Update. * tre-ssa-loop-ivopts (computation_cost): Update.
* lto-streamer-out.c (output_function): Do not output function frequency. * lto-streamer-out.c (output_function): Do not output function
* predict.c (maybe_hot_frequency_p): Update and handle functions executed once. frequency.
* predict.c (maybe_hot_frequency_p): Update and handle functions
executed once.
(cgraph_maybe_hot_edge_p): Likewise; use cgraph frequency instead of (cgraph_maybe_hot_edge_p): Likewise; use cgraph frequency instead of
attribute lookup. attribute lookup.
(probably_never_executed_bb_p, optimize_function_for_size_p): Update. (probably_never_executed_bb_p, optimize_function_for_size_p): Update.
(compute_function_frequency): Set noreturn functions to be executed once. (compute_function_frequency): Set noreturn functions to be executed
once.
(choose_function_section): Update. (choose_function_section): Update.
* lto-streamer-in.c (input_function): Do not input function frequency. * lto-streamer-in.c (input_function): Do not input function frequency.
* function.c (allocate_struct_function): Do not initialize function frequency. * function.c (allocate_struct_function): Do not initialize function
frequency.
* function.h (function_frequency): Remove. * function.h (function_frequency): Remove.
(struct function): Remove function frequency. (struct function): Remove function frequency.
* ipa-profile.c (CGRAPH_NODE_FREQUENCY): Remove. * ipa-profile.c (CGRAPH_NODE_FREQUENCY): Remove.
......
...@@ -2867,71 +2867,67 @@ static enum gimplify_status ...@@ -2867,71 +2867,67 @@ static enum gimplify_status
gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback) gimplify_cond_expr (tree *expr_p, gimple_seq *pre_p, fallback_t fallback)
{ {
tree expr = *expr_p; tree expr = *expr_p;
tree tmp, type, arm1, arm2; tree type = TREE_TYPE (expr);
location_t loc = EXPR_LOCATION (expr);
tree tmp, arm1, arm2;
enum gimplify_status ret; enum gimplify_status ret;
tree label_true, label_false, label_cont; tree label_true, label_false, label_cont;
bool have_then_clause_p, have_else_clause_p; bool have_then_clause_p, have_else_clause_p;
gimple gimple_cond; gimple gimple_cond;
enum tree_code pred_code; enum tree_code pred_code;
gimple_seq seq = NULL; gimple_seq seq = NULL;
location_t loc = EXPR_LOCATION (*expr_p);
type = TREE_TYPE (expr);
/* If this COND_EXPR has a value, copy the values into a temporary within /* If this COND_EXPR has a value, copy the values into a temporary within
the arms. */ the arms. */
if (! VOID_TYPE_P (type)) if (!VOID_TYPE_P (type))
{ {
tree then_ = TREE_OPERAND (expr, 1), else_ = TREE_OPERAND (expr, 2);
tree result; tree result;
/* If an rvalue is ok or we do not require an lvalue, avoid creating /* If either an rvalue is ok or we do not require an lvalue, create the
an addressable temporary. */ temporary. But we cannot do that if the type is addressable. */
if (((fallback & fb_rvalue) if (((fallback & fb_rvalue) || !(fallback & fb_lvalue))
|| !(fallback & fb_lvalue))
&& !TREE_ADDRESSABLE (type)) && !TREE_ADDRESSABLE (type))
{ {
if (gimplify_ctxp->allow_rhs_cond_expr if (gimplify_ctxp->allow_rhs_cond_expr
/* If either branch has side effects or could trap, it can't be /* If either branch has side effects or could trap, it can't be
evaluated unconditionally. */ evaluated unconditionally. */
&& !TREE_SIDE_EFFECTS (TREE_OPERAND (*expr_p, 1)) && !TREE_SIDE_EFFECTS (then_)
&& !generic_expr_could_trap_p (TREE_OPERAND (*expr_p, 1)) && !generic_expr_could_trap_p (then_)
&& !TREE_SIDE_EFFECTS (TREE_OPERAND (*expr_p, 2)) && !TREE_SIDE_EFFECTS (else_)
&& !generic_expr_could_trap_p (TREE_OPERAND (*expr_p, 2))) && !generic_expr_could_trap_p (else_))
return gimplify_pure_cond_expr (expr_p, pre_p); return gimplify_pure_cond_expr (expr_p, pre_p);
result = tmp = create_tmp_var (TREE_TYPE (expr), "iftmp"); tmp = create_tmp_var (type, "iftmp");
ret = GS_ALL_DONE; result = tmp;
} }
/* Otherwise, only create and copy references to the values. */
else else
{ {
tree type = build_pointer_type (TREE_TYPE (expr)); type = build_pointer_type (type);
if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node) if (!VOID_TYPE_P (TREE_TYPE (then_)))
TREE_OPERAND (expr, 1) = then_ = build_fold_addr_expr_loc (loc, then_);
build_fold_addr_expr_loc (loc, TREE_OPERAND (expr, 1));
if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node) if (!VOID_TYPE_P (TREE_TYPE (else_)))
TREE_OPERAND (expr, 2) = else_ = build_fold_addr_expr_loc (loc, else_);
build_fold_addr_expr_loc (loc, TREE_OPERAND (expr, 2));
expr
= build3 (COND_EXPR, type, TREE_OPERAND (expr, 0), then_, else_);
tmp = create_tmp_var (type, "iftmp"); tmp = create_tmp_var (type, "iftmp");
expr = build3 (COND_EXPR, void_type_node, TREE_OPERAND (expr, 0),
TREE_OPERAND (expr, 1), TREE_OPERAND (expr, 2));
result = build_fold_indirect_ref_loc (loc, tmp); result = build_fold_indirect_ref_loc (loc, tmp);
} }
/* Build the then clause, 't1 = a;'. But don't build an assignment /* Build the new then clause, `tmp = then_;'. But don't build the
if this branch is void; in C++ it can be, if it's a throw. */ assignment if the value is void; in C++ it can be if it's a throw. */
if (TREE_TYPE (TREE_OPERAND (expr, 1)) != void_type_node) if (!VOID_TYPE_P (TREE_TYPE (then_)))
TREE_OPERAND (expr, 1) TREE_OPERAND (expr, 1) = build2 (MODIFY_EXPR, type, tmp, then_);
= build2 (MODIFY_EXPR, TREE_TYPE (tmp), tmp, TREE_OPERAND (expr, 1));
/* Build the else clause, 't1 = b;'. */ /* Similarly, build the new else clause, `tmp = else_;'. */
if (TREE_TYPE (TREE_OPERAND (expr, 2)) != void_type_node) if (!VOID_TYPE_P (TREE_TYPE (else_)))
TREE_OPERAND (expr, 2) TREE_OPERAND (expr, 2) = build2 (MODIFY_EXPR, type, tmp, else_);
= build2 (MODIFY_EXPR, TREE_TYPE (tmp), tmp, TREE_OPERAND (expr, 2));
TREE_TYPE (expr) = void_type_node; TREE_TYPE (expr) = void_type_node;
recalculate_side_effects (expr); recalculate_side_effects (expr);
......
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