[Bug tree-optimization/68963] [4.9/5/6 Regression] O3 vs. O2 discards part of loop and terminates early
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Feb 24 09:19:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68963
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
Ok, I think the issue is really in record_nonwrapping_iv doing
wide_int min, max;
extreme = fold_convert (unsigned_type, high);
if (TREE_CODE (orig_base) == SSA_NAME
&& TREE_CODE (low) == INTEGER_CST
&& INTEGRAL_TYPE_P (TREE_TYPE (orig_base))
&& get_range_info (orig_base, &min, &max) == VR_RANGE
&& wi::gts_p (min, low))
base = wide_int_to_tree (unsigned_type, min);
else if (TREE_CODE (base) != INTEGER_CST)
base = fold_convert (unsigned_type, low);
delta = fold_build2 (MINUS_EXPR, unsigned_type, extreme, base);
and for the non-constant (no-range-info) base case simply assuming it's
'low' (the array types low bound). We can't simply treat low - base as
zero and ignore those upfront iterations. If base were -1 then we'd correctly
add 1 to the upper bound.
Only if the stmt is always executed we can drop base to low (and we could
do that always, not just if base is an INTEGER_CST, so we can have
base = MIN (base, low) in that case - not at this time though).
So, different patch in testing.
More information about the Gcc-bugs
mailing list