https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110679
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2023-07-15 Target| |x86_64-linux-gnu Component|middle-end |tree-optimization Keywords| |missed-optimization Severity|normal |enhancement Status|UNCONFIRMED |NEW Ever confirmed|0 |1 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Confirmed, simplified testcase: ``` int tst(unsigned char &x) { if (!x) return 8; return __builtin_ctz(x); } int tst1(unsigned char &x) { unsigned t = x; t |= 256; return __builtin_ctz(t); } ``` Something like: ``` (simplify (cond (ne @0 integer_zerop) (CTZ (convert@2 @0)) (INTEGER_CST@1)) (if (TYPE_UNSIGNED (TREE_TYPE (@0)) && TYPE_PRECISION (TREE_TYPE (@0)) < TYPE_PRECISION (type) && wi::to_wide (@1) == TYPE_PRECISION (TREE_TYPE (@0))) (CTZ (bit_ior @2 { build_int_cst (1u << (TYPE_PRECISION (TREE_TYPE (@0)) - 1), TREE_TYPE (@2)); })) ``` Note this is not exactly correct as `1u <<` won't work always, need to use wide_int with the type precision of type. Also it won't work as phiopt does not handle the extra cast yet.