http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29776
--- Comment #19 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Also, perhaps expand_builtin_unop for the int bitops builtin (ffs/parity/popcount/clz/ctz/clrsb) optabs, if target returned by expand_unop is wider than target_mode, perhaps we could set SUBREG_PROMOTED_VAR_P and !SUBREG_PROMOTED_UNSIGNED_P. When the builtins are expanded using libcall, the libcalls return int and so does the builtin, thus the target_mode should then be equal to what we have, and otherwise I'd think the result should be already extended, as in target should be the return value, not some value with target value only in the low bits. But that would require verification for all targets.