> So, my first approach was trying to simplify that, because nonzero_bits
> on the subreg operand say that no bits outside of QImode may be non-zero,
> both the zero_extend and subreg can be dropped.  That is the simplify-rtx.c
> change.  Then I've figured out that combine.c doesn't actually attempt to
> simplify this anyway, so that is the combine.c change.  And lastly an i386
> pattern was needed anyway.  I've also attempted to simplify:
> (zero_extend:SI (subreg:QI (and:DI <something> (const_int 63)) 0))
> into
> (subreg:SI (and:DI <something> (const_int 63)) 0) (very small change in
> simplify-rtx.c, just drop the requirement that zero_extend mode is as wide
> or wider than SUBREG_REG's mode, and when it is <= use gen_lowpart_no_emit
> instead of just returning the SUBREG_REG, but that unfortunately regressed
> the test1 case, we'd need some further i386.md tweaks.
> While in theory this folding looks like a useful simplification, because
> of this I'm wondering if other backends don't rely on those actually not
> being simplified.
> 
> So, I've as an alternative implemented also an i386.md only fix.
> 
> Thus, do we want the first patch, or first patch + also the
> above described further simplify-rtx.c change + some further i386.md tweaks,
> or just the second patch instead?

Given the look of the pattern in the second patch, I think we definitely want 
to simplify upstream.  The first simplification looks very natural to me, the 
further tweaked one less so, so let's go for the first patch alone, with a 
small tweak:

+      /* (zero_extend:M (subreg:N <X:O>)) is <X:O> (for M == O) or
+        (zero_extend:M <X:O>), if X doesn't have any bits outside of N mode
+        non-zero.  E.g.

"if X doesn't have any non-zero bits outside of mode N."

-- 
Eric Botcazou

Reply via email to