https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117476
--- Comment #11 from Alexey Merzlyakov <alexey.merzlyakov at samsung dot com>
---
Analysis shown that the problem seem is related to incorrect check in the
optimization, introduced by the aforementioned patch:
(zero_extend:M (subreg:N (not:M (X:M)))) -> (xor:M (X:M, mask))
In this patch the condition
(nonzero_bits (XEXP (XEXP (op, 0), 0), mode)
& ~GET_MODE_MASK (mode)) == 0)
should verify that X:M doesn't have any non-zero bits outside of mode N.
However, it seems that the in the last part of this check I've made a mistake.
To verify the "outside mode N" part, we need to change
& ~GET_MODE_MASK (mode)) == 0)
to the:
& ~GET_MODE_MASK(GET_MODE (op))) == 0)
as "op" is in "N" mode, not in "mode" (M) itself.
If this turns out to be true, I will elaborate a patch to fix this issue in the
coming days.