X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Fcse.c;h=ce6edcd7599cb234fe2a3bd915b9f892742e8b0c;hp=8ec610f48255bc28bed9209ea5e33b509b0a3ed4;hb=4fd216d574350d23961db14d4b25f74ed20905f8;hpb=cee7491d23c19bbe3104115a4804075ab4df176e diff --git a/gcc/cse.c b/gcc/cse.c index 8ec610f4825..ce6edcd7599 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -2538,16 +2538,26 @@ exp_equiv_p (rtx x, rtx y, int validate, bool for_gcse) case MEM: if (for_gcse) { - /* Can't merge two expressions in different alias sets, since we - can decide that the expression is transparent in a block when - it isn't, due to it being set with the different alias set. */ - if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y)) - return 0; - /* A volatile mem should not be considered equivalent to any other. */ if (MEM_VOLATILE_P (x) || MEM_VOLATILE_P (y)) return 0; + + /* Can't merge two expressions in different alias sets, since we + can decide that the expression is transparent in a block when + it isn't, due to it being set with the different alias set. + + Also, can't merge two expressions with different MEM_ATTRS. + They could e.g. be two different entities allocated into the + same space on the stack (see e.g. PR25130). In that case, the + MEM addresses can be the same, even though the two MEMs are + absolutely not equivalent. + + But because really all MEM attributes should be the same for + equivalent MEMs, we just use the invariant that MEMs that have + the same attributes share the same mem_attrs data structure. */ + if (MEM_ATTRS (x) != MEM_ATTRS (y)) + return 0; } break; @@ -3088,7 +3098,7 @@ find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2, || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT && code == LT && STORE_FLAG_VALUE == -1) #ifdef FLOAT_STORE_FLAG_VALUE - || (SCALAR_FLOAT_MODE_P (arg1) + || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1)) && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)), REAL_VALUE_NEGATIVE (fsfv))) #endif @@ -3098,7 +3108,7 @@ find_comparison_args (enum rtx_code code, rtx *parg1, rtx *parg2, || (GET_MODE_CLASS (GET_MODE (arg1)) == MODE_INT && code == GE && STORE_FLAG_VALUE == -1) #ifdef FLOAT_STORE_FLAG_VALUE - || (SCALAR_FLOAT_MODE_P (arg1) + || (SCALAR_FLOAT_MODE_P (GET_MODE (arg1)) && (fsfv = FLOAT_STORE_FLAG_VALUE (GET_MODE (arg1)), REAL_VALUE_NEGATIVE (fsfv))) #endif @@ -3946,7 +3956,7 @@ fold_rtx (rtx x, rtx insn) enum machine_mode mode_arg1; #ifdef FLOAT_STORE_FLAG_VALUE - if (SCALAR_FLOAT_MODE (mode)) + if (SCALAR_FLOAT_MODE_P (mode)) { true_rtx = (CONST_DOUBLE_FROM_REAL_VALUE (FLOAT_STORE_FLAG_VALUE (mode), mode)); @@ -7666,7 +7676,7 @@ cse_cc_succs (basic_block bb, rtx cc_reg, rtx cc_src, bool can_change_mode) /* If we have a fixed condition code register (or two), walk through the instructions and try to eliminate duplicate assignments. */ -void +static void cse_condition_code_reg (void) { unsigned int cc_regno_1;