https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65752
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |rguenth at gcc dot gnu.org
--- Comment #14 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Chung-Kil Hur from comment #13)
> Hi, I have the following modified code.
>
> #include <stdio.h>
> #include <stdint.h>
> #include <limits.h>
>
> int main() {
> int x = 0, *p = 0;
> uintptr_t i;
> uintptr_t j = (uintptr_t) &x;
> uintptr_t k = j+j;
> uintptr_t l = 2*j - j - j;
> for (i = j+j-k+l; ; i++) {
> if (i == (uintptr_t)&x) { p = (int*)i; break; }
> }
> *p = 15;
>
> printf("%d\n", x);
> }
>
> This example still prints out "0" instead of "15".
> In this example, it seems that the integer "j+j-k+l" has no provenance.
> It is unclear to me how the provenance is calculated.
> Is there any concrete rule for calculating provenance?
early PTA computes
p_13, points-to non-local, points-to vars: { D.2349 }
p_13 = (intD.6 *) i_1;
*p_13 = 15;
x.1_15 = xD.2349;
while late PTA has an IL with just the equivalency (the rest is optimized
away)
p_6, points-to non-local, points-to NULL, points-to vars: { }
j_4 = (uintptr_t) &x;
<bb 3>:
# i_1 = PHI <0(2), i_5(5)>
if (i_1 == j_4)
goto <bb 4>;
else
goto <bb 5>;
<bb 4>:
p_6 = (int *) i_1;
*p_6 = 15;
x.1_8 = x;
so it hits essentially the same issue (the testcase is equivalent to the
original one).