diff options
author | Andrew Pinski <apinski@cavium.com> | 2011-12-07 19:23:10 +0000 |
---|---|---|
committer | Andrew Pinski <pinskia@gcc.gnu.org> | 2011-12-07 11:23:10 -0800 |
commit | 3c411f3f2c4ed6dbc3a2c0996533dcb9d0365a8d (patch) | |
tree | 08fac1b77f70940bf7991c73eae8f8f0957d69f9 /gcc/expr.c | |
parent | 7cdd2e6c6effc66cf631589102ac6345627022c2 (diff) | |
download | gcc-3c411f3f2c4ed6dbc3a2c0996533dcb9d0365a8d.zip gcc-3c411f3f2c4ed6dbc3a2c0996533dcb9d0365a8d.tar.gz gcc-3c411f3f2c4ed6dbc3a2c0996533dcb9d0365a8d.tar.bz2 |
re PR middle-end/45416 (Code size regression from 4.4 for ARM)
2011-12-07 Andrew Pinski <apinski@cavium.com>
PR middle-end/45416
* expr.c (do_store_flag): Rewrite code that looks for BIT_AND_EXPR for
SSA-expand.
2011-12-07 Andrew Pinski <apinski@cavium.com>
PR middle-end/45416
* gcc.dg/pr45416.c: New testcase.
From-SVN: r182084
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -10563,15 +10563,22 @@ do_store_flag (sepops ops, rtx target, enum machine_mode mode) so we just call into the folder and expand its result. */ if ((code == NE || code == EQ) - && TREE_CODE (arg0) == BIT_AND_EXPR && integer_zerop (arg1) - && integer_pow2p (TREE_OPERAND (arg0, 1)) + && integer_zerop (arg1) && (TYPE_PRECISION (ops->type) != 1 || TYPE_UNSIGNED (ops->type))) { - tree type = lang_hooks.types.type_for_mode (mode, unsignedp); - return expand_expr (fold_single_bit_test (loc, - code == NE ? NE_EXPR : EQ_EXPR, - arg0, arg1, type), - target, VOIDmode, EXPAND_NORMAL); + gimple srcstmt = get_def_for_expr (arg0, BIT_AND_EXPR); + if (srcstmt + && integer_pow2p (gimple_assign_rhs2 (srcstmt))) + { + enum tree_code tcode = code == NE ? NE_EXPR : EQ_EXPR; + tree type = lang_hooks.types.type_for_mode (mode, unsignedp); + tree temp = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg1), + gimple_assign_rhs1 (srcstmt), + gimple_assign_rhs2 (srcstmt)); + temp = fold_single_bit_test (loc, tcode, temp, arg1, type); + if (temp) + return expand_expr (temp, target, VOIDmode, EXPAND_NORMAL); + } } if (! get_subtarget (target) |