From 63c8163c82c1d659dbd86a04e92e06ebd650bbb5 Mon Sep 17 00:00:00 2001 From: zack Date: Mon, 28 Apr 2003 04:13:48 +0000 Subject: [PATCH] * expr.c (expand_expr ): Always call output_constant_def, use its result instead of TREE_CST_RTL (exp). Can assume it has the form (mem (symbol_ref ".LCxxx")). (expand_expr ): Can always just extract the relevant field of a CONSTRUCTOR. (expand_expr ): Make control flow explicit. * varasm.c (output_constant_def): Can look at TREE_CST_RTL of an INTEGER_CST. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66148 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 12 ++++++++++++ gcc/expr.c | 35 +++++++++++++++-------------------- gcc/varasm.c | 2 +- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b48e5dcc6d..611b3acf9d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2003-04-27 Zack Weinberg + + * expr.c (expand_expr ): Always call + output_constant_def, use its result instead of TREE_CST_RTL (exp). + Can assume it has the form (mem (symbol_ref ".LCxxx")). + (expand_expr ): Can always just extract the + relevant field of a CONSTRUCTOR. + (expand_expr ): Make control flow explicit. + * varasm.c (output_constant_def): Can look at TREE_CST_RTL of + an INTEGER_CST. + 2003-04-27 Kazu Hirata * reload1.c (reg_set_luid): Fix a comment typo. diff --git a/gcc/expr.c b/gcc/expr.c index 6488a8088b3..0d6118778b8 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6872,22 +6872,19 @@ expand_expr (exp, target, tmode, modifier) case COMPLEX_CST: case STRING_CST: - if (! TREE_CST_RTL (exp)) - output_constant_def (exp, 1); + temp = output_constant_def (exp, 1); - /* TREE_CST_RTL probably contains a constant address. + /* temp contains a constant address. On RISC machines where a constant address isn't valid, make some insns to get that address into a register. */ - if (GET_CODE (TREE_CST_RTL (exp)) == MEM - && modifier != EXPAND_CONST_ADDRESS + if (modifier != EXPAND_CONST_ADDRESS && modifier != EXPAND_INITIALIZER && modifier != EXPAND_SUM - && (! memory_address_p (mode, XEXP (TREE_CST_RTL (exp), 0)) - || (flag_force_addr - && GET_CODE (XEXP (TREE_CST_RTL (exp), 0)) != REG))) - return replace_equiv_address (TREE_CST_RTL (exp), - copy_rtx (XEXP (TREE_CST_RTL (exp), 0))); - return TREE_CST_RTL (exp); + && (! memory_address_p (mode, XEXP (temp, 0)) + || flag_force_addr)) + return replace_equiv_address (temp, + copy_rtx (XEXP (temp, 0))); + return temp; case EXPR_WITH_FILE_LOCATION: { @@ -7300,18 +7297,12 @@ expand_expr (exp, target, tmode, modifier) } } } - /* Fall through. */ + goto normal_inner_ref; case COMPONENT_REF: - case BIT_FIELD_REF: - case ARRAY_RANGE_REF: /* If the operand is a CONSTRUCTOR, we can just extract the - appropriate field if it is present. Don't do this if we have - already written the data since we want to refer to that copy - and varasm.c assumes that's what we'll do. */ - if (code == COMPONENT_REF - && TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR - && TREE_CST_RTL (TREE_OPERAND (exp, 0)) == 0) + appropriate field if it is present. */ + if (TREE_CODE (TREE_OPERAND (exp, 0)) == CONSTRUCTOR) { tree elt; @@ -7363,7 +7354,11 @@ expand_expr (exp, target, tmode, modifier) return op0; } } + goto normal_inner_ref; + case BIT_FIELD_REF: + case ARRAY_RANGE_REF: + normal_inner_ref: { enum machine_mode mode1; HOST_WIDE_INT bitsize, bitpos; diff --git a/gcc/varasm.c b/gcc/varasm.c index 27c7843d2c3..f42f5295f12 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2567,7 +2567,7 @@ output_constant_def (exp, defer) /* We can't just use the saved RTL if this is a deferred string constant and we are not to defer anymore. */ - if (TREE_CODE (exp) != INTEGER_CST && TREE_CST_RTL (exp) + if (TREE_CST_RTL (exp) && (defer || !STRING_POOL_ADDRESS_P (XEXP (TREE_CST_RTL (exp), 0)))) return TREE_CST_RTL (exp); -- 2.11.4.GIT