re PR tree-optimization/59358 (Infinite loop generated with >=O2)

PR tree-optimization/59358
	* tree-vrp.c (union_ranges): To check for the partially
	overlapping ranges or adjacent ranges, also compare *vr0max
	with vr1max.

	* gcc.c-torture/execute/pr59358.c: New test.

From-SVN: r205607
This commit is contained in:
Jakub Jelinek 2013-12-02 23:41:23 +01:00
parent 165b9e9352
commit 5ef0de9b1f
4 changed files with 59 additions and 3 deletions

View File

@ -1,4 +1,11 @@
2013-12-02 Sterling Augustine  <saugustine@google.com>
2013-12-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/59358
* tree-vrp.c (union_ranges): To check for the partially
overlapping ranges or adjacent ranges, also compare *vr0max
with vr1max.
2013-12-02 Sterling Augustine  <saugustine@google.com>
* dwarf2out.c (output_pubnames): Use comp_unit_die ()->die_offset
when there isn't a skeleton die.

View File

@ -1,5 +1,8 @@
2013-12-02 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/59358
* gcc.c-torture/execute/pr59358.c: New test.
PR lto/59326
* gcc.target/i386/i386.exp (check_effective_target_avx2): Move to...
* lib/target-supports.exp (check_effective_target_avx2): ... here.

View File

@ -0,0 +1,44 @@
/* PR tree-optimization/59358 */
__attribute__((noinline, noclone)) int
foo (int *x, int y)
{
int z = *x;
if (y > z && y <= 16)
while (y > z)
z *= 2;
return z;
}
int
main ()
{
int i;
for (i = 1; i < 17; i++)
{
int j = foo (&i, 16);
int k;
if (i >= 8 && i <= 15)
k = 16 + (i - 8) * 2;
else if (i >= 4 && i <= 7)
k = 16 + (i - 4) * 4;
else if (i == 3)
k = 24;
else
k = 16;
if (j != k)
__builtin_abort ();
j = foo (&i, 7);
if (i >= 7)
k = i;
else if (i >= 4)
k = 8 + (i - 4) * 2;
else if (i == 3)
k = 12;
else
k = 8;
if (j != k)
__builtin_abort ();
}
return 0;
}

View File

@ -7758,7 +7758,8 @@ union_ranges (enum value_range_type *vr0type,
}
else if ((operand_less_p (vr1min, *vr0max) == 1
|| operand_equal_p (vr1min, *vr0max, 0))
&& operand_less_p (*vr0min, vr1min) == 1)
&& operand_less_p (*vr0min, vr1min) == 1
&& operand_less_p (*vr0max, vr1max) == 1)
{
/* [ ( ] ) or [ ]( ) */
if (*vr0type == VR_RANGE
@ -7792,7 +7793,8 @@ union_ranges (enum value_range_type *vr0type,
}
else if ((operand_less_p (*vr0min, vr1max) == 1
|| operand_equal_p (*vr0min, vr1max, 0))
&& operand_less_p (vr1min, *vr0min) == 1)
&& operand_less_p (vr1min, *vr0min) == 1
&& operand_less_p (vr1max, *vr0max) == 1)
{
/* ( [ ) ] or ( )[ ] */
if (*vr0type == VR_RANGE