https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100790
--- Comment #3 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Aldy Hernandez <al...@gcc.gnu.org>: https://gcc.gnu.org/g:f1555d4013ed3cae2589270436387063d1c2f1a3 commit r12-1562-gf1555d4013ed3cae2589270436387063d1c2f1a3 Author: Aldy Hernandez <al...@redhat.com> Date: Thu May 13 13:47:41 2021 -0400 Cleanup clz and ctz code in range_of_builtin_call. These are various cleanups to the clz/ctz code. First, ranges from range_of_expr are always numeric so we should adjust. Also, the checks for non-zero were assuming the argument was unsigned, which in the PR's testcase is clearly not. I've cleaned this up, so that it works either way. I've also removed the following annoying idiom: - int newmini = prec - 1 - wi::floor_log2 (r.upper_bound ()); - if (newmini == prec) This is really a check for r.upper_bound() == 0, as floor_log2(0) returns -1. It's confusing. Tested on x86-64 Linux. gcc/ChangeLog: PR tree-optimization/100790 * gimple-range.cc (range_of_builtin_call): Cleanup clz and ctz code. gcc/testsuite/ChangeLog: * gcc.dg/pr100790.c: New test.