diff options
author | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-26 10:10:25 +0000 |
---|---|---|
committer | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-06-26 10:10:25 +0000 |
commit | 010d0641f1741e7eb160b49ccd521e089828ef2a (patch) | |
tree | 739670d850e2307e3f9aad81c8740a8637a62fbc /gcc | |
parent | 03f82960596423fbb9557105a2c87ad83e00dc6c (diff) | |
download | ppe42-gcc-010d0641f1741e7eb160b49ccd521e089828ef2a.tar.gz ppe42-gcc-010d0641f1741e7eb160b49ccd521e089828ef2a.zip |
2004-06-26 Andrew Haley <aph@redhat.com>
* emit-rtl.c (set_mem_attributes_minus_bitpos): Check
TREE_THIS_NOTRAP when setting MEM_NOTRAP_P.
* tree-eh.c (tree_could_trap_p): Check TREE_THIS_NOTRAP.
* tree.h (TREE_THIS_NOTRAP): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@83706 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/emit-rtl.c | 1 | ||||
-rw-r--r-- | gcc/tree-eh.c | 4 | ||||
-rw-r--r-- | gcc/tree.h | 9 |
4 files changed, 20 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cebde31bc92..21586cea537 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-06-26 Andrew Haley <aph@redhat.com> + + * emit-rtl.c (set_mem_attributes_minus_bitpos): Check + TREE_THIS_NOTRAP when setting MEM_NOTRAP_P. + * tree-eh.c (tree_could_trap_p): Check TREE_THIS_NOTRAP. + * tree.h (TREE_THIS_NOTRAP): New. + 2004-06-26 Kaz Kojima <kkojima@gcc.gnu.org> * genattrtab.c (write_test_expr): Put a unsigned cast before diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 984f81ffd6a..91ef8e9fafd 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -1543,6 +1543,7 @@ set_mem_attributes_minus_bitpos (rtx ref, tree t, int objectp, && (TYPE_READONLY (type) || (t != type && TREE_READONLY (t)))) || (! TYPE_P (t) && TREE_CONSTANT (t))); MEM_POINTER (ref) = POINTER_TYPE_P (type); + MEM_NOTRAP_P (ref) = TREE_THIS_NOTRAP (t); /* If we are making an object of this type, or if this is a DECL, we know that it is a scalar if the type is not an aggregate. */ diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c index 21c3a1c3815..f15fe099142 100644 --- a/gcc/tree-eh.c +++ b/gcc/tree-eh.c @@ -1688,9 +1688,11 @@ tree_could_trap_p (tree expr) case IMAGPART_EXPR: case BIT_FIELD_REF: t = get_base_address (expr); - return !t || TREE_CODE (t) == INDIRECT_REF; + return !t || tree_could_trap_p (t); case INDIRECT_REF: + return (TREE_THIS_NOTRAP (expr) == false); + case TRUNC_DIV_EXPR: case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR: diff --git a/gcc/tree.h b/gcc/tree.h index 41f75d88a1e..a369827f461 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -304,6 +304,9 @@ struct tree_common GTY(()) TYPE_ALIGN_OK in ..._TYPE + TREE_THIS_NOTRAP in + INDIRECT_REF + deprecated_flag: TREE_DEPRECATED in @@ -760,6 +763,12 @@ extern void tree_operand_check_failed (int, enum tree_code, If this bit is set in an expression, so is TREE_SIDE_EFFECTS. */ #define TREE_THIS_VOLATILE(NODE) ((NODE)->common.volatile_flag) +/* Nonzero means this node will not trap. In an INDIRECT_REF, means + accessing the memory pointed to won't generate a trap. However, + this only applies to an object when used appropriately: it doesn't + mean that writing a READONLY mem won't trap. */ +#define TREE_THIS_NOTRAP(NODE) ((NODE)->common.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. */ #define TREE_READONLY(NODE) (NON_TYPE_CHECK (NODE)->common.readonly_flag) |