From 6fbfac9226aa91f37641f562f200cd6fa35b4611 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 7 Oct 1999 20:10:09 -0400 Subject: [PATCH] expr.c (expand_expr, [...]): Set TREE_USED sooner. * expr.c (expand_expr, TARGET_EXPR): Set TREE_USED sooner. * c-decl.c (finish_struct): Use simpler method of removing elements of a singly-linked list. From-SVN: r29860 --- gcc/ChangeLog | 9 +++++++++ gcc/c-decl.c | 20 +++++++++----------- gcc/expr.c | 24 +++++++++--------------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 29f74543d3c..683e7e2c1a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Thu Oct 7 17:02:34 1999 Jason Merrill + + * expr.c (expand_expr, TARGET_EXPR): Set TREE_USED sooner. + +Thu Oct 7 17:01:58 1999 Greg McGary + + * c-decl.c (finish_struct): Use simpler method of + removing elements of a singly-linked list. + Thu Oct 7 15:23:28 1999 Michael Meissner * alpha.md (peephole2's): Comment out peephole2's that generate diff --git a/gcc/c-decl.c b/gcc/c-decl.c index b6facc753ca..37915a48e50 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -5526,17 +5526,15 @@ finish_struct (t, fieldlist, attributes) layout_type (t); - /* Delete all zero-width bit-fields from the front of the fieldlist */ - while (fieldlist - && DECL_INITIAL (fieldlist)) - fieldlist = TREE_CHAIN (fieldlist); - /* Delete all such members from the rest of the fieldlist */ - for (x = fieldlist; x;) - { - if (TREE_CHAIN (x) && DECL_INITIAL (TREE_CHAIN (x))) - TREE_CHAIN (x) = TREE_CHAIN (TREE_CHAIN (x)); - else x = TREE_CHAIN (x); - } + /* Delete all zero-width bit-fields from the fieldlist */ + { + tree *fieldlistp = &fieldlist; + while (*fieldlistp && TREE_CODE (*fieldlistp) == FIELD_DECL) + if (DECL_INITIAL (*fieldlistp)) + *fieldlistp = TREE_CHAIN (*fieldlistp); + else + fieldlistp = &TREE_CHAIN (*fieldlistp); + } /* Now we have the truly final field list. Store it in this type and in the variants. */ diff --git a/gcc/expr.c b/gcc/expr.c index 568460bebbb..79e651fc7f6 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -7128,21 +7128,11 @@ expand_expr (exp, target, tmode, modifier) tree negated = fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (exp, 1))); - /* Deal with the case where we can't negate the constant - in TYPE. */ if (TREE_UNSIGNED (type) || TREE_OVERFLOW (negated)) - { - tree newtype = signed_type (type); - tree newop0 = convert (newtype, TREE_OPERAND (exp, 0)); - tree newop1 = convert (newtype, TREE_OPERAND (exp, 1)); - tree newneg = fold (build1 (NEGATE_EXPR, newtype, newop1)); - - if (! TREE_OVERFLOW (newneg)) - return expand_expr (convert (type, - build (PLUS_EXPR, newtype, - newop0, newneg)), - target, tmode, ro_modifier); - } + /* If we can't negate the constant in TYPE, leave it alone and + expand_binop will negate it for us. We used to try to do it + here in the signed version of TYPE, but that doesn't work + on POINTER_TYPEs. */; else { exp = build (PLUS_EXPR, type, TREE_OPERAND (exp, 0), negated); @@ -7845,6 +7835,11 @@ expand_expr (exp, target, tmode, modifier) if (! ignore) target = original_target; + /* Set this here so that if we get a target that refers to a + register variable that's already been used, put_reg_into_stack + knows that it should fix up those uses. */ + TREE_USED (slot) = 1; + if (target == 0) { if (DECL_RTL (slot) != 0) @@ -7914,7 +7909,6 @@ expand_expr (exp, target, tmode, modifier) /* Mark it as expanded. */ TREE_OPERAND (exp, 1) = NULL_TREE; - TREE_USED (slot) = 1; store_expr (exp1, target, 0); expand_decl_cleanup (NULL_TREE, cleanups); -- 2.30.2