[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-28 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

--- Comment #8 from Jakub Jelinek jakub at gcc dot gnu.org ---
(In reply to Richard Biener from comment #4)
 For h we get into the loop PHI handling code which drops to INF-1 if it
 iterates
 too much.  The rest probably ripples down from that.
 
 I can't see where that [1, 0x7ff] issue happens.

Current trunk, -O2 -fdump-tree-vrp-details on the testcase has in vrp1 dump:
  bb 2:
  g.0_9 = g;
  if (g.0_9  0)
goto bb 3;
  else
goto bb 9;

  bb 3:
  _12 = -g.0_9;
  i_13 = (long int) _12;
  goto bb 9;

and

Visiting statement:
_12 = -g.0_25;
Found new range for _12: [1, +INF(OVF)]
marking stmt to be not simulated again

Visiting statement:
i_13 = (long int) _12;
Found new range for i_13: [1, +INF(OVF)]
marking stmt to be not simulated again

The point was that the cast from 32-bit signed to 64-bit signed also should
imply that the value is not bigger than INT_MAX, and that is what we would do
if range for _12 was say [1, 0x7fff].

And for h, the point was that if only constants are assigned to the variable in
a loop, then no matter how many iterations the loop has, the resulting value
will only be one of the constants (thus smallest range covering those).
Or in this particular case, as the h = 1 assignments is only in endless loop,
we could have computed just [0, 0] (but that is probably too rare to care
about).


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-28 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

--- Comment #10 from Jakub Jelinek jakub at gcc dot gnu.org ---
I meant in the first loop.
But we handle:
int b, c, e;

long
foo (int x, int y)
{
  long h = 0;
  for (b = 0; b  x; b++)
for (c = 0; c  y; c++)
  if (e)
h = 1;
  return h + 4;
}
correctly, it is only as soon as one of those loops turns into endless loop:
int b, c, e;

long
foo (int x, int y)
{
  long h = 0;
  for (b = 0; b  x; b++)
for (c = 0; c  y;)
  if (e)
h = 1;
  return h + 4;
}
that we lose track.  But, if it is only for endless loops, probably nothing to
worry about, the finite loops are much more important.


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-28 Thread rguenther at suse dot de
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

--- Comment #9 from rguenther at suse dot de rguenther at suse dot de ---
On Tue, 28 Apr 2015, jakub at gcc dot gnu.org wrote:

 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875
 
 --- Comment #8 from Jakub Jelinek jakub at gcc dot gnu.org ---
 (In reply to Richard Biener from comment #4)
  For h we get into the loop PHI handling code which drops to INF-1 if it
  iterates
  too much.  The rest probably ripples down from that.
  
  I can't see where that [1, 0x7ff] issue happens.
 
 Current trunk, -O2 -fdump-tree-vrp-details on the testcase has in vrp1 dump:
   bb 2:
   g.0_9 = g;
   if (g.0_9  0)
 goto bb 3;
   else
 goto bb 9;
 
   bb 3:
   _12 = -g.0_9;
   i_13 = (long int) _12;
   goto bb 9;
 
 and
 
 Visiting statement:
 _12 = -g.0_25;
 Found new range for _12: [1, +INF(OVF)]
 marking stmt to be not simulated again
 
 Visiting statement:
 i_13 = (long int) _12;
 Found new range for i_13: [1, +INF(OVF)]
 marking stmt to be not simulated again
 
 The point was that the cast from 32-bit signed to 64-bit signed also should
 imply that the value is not bigger than INT_MAX, and that is what we would do
 if range for _12 was say [1, 0x7fff].

Yeah, but we _explicitely_ special-case the +INF(OVF) case in the source
range assuming arbitrary overflow and thus use +INF(OVF) in the 
destination range as well.  Probably for warnings or whatever (I don't
like that OVF stuff anyway).

 And for h, the point was that if only constants are assigned to the 
 variable in a loop, then no matter how many iterations the loop has, the 
 resulting value will only be one of the constants (thus smallest range 
 covering those). Or in this particular case, as the h = 1 assignments is 
 only in endless loop, we could have computed just [0, 0] (but that is 
 probably too rare to care about).

But h also gets subtracted 1 as well.  It is the PHI node

h_2 = PHI 0(7), h_21(19)

that causes the issue via the

  /* To prevent infinite iterations in the algorithm, derive ranges
 when the new value is slightly bigger or smaller than the
 previous one.  We don't do this if we have seen a new executable
 edge; this helps us avoid an overflow infinity for conditionals
 which are not in a loop.  If the old value-range was VR_UNDEFINED
 use the updated range and iterate one more time.  */
  if (edges  0
   gimple_phi_num_args (phi)  1
   edges == old_edges
   lhs_vr-type != VR_UNDEFINED)

code as we go from

Visiting PHI node: h_2 = PHI 0(7), h_21(19)
Argument #0 (7 - 8 executable)
0: [0, 0]
Argument #1 (19 - 8 executable)
h_21: [0, 0]
Meeting
  [0, 0]
and
  [0, 0]
to
  [0, 0]

to

Simulating statement (from ssa_edges): h_2 = PHI 0(7), h_21(19)

Visiting PHI node: h_2 = PHI 0(7), h_21(19)
Argument #0 (7 - 8 executable)
0: [0, 0]
Argument #1 (19 - 8 executable)
h_21: [0, 1]
Meeting
  [0, 0]
and
  [0, 1]
to
  [0, 1]
Intersecting
  [0, 9223372036854775806]
and
  [-INF, +INF]
to
  [0, 9223372036854775806]
Found new range for h_2: [0, 9223372036854775806]

as the range grows we drop to +INF - 1 (to give the next iteration
the chance to compute wheter it will overflow - previously we dropped
to +INF(OVF) immediately).

Yes, we can do some more iterating or instead of dropping right away
to +INF - 1 we could go towards +INF in log (+INF) steps.  It's all
a question about compile-time vs. accuracy in rare(?) cases.

Yes, if we have a way to statically compute a good range estimate
(like we try with adjust_range_with_scev) then that's of course
even better.  I don't see anything obvious here though.


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-27 Thread rguenth at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

--- Comment #4 from Richard Biener rguenth at gcc dot gnu.org ---
(In reply to Jakub Jelinek from comment #3)
 Created attachment 35395 [details]
 gcc5-pr65875.patch
 
 Untested fix.  IMHO vrp_visit_phi_node was missing the vr_result VR_VARING
 handling if the value range turned into varying only during
 update_value_range, and also update_value_range wasn't telling the caller if
 it changed it into varying late.
 
 That said, the testcase has conditionally undefined variable, and checking
 whether all the VRP decisions (first and second pass) are sane, would be
 nice, Richard, could you please have a look?
 E.g. I find it strange that h has VR [0, LONG_MAX] before VRP2, when it
 really has just values 0 or 1, so should be ideally [0, 1].  Or that i has
 value range [1, LONG_MAX] - it is conditionally undefined (that is ignored),
 and conditionally negation of an int variable (only if that int variable is
 negative).  The negated int variable is [1, +INF(OVF)] because INT_MIN might
 overflow, perhaps if we really need to preserve the OVF flag, we have to use
 [1, +INF(OVF)] again rather than just [1, 0x7fff] :(.

For h we get into the loop PHI handling code which drops to INF-1 if it
iterates
too much.  The rest probably ripples down from that.

I can't see where that [1, 0x7ff] issue happens.


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-27 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

--- Comment #6 from Jakub Jelinek jakub at gcc dot gnu.org ---
Author: jakub
Date: Mon Apr 27 12:21:17 2015
New Revision: 222461

URL: https://gcc.gnu.org/viewcvs?rev=222461root=gccview=rev
Log:
PR tree-optimization/65875
* tree-vrp.c (update_value_range): If in is_new case setting
old_vr to VR_VARYING, also set new_vr to it.  Remove
old_vr-type == VR_VARYING test.
(vrp_visit_phi_node): Return SSA_PROP_VARYING instead of
SSA_PROP_INTERESTING if update_value_range returned true,
but new range is VR_VARYING.

* gcc.c-torture/compile/pr65875.c: New test.

Added:
branches/gcc-5-branch/gcc/testsuite/gcc.c-torture/compile/pr65875.c
Modified:
branches/gcc-5-branch/gcc/ChangeLog
branches/gcc-5-branch/gcc/testsuite/ChangeLog
branches/gcc-5-branch/gcc/tree-vrp.c


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-27 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

Jakub Jelinek jakub at gcc dot gnu.org changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution|--- |FIXED

--- Comment #7 from Jakub Jelinek jakub at gcc dot gnu.org ---
Fixed.


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-27 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

--- Comment #5 from Jakub Jelinek jakub at gcc dot gnu.org ---
Author: jakub
Date: Mon Apr 27 11:26:12 2015
New Revision: 222458

URL: https://gcc.gnu.org/viewcvs?rev=222458root=gccview=rev
Log:
PR tree-optimization/65875
* tree-vrp.c (update_value_range): If in is_new case setting
old_vr to VR_VARYING, also set new_vr to it.  Remove
old_vr-type == VR_VARYING test.
(vrp_visit_phi_node): Return SSA_PROP_VARYING instead of
SSA_PROP_INTERESTING if update_value_range returned true,
but new range is VR_VARYING.

* gcc.c-torture/compile/pr65875.c: New test.

Added:
trunk/gcc/testsuite/gcc.c-torture/compile/pr65875.c
Modified:
trunk/gcc/ChangeLog
trunk/gcc/testsuite/ChangeLog
trunk/gcc/tree-vrp.c


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-24 Thread trippels at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

Markus Trippelsdorf trippels at gcc dot gnu.org changed:

   What|Removed |Added

 CC||trippels at gcc dot gnu.org
Summary|internal compiler error |[5/6 Regression] ICE:
   |with gcc 5.1|Segmentation fault

--- Comment #2 from Markus Trippelsdorf trippels at gcc dot gnu.org ---
int a, b, c, d, e, f, g;
void
fn1 ()
{
  long h = 0, i;
  if (g  0)
i = -g;
  for (; b;)
for (; c;)
  if (e)
h = 1;
  for (; f;)
if (a)
  break;
  if (h  i)
while (h  i)
  {
d = 0;
h--;
  }
}


[Bug tree-optimization/65875] [5/6 Regression] ICE: Segmentation fault

2015-04-24 Thread jakub at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65875

Jakub Jelinek jakub at gcc dot gnu.org changed:

   What|Removed |Added

 CC||jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek jakub at gcc dot gnu.org ---
Created attachment 35395
  -- https://gcc.gnu.org/bugzilla/attachment.cgi?id=35395action=edit
gcc5-pr65875.patch

Untested fix.  IMHO vrp_visit_phi_node was missing the vr_result VR_VARING
handling if the value range turned into varying only during update_value_range,
and also update_value_range wasn't telling the caller if it changed it into
varying late.

That said, the testcase has conditionally undefined variable, and checking
whether all the VRP decisions (first and second pass) are sane, would be nice,
Richard, could you please have a look?
E.g. I find it strange that h has VR [0, LONG_MAX] before VRP2, when it really
has just values 0 or 1, so should be ideally [0, 1].  Or that i has value range
[1, LONG_MAX] - it is conditionally undefined (that is ignored), and
conditionally negation of an int variable (only if that int variable is
negative).  The negated int variable is [1, +INF(OVF)] because INT_MIN might
overflow, perhaps if we really need to preserve the OVF flag, we have to use
[1, +INF(OVF)] again rather than just [1, 0x7fff] :(.