This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Generating gimple assign stmt that changes sign
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: kugan dot vivekanandarajah at linaro dot org
- Cc: GCC Development <gcc at gcc dot gnu dot org>
- Date: Tue, 22 May 2018 10:58:29 +0200
- Subject: Re: Generating gimple assign stmt that changes sign
- References: <CAELXzTPFZNNkb_Jqbmtnah58C5NAzMARFPPxqQ5BRBFoi=u9qw@mail.gmail.com>
On Tue, May 22, 2018 at 12:51 AM Kugan Vivekanandarajah <
kugan.vivekanandarajah@linaro.org> wrote:
> Hi,
> I am looking to introduce ABSU_EXPR and that would create:
> unsigned short res = ABSU_EXPR (short);
> Note that the argument is signed and result is unsigned. As per the
> review, I have a match.pd entry to generate this as:
> (simplify (abs (convert @0))
> (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0)))
> (convert (absu @0))))
This would convert abs ((int) unsigned_int_var) to (int) absu
(unsigned_int_var)
which is bogus given it results in -1 for abs (-1). You want to restrict
this to
sign-extensions, thus !TYPE_UNSIGNED (TREE_TYPE (@0)) && !TYPE_UNSIGNED
(type)
&& element_precision (type) < element_precision (TREE_TYPE (@0))
> Now when gimplifying the converted tree, how do we tell that ABSU_EXPR
> will take a signed arg and return unsigned. I will have other match.pd
> entries so this will be generated while in gimple.passes too. Should I
> add new functions in gimple.[h|c] for this.
As Marc says you can use sth like
(with { tree utype = unsigned_type_for (TREE_TYPE (@0)); }
(convert (absu:utype @0))
or you can hack genmatch to recognize ABSU_EXPR.
> Is there any examples I can refer to. Conversion expressions seems to
> be the only place where sign can change in gimple assignment but they
> are very specific.
> Thanks,
> Kugan