https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125405
--- Comment #6 from Milan Tripkovic <[email protected]> --- Hello, Thank you for the suggestions. I updated the pattern incorporating the feedback from comments #3, #4, and #5: (simplify (minus (bit_and @0 INTEGER_CST@1) (bit_and @0 integer_pow2p@2)) (if (INTEGRAL_TYPE_P (type) && TYPE_PRECISION (type) <= MAX_FIXED_MODE_SIZE && wi::to_wide (@1) + 1 == wi::to_wide (@2)) (with { int width = wi::exact_log2 (wi::to_wide (@2)) + 1; tree ntype = NULL_TREE; if (width > 0 && width < TYPE_PRECISION (type)) ntype = build_nonstandard_integer_type (width, SIGNED); } (if (ntype && type_has_mode_precision_p (ntype)) (convert (convert:ntype @0)))))) I tested the updated pattern on RISC-V (rv64gc) covering: standard long/int types, _BitInt with power-of-2 widths (32), non-power-of-2 widths (33, 37, 63), unsigned BitInt types, negative cases where the pattern should not fire. Example tests are available at: https://godbolt.org/z/4ndW7rG9W The asm outputs with my pattern are shown in the comments in the test file.
