From 5b96563396509c4a9537f5a047cbef9143ae3ec1 Mon Sep 17 00:00:00 2001 From: rth Date: Tue, 7 May 2002 05:44:26 +0000 Subject: [PATCH] PR c++/6212 * expr.c (highest_pow2_factor_for_type): New. (expand_assignment): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53249 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 16 +++++++++++----- gcc/expr.c | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c13d5e7116d..0c54cdeb82f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,8 +1,14 @@ +2002-05-06 Richard Henderson + + PR c++/6212 + * expr.c (highest_pow2_factor_for_type): New. + (expand_assignment): Use it. + 2002-05-06 Aldy Hernandez - * config/rs6000/rs6000.md ("altivec_mtvscr"): Change to - unspec_volatile. - ("altivec_mfvscr"): Same. + * config/rs6000/rs6000.md ("altivec_mtvscr"): Change to + unspec_volatile. + ("altivec_mfvscr"): Same. 2002-05-06 Janis Johnson @@ -26,7 +32,7 @@ PR opt/3995 * fold-const.c (sign_bit_p): New function. (fold) [EQ_EXPR]: Use this to convert (A & C) == 0 into A >= 0 and - (A & C) != 0 into A < 0, when constant C is the sign bit of A's type. + (A & C) != 0 into A < 0, when constant C is the sign bit of A's type. Reapply fold when converting (A & C) == C into (A & C) != 0. (fold_binary_op_with_conditional_arg): Fix typo in comment. @@ -85,7 +91,7 @@ doc: 2002-05-06 Catherine Moore * config/v850/v850.c (compute_register_save_size): Make sure - to count all of the registers that will be saved. + to count all of the registers that will be saved. Mon May 6 18:03:11 CEST 2002 Jan Hubicka diff --git a/gcc/expr.c b/gcc/expr.c index dc4c3356286..84443e014e6 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -147,6 +147,7 @@ static rtx store_field PARAMS ((rtx, HOST_WIDE_INT, int)); static rtx var_rtx PARAMS ((tree)); static HOST_WIDE_INT highest_pow2_factor PARAMS ((tree)); +static HOST_WIDE_INT highest_pow2_factor_for_type PARAMS ((tree, tree)); static int is_aligning_offset PARAMS ((tree, tree)); static rtx expand_increment PARAMS ((tree, int, int)); static void do_jump_by_parts_greater PARAMS ((tree, int, rtx, rtx)); @@ -3707,7 +3708,8 @@ expand_assignment (to, from, want_value, suggest_reg) } to_rtx = offset_address (to_rtx, offset_rtx, - highest_pow2_factor (offset)); + highest_pow2_factor_for_type (TREE_TYPE (to), + offset)); } if (GET_CODE (to_rtx) == MEM) @@ -5934,6 +5936,21 @@ highest_pow2_factor (exp) return 1; } + +/* Similar, except that it is known that the expression must be a multiple + of the alignment of TYPE. */ + +static HOST_WIDE_INT +highest_pow2_factor_for_type (type, exp) + tree type; + tree exp; +{ + HOST_WIDE_INT type_align, factor; + + factor = highest_pow2_factor (exp); + type_align = TYPE_ALIGN (type) / BITS_PER_UNIT; + return MAX (factor, type_align); +} /* Return an object on the placeholder list that matches EXP, a PLACEHOLDER_EXPR. An object "matches" if it is of the type of the -- 2.11.4.GIT