Hi Jakub, > While we have at the RTL level noce_try_ifelse_collapse combined with > simplify_cond_clz_ctz, that optimization doesn't always trigger because > e.g. on powerpc there is an define_insn to compare a reg against zero and > copy that register to another one and so we end up with a different pseudo > in the simplify_cond_clz_ctz test and punt. > > For targets that define C?Z_DEFINED_VALUE_AT_ZERO to 2 for certain modes, > we can optimize it already in phiopt though, just need to ensure that > we transform the __builtin_c?z* calls into .C?Z ifns because my recent > VRP changes codified that the builtin calls are always undefined at zero, > while ifns honor C?Z_DEFINED_VALUE_AT_ZERO equal to 2. > And, in phiopt we already have popcount handling that does pretty much the > same thing, except for always using a zero value rather than the one set > by C?Z_DEFINED_VALUE_AT_ZERO. > > So, this patch extends that function to handle not just popcount, but also > clz and ctz.
this broke sparc-sun-solaris2.11 bootstrap /vol/gcc/src/hg/master/local/gcc/tree-ssa-phiopt.c: In function 'bool cond_removal_in_popcount_clz_ctz_pattern(basic_block, basic_block, edge, edge, gimple*, tree, tree)': /vol/gcc/src/hg/master/local/gcc/tree-ssa-phiopt.c:1858:27: error: variable 'mode' set but not used [-Werror=unused-but-set-variable] 1858 | scalar_int_mode mode = SCALAR_INT_TYPE_MODE (TREE_TYPE (arg)); | ^~~~ and doubtlessly several other targets that use the defaults.h definition of #define CTZ_DEFINED_VALUE_AT_ZERO(MODE, VALUE) 0 Rainer -- ----------------------------------------------------------------------------- Rainer Orth, Center for Biotechnology, Bielefeld University