[Bug middle-end/71474] New: PRED_LOOP_IV_COMPARE wrongly calculates number of iterations of a loop
marxin at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Jun 9 14:22:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71474
Bug ID: 71474
Summary: PRED_LOOP_IV_COMPARE wrongly calculates number of
iterations of a loop
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: marxin at gcc dot gnu.org
Target Milestone: ---
Hello.
During investigation of poor predictor 'loop iv compare' heuristics, I've come
to a problematic test-case:
subroutine rubber(arg1, arg2)
integer k,l
real*8 arg1(3,3,3), arg2(3,3,3)
do l=1,3
do k=1,l
arg1(k,l,1) = arg2(k,l,1)
enddo
enddo
end
042t.profile_estimate gimple looks as follows:
<bb 3>:
# l_13 = PHI <1(2), l_28(8)>
if (l_13 > 0)
goto <bb 4>;
else
goto <bb 6>;
<bb 4>:
# k_6 = PHI <1(3)>
<bb 5>:
# k_12 = PHI <k_6(4), k_26(9)>
_1 = (integer(kind=8)) l_13;
_2 = _1 * 3;
_3 = (integer(kind=8)) k_12;
_4 = _2 + _3;
_5 = _4 + -4;
_11 = *arg2_22(D)[_5];
*arg1_23(D)[_5] = _11;
k_26 = k_12 + 1;
if (k_12 == l_13)
goto <bb 6>;
else
goto <bb 9>;
<bb 9>:
goto <bb 5>;
<bb 6>:
l_28 = l_13 + 1;
if (l_13 == 3)
goto <bb 7>;
else
goto <bb 8>;
<bb 8>:
goto <bb 3>;
<bb 7>:
return;
Problem is that is_comparison_with_loop_invariant_p is called for the gimple
compare in BB 3 (if (l_13 > 0)),
which does not determine a number of iterations of the loop. As a result we get
confusing loop_bound_step, loop_iv_base
that are eventually used by predict_iv_comparison to calculate the misleading
probability:
loop iv compare heuristics of edge 3->4: 0.0%
While the proper value should be 100% as l_13 is always a positive number.
More information about the Gcc-bugs
mailing list