Commit a61c3633 by Eric Botcazou Committed by Eric Botcazou

sched-deps.c (sched_insn_is_legitimate_for_speculation): Invoke…

sched-deps.c (sched_insn_is_legitimate_for_speculation): Invoke may_trap_or_fault_p instead of may_trap_p predicate.

	* sched-deps.c (sched_insn_is_legitimate_for_speculation): Invoke
	may_trap_or_fault_p instead of may_trap_p predicate.
	* tree.c (substitute_in_expr): Propagate the TREE_THIS_NOTRAP flag.
	(substitute_placeholder_in_expr): Likewise.
	* tree-inline.c (remap_gimple_op_r): Propagate the TREE_THIS_NOTRAP
	flag on MEM_REF nodes.
	(copy_tree_body_r): Propagate the TREE_READONLY and TREE_THIS_NOTRAP
	flags on INDIRECT_REF nodes.
ada/
	* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Set
	TREE_THIS_NOTRAP on the INDIRECT_REF node built for the template.
	* gcc-interface/trans.c (Identifier_to_gnu): Set TREE_THIS_NOTRAP on
	the INDIRECT_REF node built for objects used by reference.
	* gcc-interface/utils2.c (build_binary_op): Add short-circuit for
	constant result. Set TREE_THIS_NOTRAP on ARRAY_REF and ARRAY_RANGE_REF.
	(gnat_stabilize_reference_1): Propagate the TREE_THIS_NOTRAP flag.

From-SVN: r165468
parent 8de2e8c9
2010-10-14 Eric Botcazou <ebotcazou@adacore.com>
* sched-deps.c (sched_insn_is_legitimate_for_speculation): Invoke
may_trap_or_fault_p instead of may_trap_p predicate.
* tree.c (substitute_in_expr): Propagate the TREE_THIS_NOTRAP flag.
(substitute_placeholder_in_expr): Likewise.
* tree-inline.c (remap_gimple_op_r): Propagate the TREE_THIS_NOTRAP
flag on MEM_REF nodes.
(copy_tree_body_r): Propagate the TREE_READONLY and TREE_THIS_NOTRAP
flags on INDIRECT_REF nodes.
2010-10-14 Nathan Froyd <froydnj@codesourcery.com> 2010-10-14 Nathan Froyd <froydnj@codesourcery.com>
* config.gcc (arm*-*-linux-*eabi) <tm_file>: Add bpabi.h from * config.gcc (arm*-*-linux-*eabi) <tm_file>: Add bpabi.h from
2010-10-14 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Array_Type>: Set
TREE_THIS_NOTRAP on the INDIRECT_REF node built for the template.
* gcc-interface/trans.c (Identifier_to_gnu): Set TREE_THIS_NOTRAP on
the INDIRECT_REF node built for objects used by reference.
* gcc-interface/utils2.c (build_binary_op): Add short-circuit for
constant result. Set TREE_THIS_NOTRAP on ARRAY_REF and ARRAY_RANGE_REF.
(gnat_stabilize_reference_1): Propagate the TREE_THIS_NOTRAP flag.
2010-10-13 Richard Henderson <rth@redhat.com> 2010-10-13 Richard Henderson <rth@redhat.com>
* gcc-interface/misc.c (gnat_eh_personality): Update call to * gcc-interface/misc.c (gnat_eh_personality): Update call to
......
...@@ -1942,6 +1942,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -1942,6 +1942,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
gnu_template_reference gnu_template_reference
= build_unary_op (INDIRECT_REF, gnu_template_type, tem); = build_unary_op (INDIRECT_REF, gnu_template_type, tem);
TREE_READONLY (gnu_template_reference) = 1; TREE_READONLY (gnu_template_reference) = 1;
TREE_THIS_NOTRAP (gnu_template_reference) = 1;
/* Now create the GCC type for each index and add the fields for that /* Now create the GCC type for each index and add the fields for that
index to the template. */ index to the template. */
......
...@@ -978,14 +978,22 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) ...@@ -978,14 +978,22 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
if (TREE_CODE (gnu_result) == PARM_DECL if (TREE_CODE (gnu_result) == PARM_DECL
&& DECL_BY_DOUBLE_REF_P (gnu_result)) && DECL_BY_DOUBLE_REF_P (gnu_result))
gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result); {
gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
if (TREE_CODE (gnu_result) == INDIRECT_REF)
TREE_THIS_NOTRAP (gnu_result) = 1;
}
if (TREE_CODE (gnu_result) == PARM_DECL if (TREE_CODE (gnu_result) == PARM_DECL
&& DECL_BY_COMPONENT_PTR_P (gnu_result)) && DECL_BY_COMPONENT_PTR_P (gnu_result))
gnu_result {
= build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result
convert (build_pointer_type (gnu_result_type), = build_unary_op (INDIRECT_REF, NULL_TREE,
gnu_result)); convert (build_pointer_type (gnu_result_type),
gnu_result));
if (TREE_CODE (gnu_result) == INDIRECT_REF)
TREE_THIS_NOTRAP (gnu_result) = 1;
}
/* If it's a renaming pointer and we are at the right binding level, /* If it's a renaming pointer and we are at the right binding level,
we can reference the renamed object directly, since the renamed we can reference the renamed object directly, since the renamed
...@@ -1003,7 +1011,11 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p) ...@@ -1003,7 +1011,11 @@ Identifier_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p)
DECL_INITIAL (gnu_result)); DECL_INITIAL (gnu_result));
else else
gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result); {
gnu_result = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_result);
if (TREE_CODE (gnu_result) == INDIRECT_REF)
TREE_THIS_NOTRAP (gnu_result) = 1;
}
if (read_only) if (read_only)
TREE_READONLY (gnu_result) = 1; TREE_READONLY (gnu_result) = 1;
......
...@@ -960,14 +960,19 @@ build_binary_op (enum tree_code op_code, tree result_type, ...@@ -960,14 +960,19 @@ build_binary_op (enum tree_code op_code, tree result_type,
result result
= fold_build2 (op_code, operation_type, left_operand, right_operand); = fold_build2 (op_code, operation_type, left_operand, right_operand);
TREE_SIDE_EFFECTS (result) |= has_side_effects; if (TREE_CONSTANT (result))
TREE_CONSTANT (result) ;
|= (TREE_CONSTANT (left_operand) & TREE_CONSTANT (right_operand) else if (op_code == ARRAY_REF || op_code == ARRAY_RANGE_REF)
&& op_code != ARRAY_REF && op_code != ARRAY_RANGE_REF); {
TREE_THIS_NOTRAP (result) = 1;
if (TYPE_VOLATILE (operation_type))
TREE_THIS_VOLATILE (result) = 1;
}
else
TREE_CONSTANT (result)
|= (TREE_CONSTANT (left_operand) && TREE_CONSTANT (right_operand));
if ((op_code == ARRAY_REF || op_code == ARRAY_RANGE_REF) TREE_SIDE_EFFECTS (result) |= has_side_effects;
&& TYPE_VOLATILE (operation_type))
TREE_THIS_VOLATILE (result) = 1;
/* If we are working with modular types, perform the MOD operation /* If we are working with modular types, perform the MOD operation
if something above hasn't eliminated the need for it. */ if something above hasn't eliminated the need for it. */
...@@ -2347,6 +2352,9 @@ gnat_stabilize_reference_1 (tree e, bool force) ...@@ -2347,6 +2352,9 @@ gnat_stabilize_reference_1 (tree e, bool force)
TREE_SIDE_EFFECTS (result) |= TREE_SIDE_EFFECTS (e); TREE_SIDE_EFFECTS (result) |= TREE_SIDE_EFFECTS (e);
TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (e); TREE_THIS_VOLATILE (result) = TREE_THIS_VOLATILE (e);
if (code == INDIRECT_REF || code == ARRAY_REF || code == ARRAY_RANGE_REF)
TREE_THIS_NOTRAP (result) = TREE_THIS_NOTRAP (e);
return result; return result;
} }
......
...@@ -598,8 +598,8 @@ sched_insn_is_legitimate_for_speculation_p (const_rtx insn, ds_t ds) ...@@ -598,8 +598,8 @@ sched_insn_is_legitimate_for_speculation_p (const_rtx insn, ds_t ds)
/* The following instructions, which depend on a speculatively scheduled /* The following instructions, which depend on a speculatively scheduled
instruction, cannot be speculatively scheduled along. */ instruction, cannot be speculatively scheduled along. */
{ {
if (may_trap_p (PATTERN (insn))) if (may_trap_or_fault_p (PATTERN (insn)))
/* If instruction might trap, it cannot be speculatively scheduled. /* If instruction might fault, it cannot be speculatively scheduled.
For control speculation it's obvious why and for data speculation For control speculation it's obvious why and for data speculation
it's because the insn might get wrong input if speculation it's because the insn might get wrong input if speculation
wasn't successful. */ wasn't successful. */
......
...@@ -858,6 +858,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data) ...@@ -858,6 +858,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
*tp = fold_build2 (MEM_REF, TREE_TYPE (*tp), *tp = fold_build2 (MEM_REF, TREE_TYPE (*tp),
ptr, TREE_OPERAND (*tp, 1)); ptr, TREE_OPERAND (*tp, 1));
TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old); TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
TREE_THIS_NOTRAP (*tp) = TREE_THIS_NOTRAP (old);
} }
TREE_NO_WARNING (*tp) = TREE_NO_WARNING (old); TREE_NO_WARNING (*tp) = TREE_NO_WARNING (old);
*walk_subtrees = 0; *walk_subtrees = 0;
...@@ -1087,6 +1088,8 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data) ...@@ -1087,6 +1088,8 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
*tp = build1 (INDIRECT_REF, type, new_tree); *tp = build1 (INDIRECT_REF, type, new_tree);
TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old); TREE_THIS_VOLATILE (*tp) = TREE_THIS_VOLATILE (old);
TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old); TREE_SIDE_EFFECTS (*tp) = TREE_SIDE_EFFECTS (old);
TREE_READONLY (*tp) = TREE_READONLY (old);
TREE_THIS_NOTRAP (*tp) = TREE_THIS_NOTRAP (old);
} }
} }
*walk_subtrees = 0; *walk_subtrees = 0;
......
...@@ -3190,6 +3190,10 @@ substitute_in_expr (tree exp, tree f, tree r) ...@@ -3190,6 +3190,10 @@ substitute_in_expr (tree exp, tree f, tree r)
} }
TREE_READONLY (new_tree) |= TREE_READONLY (exp); TREE_READONLY (new_tree) |= TREE_READONLY (exp);
if (code == INDIRECT_REF || code == ARRAY_REF || code == ARRAY_RANGE_REF)
TREE_THIS_NOTRAP (new_tree) |= TREE_THIS_NOTRAP (exp);
return new_tree; return new_tree;
} }
...@@ -3357,6 +3361,10 @@ substitute_placeholder_in_expr (tree exp, tree obj) ...@@ -3357,6 +3361,10 @@ substitute_placeholder_in_expr (tree exp, tree obj)
} }
TREE_READONLY (new_tree) |= TREE_READONLY (exp); TREE_READONLY (new_tree) |= TREE_READONLY (exp);
if (code == INDIRECT_REF || code == ARRAY_REF || code == ARRAY_RANGE_REF)
TREE_THIS_NOTRAP (new_tree) |= TREE_THIS_NOTRAP (exp);
return new_tree; return new_tree;
} }
......
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