From: Segher Boessenkool <segher@kernel.crashing.org>
To: Wilco Dijkstra <wdijkstr@arm.com>
Cc: "'GCC Patches'" <gcc-patches@gcc.gnu.org>
Subject: Re: RFC: Combine of compare & and oddity
Date: Wed, 02 Sep 2015 19:56:00 -0000 [thread overview]
Message-ID: <20150902184747.GA7676@gate.crashing.org> (raw)
Message-ID: <20150902195600.NJw8kkJfMqM7B8JuFXzVWYcHuYES5m7bjKo-hPYoCDI@z> (raw)
In-Reply-To: <000e01d0e5a2$1e2f66b0$5a8e3410$@com>
Hi Wilco,
On Wed, Sep 02, 2015 at 06:09:24PM +0100, Wilco Dijkstra wrote:
> Combine canonicalizes certain AND masks in a comparison with zero into extracts of the widest
> register type. During matching these are expanded into a very inefficient sequence that fails to
> match. For example (x & 2) == 0 is matched in combine like this:
>
> Failed to match this instruction:
> (set (reg:CC 66 cc)
> (compare:CC (zero_extract:DI (subreg:DI (reg/v:SI 76 [ xD.2641 ]) 0)
> (const_int 1 [0x1])
> (const_int 1 [0x1]))
> (const_int 0 [0])))
Yes. Some processors even have specific instructions to do this.
> Failed to match this instruction:
> (set (reg:CC 66 cc)
> (compare:CC (and:DI (lshiftrt:DI (subreg:DI (reg/v:SI 76 [ xD.2641 ]) 0)
> (const_int 1 [0x1]))
> (const_int 1 [0x1]))
> (const_int 0 [0])))
This is after r223067. Combine tests only one "final" instruction; that
revision rewrites zero_ext* if it doesn't match and tries again. This
helps for processors that can do more generic masks (like rs6000, and I
believe also aarch64?): without it, you need many more patterns to match
all the zero_ext{ract,end} cases.
> Neither matches the AArch64 patterns for ANDS/TST (which is just compare and AND). If the immediate
> is not a power of 2 or a power of 2 -1 then it matches correctly as expected.
>
> I don't understand how ((x >> 1) & 1) != 0 could be a useful expansion
It is zero_extract(x,1,1) really. This is convenient for (old and embedded)
processors that have special bit-test instructions. If we now want combine
to not do this, we'll have to update all backends that rely on it.
> (it even uses shifts by 0 at
> times which are unlikely to ever match anything).
It matches fine on some targets. It certainly looks silly, and could be
expressed simpler. Patch should be simple; watch this space / remind me /
or file a PR.
> Why does combine not try to match the obvious (x &
> C) != 0 case? Single-bit and mask tests are very common, so this blocks efficient code generation on
> many targets.
They are common, and many processors had instructions for them, which is
(supposedly) why combine special-cased them.
> It's trivial to change change_zero_ext to expand extracts always into AND and remove the redundant
> subreg.
Not really trivial... Think about comparisons...
int32_t x;
((x >> 31) & 1) > 0;
// is not the same as
(x & 0x80000000) > 0; // signed comparison
(You do not easily know what the COMPARE is used for).
> However wouldn't it make more sense to never special case certain AND immediate in the first
> place?
Yes, but we need to make sure no targets regress (i.e. by rewriting patterns
for those that do). We need to know the impact of such a change, at the least.
Segher
next prev parent reply other threads:[~2015-09-02 19:49 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-02 17:09 Wilco Dijkstra
2015-09-02 18:49 ` Segher Boessenkool [this message]
2015-09-02 19:56 ` Segher Boessenkool
2015-09-03 11:51 ` Wilco Dijkstra
2015-09-03 13:57 ` Segher Boessenkool
2015-09-03 15:00 ` Wilco Dijkstra
2015-09-03 15:21 ` Andrew Pinski
2015-09-03 16:15 ` Jeff Law
2015-09-03 16:40 ` Segher Boessenkool
2015-09-03 18:56 ` Wilco Dijkstra
2015-09-03 19:05 ` Jeff Law
2015-09-03 19:20 ` Richard Sandiford
2015-09-03 21:20 ` Jeff Law
2015-09-03 19:22 ` Segher Boessenkool
2015-09-03 16:24 ` Segher Boessenkool
2015-09-03 16:36 ` Kyrill Tkachov
2015-09-03 16:44 ` Wilco Dijkstra
2015-09-03 17:27 ` Segher Boessenkool
2015-09-03 17:30 ` Oleg Endo
2015-09-03 18:53 ` Wilco Dijkstra
2015-09-03 18:42 ` Jeff Law
2015-09-03 19:06 ` Segher Boessenkool
2015-09-03 15:52 ` Jeff Law
2015-09-02 20:45 ` Jeff Law
2015-09-02 21:05 ` Segher Boessenkool
2015-09-03 15:26 ` Jeff Law
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=20150902184747.GA7676@gate.crashing.org \
--to=segher@kernel.crashing.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=wdijkstr@arm.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).