This is the mail archive of the
mailing list for the GCC project.
Re: Mysterious decision in combine
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: vogt at linux dot vnet dot ibm dot com, gcc at gcc dot gnu dot org
- Date: Tue, 22 Mar 2016 19:09:14 -0500
- Subject: Re: Mysterious decision in combine
- Authentication-results: sourceware.org; auth=none
- References: <20160317063531 dot GA5065 at linux dot vnet dot ibm dot com> <56EB11EC dot 4030305 at redhat dot com> <20160321133151 dot GA22208 at linux dot vnet dot ibm dot com>
On Mon, Mar 21, 2016 at 02:31:51PM +0100, Dominik Vogt wrote:
> On Thu, Mar 17, 2016 at 01:22:04PM -0700, Richard Henderson wrote:
> > On 03/16/2016 11:35 PM, Dominik Vogt wrote:
> Now combine tries to combine
> (parallel [
> (set (reg:SI 64)
> (and:SI (mem:SI (reg:DI 2 %r2 [ a ]) [1 *a_2(D)+0 S4 A32])
> (const_int -65521 [0xffffffffffff000f])))
> (clobber (reg:CC 33 %cc))
> (set (reg:DI 65)
> (zero_extend:DI (reg:SI 64)))
> Why does it drop the "parallel" and "clobber" in the combination;
> is there a way to force combine to keep that?
Nope, and it really shouldn't. Combine tries to keep the clobbers that
were on the insn that is combined into (your zero_extend), but not the
clobbers from all the insns it is integrating. If the resulting insn
does not match without clobbers, but would match with clobbers (any
clobbers, not just those that were on the original insns) it adds those.
[ The "preferably keep clobbers" makes sure that an "add" stays an "add"
and isn't turned into a "lea". Many other transforms however do just that
anyway; it would be a nice cleanup if combine could just drop the clobbers
as well. ]
> Trying 6 -> 7:
> Failed to match this instruction:
> (set (reg:DI 65)
> (and:DI (subreg:DI (mem:SI (reg:DI 2 %r2 [ a ]) [1 *a_2(D)+0 S4 A32]) 0)
> (const_int 4294901775 [0xffff000f])))
> (Because all "and" instructions on s390 clobber the CC, this
> pattern does not match anything without the clobber.)
As Richard says, the pattern wouldn't match with clobbers included either;
if it did, combine would handle this just as you want.