From: Andrew Pinski <pinskia@gmail.com>
To: Li Jia He <helijia@linux.ibm.com>
Cc: Jeff Law <law@redhat.com>, GCC Patches <gcc-patches@gcc.gnu.org>,
Segher Boessenkool <segher@kernel.crashing.org>,
wschmidt@linux.ibm.com, Richard Guenther <rguenther@suse.de>
Subject: Re: [PATCH][middle-end/88784] Middle end is missing some optimizations about unsigned
Date: Fri, 28 Jun 2019 17:02:00 -0000 [thread overview]
Message-ID: <CA+=Sn1mgUXkEBQTzp5Nv5gcANtpZeutisEtQbez_L7xgg39ppw@mail.gmail.com> (raw)
In-Reply-To: <6d333ccf-9905-e929-c2dc-fc611ff929f1@linux.ibm.com>
On Thu, Jun 27, 2019 at 9:55 PM Li Jia He <helijia@linux.ibm.com> wrote:
>
>
>
> On 2019/6/27 11:48 PM, Jeff Law wrote:
> > On 6/27/19 12:11 AM, Li Jia He wrote:
> >> Hi,
> >>
> >> According to the optimizable case described by Qi Feng on
> >> issue 88784, we can combine the cases into the following:
> >>
> >> 1. x > y && x != XXX_MIN --> x > y
> >> 2. x > y && x == XXX_MIN --> false
> >> 3. x <= y && x == XXX_MIN --> x == XXX_MIN
> >>
> >> 4. x < y && x != XXX_MAX --> x < y
> >> 5. x < y && x == XXX_MAX --> false
> >> 6. x >= y && x == XXX_MAX --> x == XXX_MAX
> >>
> >> 7. x > y || x != XXX_MIN --> x != XXX_MIN
> >> 8. x <= y || x != XXX_MIN --> true
> >> 9. x <= y || x == XXX_MIN --> x <= y
> >>
> >> 10. x < y || x != XXX_MAX --> x != UXXX_MAX
> >> 11. x >= y || x != XXX_MAX --> true
> >> 12. x >= y || x == XXX_MAX --> x >= y
> >>
> >> Note: XXX_MIN represents the minimum value of type x.
> >> XXX_MAX represents the maximum value of type x.
> >>
> >> Here we don't need to care about whether the operation is
> >> signed or unsigned. For example, in the below equation:
> >>
> >> 'x > y && x != XXX_MIN --> x > y'
> >>
> >> If the x type is signed int and XXX_MIN is INT_MIN, we can
> >> optimize it to 'x > y'. However, if the type of x is unsigned
> >> int and XXX_MIN is 0, we can still optimize it to 'x > y'.
> >>
> >> The regression testing for the patch was done on GCC mainline on
> >>
> >> powerpc64le-unknown-linux-gnu (Power 9 LE)
> >>
> >> with no regressions. Is it OK for trunk ?
> >>
> >> Thanks,
> >> Lijia He
> >>
> >> gcc/ChangeLog
> >>
> >> 2019-06-27 Li Jia He <helijia@linux.ibm.com>
> >> Qi Feng <ffengqi@linux.ibm.com>
> >>
> >> PR middle-end/88784
> >> * gimple-fold.c (and_comparisons_contain_equal_operands): New function.
> >> (and_comparisons_1): Use and_comparisons_contain_equal_operands.
> >> (or_comparisons_contain_equal_operands): New function.
> >> (or_comparisons_1): Use or_comparisons_contain_equal_operands.
> > Would this be better done via match.pd? ISTM this transformation would
> > be well suited for that framework.
>
> Hi, Jeff
>
> I did this because of the following test case:
> `
> _Bool comp(unsigned x, unsigned y)
> {
> return x > y && x != 0;
> }
> `
> The gimple file dumped on the power platform is:
> `
> comp (unsigned int x, unsigned int y)
> {
> _Bool D.2837;
> int iftmp.0;
>
> if (x > y) goto <D.2841>; else goto <D.2839>;
> <D.2841>:
> if (x != 0) goto <D.2842>; else goto <D.2839>;
> <D.2842>:
> iftmp.0 = 1;
> goto <D.2840>;
> <D.2839>:
> iftmp.0 = 0;
> <D.2840>:
> D.2837 = (_Bool) iftmp.0;
> return D.2837;
> }
> `
> However, the gimple file dumped on x86 is
> `
> comp (unsigned int x, unsigned int y)
> {
> _Bool D.2837;
>
> _1 = x > y;
> _2 = x != 0;
> _3 = _1 & _2;
> _4 = (int) _3;
> D.2837 = (_Bool) _4;
> return D.2837;
> }
> `
>
> The reason for the inconsistency between these two behaviors is param
> logical-op-non-short-circuit. If we add the pattern to the match.pd
> file, we can only optimize the situation in which the statement is in
> the same basic block (logical-op-non-short-circuit=1, x86). But for
> a cross-basic block (logical-op-non-short-circuit=0, power), match.pd
> can't handle this situation.
>
> Another reason is that I found out maybe_fold_and_comparisons and
> maybe_fold_or_comparisons are not only called by ifcombine pass but
> also by reassoc pass. Using this method can basically unify param
> logical-op-non-short-circuit=0 or 1.
As mentioned before ifcombine pass should be using gimple-match
instead of fold_build. Try converting ifcombine over to gimple-match
infrastructure and add these to match.pd.
NOTE tree-ssa-phiopt should also be moved over to gimple-match but
that is a different issue.
Thanks,
Andrew Pinski
>
> Thanks,
> Lijia He
>
> >
> > jeff
> >
>
next prev parent reply other threads:[~2019-06-28 17:02 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-27 6:12 Li Jia He
2019-06-27 15:48 ` Jeff Law
2019-06-28 4:55 ` Li Jia He
2019-06-28 17:02 ` Andrew Pinski [this message]
2019-07-01 7:31 ` Richard Biener
2019-07-02 7:41 ` Li Jia He
2019-07-02 8:09 ` Richard Biener
2019-07-02 8:51 ` Richard Biener
2019-07-16 6:54 ` Li Jia He
2019-08-30 11:16 ` Martin Liška
2019-09-05 13:01 ` Richard Biener
2019-09-05 18:47 ` Martin Liška
2019-09-06 8:01 ` Richard Biener
2019-09-06 8:04 ` Martin Liška
2019-09-06 10:13 ` [PATCH 1/2] Auto-generate maybe_fold_and/or_comparisons from match.pd Martin Liška
2019-09-09 12:23 ` Martin Liška
2019-09-09 13:10 ` Richard Biener
2019-09-09 13:40 ` Martin Liška
2019-09-09 13:42 ` Richard Biener
2019-09-09 13:45 ` Martin Liška
2019-09-09 13:55 ` Richard Biener
2019-09-10 7:40 ` Martin Liška
[not found] ` <ba4ec7b3-0d0d-ca7b-b2d9-2f34478a23f4@linux.ibm.com>
2019-09-11 8:51 ` Martin Liška
2019-09-11 11:16 ` Martin Liška
2019-09-11 12:23 ` Richard Biener
2019-09-11 13:55 ` Martin Liška
2019-09-09 13:10 ` Marc Glisse
2019-09-09 13:30 ` Martin Liška
2019-09-09 13:39 ` Richard Biener
2019-09-09 12:24 ` [PATCH 3/5] Rewrite part of and_comparisons_1 into match.pd Martin Liška
2019-09-09 13:41 ` Martin Liška
2019-09-10 7:41 ` Martin Liška
2019-09-10 11:19 ` Marc Glisse
2019-09-11 8:27 ` Martin Liška
2019-09-11 11:18 ` Martin Liška
2019-09-11 12:44 ` Richard Biener
2019-09-11 13:19 ` Martin Liška
2019-09-11 13:57 ` Martin Liška
2019-09-16 9:04 ` Richard Biener
2019-09-16 13:47 ` Martin Liška
2019-09-10 8:52 ` Bernhard Reutner-Fischer
2019-09-11 8:11 ` Martin Liška
2019-09-09 12:24 ` [PATCH 4/5] Rewrite first part of or_comparisons_1 " Martin Liška
2019-09-11 11:19 ` Martin Liška
2019-09-11 13:57 ` Martin Liška
2019-09-16 9:05 ` Richard Biener
2019-09-09 12:25 ` [PATCH 5/5] Rewrite second " Martin Liška
2019-09-11 11:19 ` Martin Liška
2019-09-11 13:57 ` Martin Liška
2019-09-16 9:07 ` Richard Biener
2019-09-16 14:23 ` Martin Liška
2019-09-05 13:17 ` [PATCH][middle-end/88784] Middle end is missing some optimizations about unsigned Richard Biener
2019-09-05 18:47 ` Martin Liška
2019-09-06 10:14 ` [PATCH 2/2] Fix PR88784, middle " Martin Liška
2019-09-11 13:08 ` Richard Biener
2019-09-11 13:56 ` Martin Liška
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CA+=Sn1mgUXkEBQTzp5Nv5gcANtpZeutisEtQbez_L7xgg39ppw@mail.gmail.com' \
--to=pinskia@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=helijia@linux.ibm.com \
--cc=law@redhat.com \
--cc=rguenther@suse.de \
--cc=segher@kernel.crashing.org \
--cc=wschmidt@linux.ibm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).