https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86882
--- Comment #6 from Uroš Bizjak <ubizjak at gmail dot com> ---
(In reply to Segher Boessenkool from comment #5)
> So what is wrong about that? CONST_INTs are sign-extended always, so
> 0xffffffffffffff00 is just fine?
As said in Comment #2, it is not wrong, just suspicious.
(insn 10 9 11 3 (set (reg:SI 94 [ <retval> ])
(zero_extend:SI (reg:QI 92 [ <retval> ]))) "pr86882.c":10 140
{*zero_extendqisi2}
(nil))
(insn 11 10 13 3 (parallel [
(set (reg:SI 95 [ jd ])
(xor:SI (reg:SI 94 [ <retval> ])
(const_int 257 [0x101])))
(clobber (reg:CC 17 flags))
]) "pr86882.c":10 461 {*xorsi_1}
(expr_list:REG_DEAD (reg:SI 94 [ <retval> ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil))))
(insn 13 11 14 3 (parallel [
(set (reg:HI 97)
(xor:HI (subreg:HI (reg:SI 95 [ jd ]) 0)
(subreg:HI (reg:QI 92 [ <retval> ]) 0)))
(clobber (reg:CC 17 flags))
]) "pr86882.c":11 459 {*xorhi_1}
(expr_list:REG_DEAD (reg:SI 95 [ jd ])
(expr_list:REG_DEAD (reg:QI 92 [ <retval> ])
(expr_list:REG_UNUSED (reg:CC 17 flags)
(nil)))))
gets combined to:
Trying 10, 11 -> 13:
Successfully matched this instruction:
(set (reg:HI 95 [ jd ])
(and:HI (subreg:HI (reg:QI 92 [ <retval> ]) 0)
(const_int -256 [0xffffffffffffff00])))
Successfully matched this instruction:
(set (reg:HI 97)
(xor:HI (reg:HI 95 [ jd ])
(const_int 257 [0x101])))
The first one operates on paradoxical HImode subreg of QImode input operand
(valid bitmask 0xff), which is masked with 0xff00. The result is a value, which
has only highpart unmasked and lowpart = 0x00. Later, a couple instructions
operate in HImode, but finally we get to:
(insn 14 13 15 3 (set (reg:QI 92 [ <retval> ])
(subreg:QI (reg:HI 97) 0)) "pr86882.c":11 88 {*movqi_internal}
(nil))
which discards paradoxical highpart from the Himode operations. So, I guess the
above is OK (but I didn't check the validity of XOR and AND simplifications in
different modes).
It looks to me that the invalid RTX from comment #1 should read:
(set (reg:QI 97)
(const_int 1 [0x1]))