https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102705
--- Comment #6 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Hmm:
iftmp.0_10 = (char) _2;
_4 = iftmp.0_10 ^ 1;
_18 = (int) _4;
We have this pattern:
/* In GIMPLE, getting rid of 2 conversions for one new results
in smaller IL. */
(simplify
(convert (bitop:cs@2 (nop_convert:s @0) @1))
(if (GIMPLE
&& TREE_CODE (@1) != INTEGER_CST
&& tree_nop_conversion_p (type, TREE_TYPE (@2))
&& types_match (type, @0)
&& !POINTER_TYPE_P (TREE_TYPE (@0))
&& TREE_CODE (TREE_TYPE (@0)) != OFFSET_TYPE)
(bitop @0 (convert @1)))))
Except here @1 is CST and the we don't exactly have a nop_conversion, though it
is a "nop" due to the nonzero-bitranges to be less than the inner type.
Maybe we could expand or create a new pattern for this ...