This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Extend widening_mul pass to handle fixed-point types


On 07/27/2010 02:18 PM, Ramana Radhakrishnan wrote:
> 
> On Mon, 2010-07-19 at 23:53 +0200, Bernd Schmidt wrote:
>> That's pretty much what I had in mind.  Ok if it passes testing.
> 
> This broke bootstraps on arm-linux-gnueabi and caused
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45067 . 
> 
> Taking a brief look at it this morning, I think the problem here is that
> the call to optab_for_tree_code is made with the wrong type of the
> expression. The presence of a widening optab for a WIDEN_MULT_PLUS_EXPR
> should be based on the type of ops->op2 rather than opnd0 because you
> have something like intval0 = shortval1 * shortval2 + intval1 whereas
> the expander is testing for a widening mult and plus where the results
> are into a HImode value and thus effectively for a widening operation
> into an HImode value.
> 
> The assert that fails is because 
> gcc_assert (icode != CODE_FOR_nothing);
> 
> Something like this fixes the problem for the test-cases under question
> or would you prefer something else. A full bootstrap and test is
> underway.
> 
> Ok to commit if no regressions ? 

I think this is consistent with the code in tree-ssa-math-opts (there we
use the type of the lhs, which should match that of operand 2).  So, OK
- I think the ARM testsuite has some widening-macc cases so you should
notice if there's something wrong.

> +    {
> +      widen_pattern_optab =
> +       optab_for_tree_code (ops->code, TREE_TYPE (ops->op2),
> optab_default);
> +      icode = (int) optab_handler (widen_pattern_optab,
>                                  TYPE_MODE (TREE_TYPE (ops->op2)));
> +    }
>    else
> -    icode = (int) optab_handler (widen_pattern_optab, tmode0);
> +    {
> +      widen_pattern_optab =
> +       optab_for_tree_code (ops->code, TREE_TYPE (oprnd0),
> optab_default);
> +      icode = (int) optab_handler (widen_pattern_optab, tmode0);
> +    }

This can be written slightly more simply assigning the type to some
variable and then using that when computing widen_pattern_optab and
icode.  It would be nice to change that but I won't require it.


Bernd


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]