aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2010-10-11 14:56:39 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2010-10-11 14:56:39 +0000
commit3748f5c9d3d8f7b7c2c0c8c79b3ad605b04acaf3 (patch)
tree86d760319c5f684bb65a7955d36c6b9540156771 /gcc
parentc159751bf52d6bac1c1dfef02498bf1a32f24278 (diff)
downloadgcc-3748f5c9d3d8f7b7c2c0c8c79b3ad605b04acaf3.zip
gcc-3748f5c9d3d8f7b7c2c0c8c79b3ad605b04acaf3.tar.gz
gcc-3748f5c9d3d8f7b7c2c0c8c79b3ad605b04acaf3.tar.bz2
tree.h (TREE_THIS_NOTRAP): Use TREE_CHECK5.
* tree.h (TREE_THIS_NOTRAP): Use TREE_CHECK5. * emit-rtl.c (set_mem_attributes_minus_bitpos): Only check TREE_THIS_NOTRAP when appropriate. (get_spill_slot_decl): Don't set TREE_THIS_NOTRAP on the new VAR_DECL. * gimplify.c (gimplify_expr): Copy NOTRAP from INDIRECT_REF to newly created MEM_REF. From-SVN: r165313
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/emit-rtl.c7
-rw-r--r--gcc/gimplify.c2
-rw-r--r--gcc/tree.h12
4 files changed, 25 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7fdb21e..41e39be 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2010-10-11 Ian Lance Taylor <iant@google.com>
+
+ * tree.h (TREE_THIS_NOTRAP): Use TREE_CHECK5.
+ * emit-rtl.c (set_mem_attributes_minus_bitpos): Only check
+ TREE_THIS_NOTRAP when appropriate.
+ (get_spill_slot_decl): Don't set TREE_THIS_NOTRAP on the new
+ VAR_DECL.
+ * gimplify.c (gimplify_expr): Copy NOTRAP from INDIRECT_REF to
+ newly created MEM_REF.
+
2010-10-11 Hariharan Sandanagobalane <hariharan@picochip.com>
Nathan Froyds patch to hooks FUNCTION_ARG etc.
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 3115523..01dd70a 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1660,7 +1660,11 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp,
else
MEM_NOTRAP_P (ref) = 1;
}
- else
+ else if (TREE_CODE (base) == INDIRECT_REF
+ || TREE_CODE (base) == MEM_REF
+ || TREE_CODE (base) == TARGET_MEM_REF
+ || TREE_CODE (base) == ARRAY_REF
+ || TREE_CODE (base) == ARRAY_RANGE_REF)
MEM_NOTRAP_P (ref) = TREE_THIS_NOTRAP (base);
base = get_base_address (base);
@@ -2236,7 +2240,6 @@ get_spill_slot_decl (bool force_build_p)
DECL_ARTIFICIAL (d) = 1;
DECL_IGNORED_P (d) = 1;
TREE_USED (d) = 1;
- TREE_THIS_NOTRAP (d) = 1;
spill_slot_decl = d;
rd = gen_rtx_MEM (BLKmode, frame_pointer_rtx);
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 994ffde..029ad03 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -6798,6 +6798,7 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
case INDIRECT_REF:
{
bool volatilep = TREE_THIS_VOLATILE (*expr_p);
+ bool notrap = TREE_THIS_NOTRAP (*expr_p);
tree saved_ptr_type = TREE_TYPE (TREE_OPERAND (*expr_p, 0));
*expr_p = fold_indirect_ref_loc (input_location, *expr_p);
@@ -6818,6 +6819,7 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
TREE_OPERAND (*expr_p, 0),
build_int_cst (saved_ptr_type, 0));
TREE_THIS_VOLATILE (*expr_p) = volatilep;
+ TREE_THIS_NOTRAP (*expr_p) = notrap;
ret = GS_OK;
break;
}
diff --git a/gcc/tree.h b/gcc/tree.h
index 330c849..8aedf1a 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -601,7 +601,7 @@ struct GTY(()) tree_common {
all types
TREE_THIS_NOTRAP in
- INDIRECT_REF, ARRAY_REF, ARRAY_RANGE_REF
+ INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF, ARRAY_RANGE_REF
deprecated_flag:
@@ -1255,7 +1255,9 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
(or slice of the array) always belongs to the range of the array.
I.e. that the access will not trap, provided that the access to
the base to the array will not trap. */
-#define TREE_THIS_NOTRAP(NODE) ((NODE)->base.nothrow_flag)
+#define TREE_THIS_NOTRAP(NODE) \
+ (TREE_CHECK5 (NODE, INDIRECT_REF, MEM_REF, TARGET_MEM_REF, ARRAY_REF, \
+ ARRAY_RANGE_REF)->base.nothrow_flag)
/* In a VAR_DECL, PARM_DECL or FIELD_DECL, or any kind of ..._REF node,
nonzero means it may not be the lhs of an assignment.
@@ -1296,8 +1298,10 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
In a BLOCK, this means that the block contains variables that are used. */
#define TREE_USED(NODE) ((NODE)->base.used_flag)
-/* In a FUNCTION_DECL, nonzero means a call to the function cannot throw
- an exception. In a CALL_EXPR, nonzero means the call cannot throw. */
+/* In a FUNCTION_DECL, nonzero means a call to the function cannot
+ throw an exception. In a CALL_EXPR, nonzero means the call cannot
+ throw. We can't easily check the node type here as the C++
+ frontend also uses this flag (for AGGR_INIT_EXPR). */
#define TREE_NOTHROW(NODE) ((NODE)->base.nothrow_flag)
/* In a CALL_EXPR, means that it's safe to use the target of the call