[Bug rtl-optimization/84071] [7/8 regression] wrong elimination of zero-extension after sign-extended load

wilco at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Jan 31 12:56:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84071

--- Comment #15 from Wilco <wilco at gcc dot gnu.org> ---
(In reply to Eric Botcazou from comment #10)
> > The addition is performed on the full 32-bit register, so this obviously
> > means that the top 24 bits have an undefined value.
> 
> Not if the entire registers have a defined value before the addition.  The
> point of WORD_REGISTER_OPERATIONS is the following: you have a pair of
> SImode registers with known values and you do a QImode addition on them.  If
> the macro is defined, then the compiler considers that the result has a
> defined value in SImode.

That's the best description of WORD_REGISTER_OPERATIONS I've seen - maybe we
should fix the docs to be clearer? Also I wonder whether this means AArch64
should set it since targets like MIPS and Sparc already set it.

> In any case, that's not really the issue here and I'll just fix the combiner.

Thanks for fixing this. I'm still not convinced that the logic of this is
right:

          if ((!WORD_REGISTER_OPERATIONS
               /* If this is a typical RISC machine, we only have to worry
                  about the way loads are extended.  */
               || ((extend_op = load_extend_op (inner_mode)) == SIGN_EXTEND
                   ? val_signbit_known_set_p (inner_mode, nonzero)
                   : extend_op != ZERO_EXTEND)
               || (!MEM_P (SUBREG_REG (x)) && !REG_P (SUBREG_REG (x))))
              && xmode_width > inner_width)

So assuming WORD_REGISTER_OPERATIONS and load_extend_op is ZERO_EXTEND, we fall
into the (!MEM_P (SUBREG_REG (x)) && !REG_P (SUBREG_REG (x))). But that
effectively means that load_extend_op applies to REG_P as well as MEM_P, which
can't be right...


More information about the Gcc-bugs mailing list