This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
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