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))
>     ])
> 
> and
> 
>   (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.


Segher

Reply via email to