From 83b853c9fc743ac4f69c9fed4fdd7d65038868e5 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 17 Apr 1997 11:33:02 +0000 Subject: [PATCH] x From-SVN: r13909 --- gcc/expr.c | 11 +++++++---- gcc/tree.c | 35 +++++++++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/gcc/expr.c b/gcc/expr.c index 7a855ad1475..672fe6bce67 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5208,10 +5208,13 @@ expand_expr (exp, target, tmode, modifier) } case RTL_EXPR: - if (RTL_EXPR_SEQUENCE (exp) == const0_rtx) - abort (); - emit_insns (RTL_EXPR_SEQUENCE (exp)); - RTL_EXPR_SEQUENCE (exp) = const0_rtx; + if (RTL_EXPR_SEQUENCE (exp)) + { + if (RTL_EXPR_SEQUENCE (exp) == const0_rtx) + abort (); + emit_insns (RTL_EXPR_SEQUENCE (exp)); + RTL_EXPR_SEQUENCE (exp) = const0_rtx; + } preserve_rtl_expr_result (RTL_EXPR_RTL (exp)); free_temps_for_rtl_expr (exp); return RTL_EXPR_RTL (exp); diff --git a/gcc/tree.c b/gcc/tree.c index f09c36a6518..f6a92e10eb9 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -2138,19 +2138,42 @@ int_size_in_bytes (type) } /* Return, as a tree node, the number of elements for TYPE (which is an - ARRAY_TYPE) minus one. This counts only elements of the top array. */ + ARRAY_TYPE) minus one. This counts only elements of the top array. + + Don't let any SAVE_EXPRs escape; if we are called as part of a cleanup + action, they would get unsaved. */ tree array_type_nelts (type) tree type; { tree index_type = TYPE_DOMAIN (type); + tree min = TYPE_MIN_VALUE (index_type); + tree max = TYPE_MAX_VALUE (index_type); + + if (! TREE_CONSTANT (min)) + { + STRIP_NOPS (min); + if (TREE_CODE (min) == SAVE_EXPR) + min = build (RTL_EXPR, TREE_TYPE (TYPE_MIN_VALUE (index_type)), 0, + SAVE_EXPR_RTL (min)); + else + min = TYPE_MIN_VALUE (index_type); + } + + if (! TREE_CONSTANT (max)) + { + STRIP_NOPS (max); + if (TREE_CODE (max) == SAVE_EXPR) + max = build (RTL_EXPR, TREE_TYPE (TYPE_MAX_VALUE (index_type)), 0, + SAVE_EXPR_RTL (max)); + else + max = TYPE_MAX_VALUE (index_type); + } - return (integer_zerop (TYPE_MIN_VALUE (index_type)) - ? TYPE_MAX_VALUE (index_type) - : fold (build (MINUS_EXPR, TREE_TYPE (TYPE_MAX_VALUE (index_type)), - TYPE_MAX_VALUE (index_type), - TYPE_MIN_VALUE (index_type)))); + return (integer_zerop (min) + ? max + : fold (build (MINUS_EXPR, TREE_TYPE (max), max, min))); } /* Return nonzero if arg is static -- a reference to an object in -- 2.30.2