tree.h (TREE_THIS_NOTRAP): Use TREE_CHECK5.
authorIan Lance Taylor <iant@google.com>
Mon, 11 Oct 2010 14:56:39 +0000 (14:56 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 11 Oct 2010 14:56:39 +0000 (14:56 +0000)
* 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

gcc/ChangeLog
gcc/emit-rtl.c
gcc/gimplify.c
gcc/tree.h

index 7fdb21ed54504979bc0a79daef36332efd748c8f..41e39be8e52b4f6ecd50933b33d0475d37a8a8d0 100644 (file)
@@ -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.
index 3115523fb8ca0122d1a65a42925f9baf82ba5a4b..01dd70ab567a73e3347bff6cf593d001ca4a3252 100644 (file)
@@ -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);
index 994ffdecea26a8b9c94c5263bcb21baac3349b16..029ad03f36477119452c7f17396b605801cfec9a 100644 (file)
@@ -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;
          }
index 330c84909736e9d3aeee1816fbcdc41d70d0953f..8aedf1a9207a44eea80cd71bdc1296fc35bf908c 100644 (file)
@@ -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