https://gcc.gnu.org/g:4bcdfc8bda79ca4540832262a901359e120de800
commit r16-5528-g4bcdfc8bda79ca4540832262a901359e120de800 Author: Pan Li <[email protected]> Date: Sat Nov 15 11:20:37 2025 +0800 Match: Simplify (T1)(a bit_op (T2)b) to (T1)a bit_op (T1)b During the match pattern of SAT_U_MUL form 7, we found there is a pattern like below: (nop_convert)(a bit_op (convert b)) which result in the pattern match of SAT_U_MUL complicated and unintuitive. According to the suggestion of Richard, we would like to simply it to blew: (convert a) bit_op (convert b) which is more friendly for reading and bit_op. There are three bit_op here, aka bit_ior, bit_and and bit_xor. gcc/ChangeLog: * match.pd: Add simplfy to fold outer convert of bit_op to inner captures. Signed-off-by: Pan Li <[email protected]> Diff: --- gcc/match.pd | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/match.pd b/gcc/match.pd index 63d56b081925..22b1bd054b0e 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2310,7 +2310,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && types_match (type, @0) && !POINTER_TYPE_P (TREE_TYPE (@0)) && TREE_CODE (TREE_TYPE (@0)) != OFFSET_TYPE) - (bitop @0 (convert @1))))) + (bitop @0 (convert @1)))) + /* Similar as above, but @0 has a widen type. */ + (simplify + (convert (bitop:cs@2 (convert:s @0) @1)) + (if (GIMPLE + && INTEGRAL_TYPE_P (type) + && INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && TREE_CODE (@1) != INTEGER_CST + && tree_nop_conversion_p (type, TREE_TYPE (@2)) + && !POINTER_TYPE_P (TREE_TYPE (@0)) + && TREE_CODE (TREE_TYPE (@0)) != OFFSET_TYPE + && TYPE_PRECISION (TREE_TYPE (@0)) > TYPE_PRECISION (type)) + (bitop:type (convert @0) (convert @1))))) (for bitop (bit_and bit_ior) rbitop (bit_ior bit_and)
