https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114965
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |jakub at gcc dot gnu.org --- Comment #10 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Untested fix. If entry_test_needed, earlier code ensures that exp is in [lowi, high] range, so the optimization is ok. But without it, we need to ensure that if we lower lowi we can still do the shifts safely. r in this case is [43,43][48,48][95,95], so we don't need entry test if we subtract the low bound (43), but 95 is too high for 64-bit prec. --- gcc/tree-ssa-reassoc.cc.jj 2023-10-15 23:04:06.181422840 +0200 +++ gcc/tree-ssa-reassoc.cc 2024-05-07 13:46:42.722966813 +0200 @@ -3414,7 +3414,8 @@ optimize_range_tests_to_bit_test (enum t We can avoid then subtraction of the minimum value, but the mask constant could be perhaps more expensive. */ if (compare_tree_int (lowi, 0) > 0 - && compare_tree_int (high, prec) < 0) + && compare_tree_int (high, prec) < 0 + && (entry_test_needed || wi::ltu_p (r.upper_bound (), prec))) { int cost_diff; HOST_WIDE_INT m = tree_to_uhwi (lowi);