diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-01-18 08:45:12 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-01-18 08:45:12 +0100 |
commit | e7ef91dc8eb398de7b6c780b00f1360dafd84798 (patch) | |
tree | 020c8a49163b7cf9347b1c3455970378ec548bc7 /gcc/expmed.c | |
parent | fb70168707ecbe4175c069f6c36baa8986a075bd (diff) | |
download | gcc-e7ef91dc8eb398de7b6c780b00f1360dafd84798.zip gcc-e7ef91dc8eb398de7b6c780b00f1360dafd84798.tar.gz gcc-e7ef91dc8eb398de7b6c780b00f1360dafd84798.tar.bz2 |
re PR rtl-optimization/47299 (Widening multiply optimization generates bad code)
PR rtl-optimization/47299
* expr.c (expand_expr_real_2) <case WIDEN_MULT_EXPR>: Don't use
subtarget. Use normal multiplication if both operands are
constants.
* expmed.c (expand_widening_mult): Don't try to optimize constant
multiplication if op0 has VOIDmode. Convert op1 constant to mode
before using it.
* gcc.c-torture/execute/pr47299.c: New test.
From-SVN: r168944
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 24aedcc..f17abb5 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -1,7 +1,8 @@ /* Medium-level subroutines: convert bit-field store and extract and shifts, multiplies and divides to rtl instructions. Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011 Free Software Foundation, Inc. This file is part of GCC. @@ -3188,12 +3189,17 @@ expand_widening_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target, int unsignedp, optab this_optab) { bool speed = optimize_insn_for_speed_p (); + rtx cop1; if (CONST_INT_P (op1) - && (INTVAL (op1) >= 0 + && GET_MODE (op0) != VOIDmode + && (cop1 = convert_modes (mode, GET_MODE (op0), op1, + this_optab == umul_widen_optab)) + && CONST_INT_P (cop1) + && (INTVAL (cop1) >= 0 || GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT)) { - HOST_WIDE_INT coeff = INTVAL (op1); + HOST_WIDE_INT coeff = INTVAL (cop1); int max_cost; enum mult_variant variant; struct algorithm algorithm; |