re PR tree-optimization/78819 (Wrong code with VRP caused by register assertions along default switch labels)

PR tree-optimization/78819
	* tree-vrp.c (find_switch_asserts): Return if the insertion limit is 0.
	Don't register an assertion if the default case shares a label with
	another case.

	* gcc.dg/tree-ssa/vrp112.c: New test.

From-SVN: r243746
This commit is contained in:
Marek Polacek 2016-12-16 14:19:44 +00:00 committed by Marek Polacek
parent ed2def05fe
commit 6b520e8d4a
4 changed files with 52 additions and 0 deletions

View file

@ -1,3 +1,10 @@
2016-12-16 Marek Polacek <polacek@redhat.com>
PR tree-optimization/78819
* tree-vrp.c (find_switch_asserts): Return if the insertion limit is 0.
Don't register an assertion if the default case shares a label with
another case.
2016-12-16 Wilco Dijkstra <wdijkstr@arm.com>
* config/arm/arm.md (subsi3_carryin): Add Thumb-2 RSC #0.

View file

@ -1,3 +1,8 @@
2016-12-16 Marek Polacek <polacek@redhat.com>
PR tree-optimization/78819
* gcc.dg/tree-ssa/vrp112.c: New test.
2016-12-16 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt61.adb: New test.

View file

@ -0,0 +1,31 @@
/* PR tree-optimization/78819 */
/* { dg-do run } */
/* { dg-options "-O2" } */
__attribute__((noinline, noclone)) void
foo (int argc)
{
if (argc <= 0 || argc > 3)
return;
switch (argc)
{
case 1:
case 3:
if (argc != 3)
__builtin_abort ();
break;
case 2:
asm ("");
break;
default:
__builtin_abort ();
}
}
int
main (void)
{
foo (3);
return 0;
}

View file

@ -6051,10 +6051,17 @@ find_switch_asserts (basic_block bb, gswitch *last)
/* Now register along the default label assertions that correspond to the
anti-range of each label. */
int insertion_limit = PARAM_VALUE (PARAM_MAX_VRP_SWITCH_ASSERTIONS);
if (insertion_limit == 0)
return;
/* We can't do this if the default case shares a label with another case. */
tree default_cl = gimple_switch_default_label (last);
for (idx = 1; idx < n; idx++)
{
tree min, max;
tree cl = gimple_switch_label (last, idx);
if (CASE_LABEL (cl) == CASE_LABEL (default_cl))
continue;
min = CASE_LOW (cl);
max = CASE_HIGH (cl);
@ -6065,6 +6072,8 @@ find_switch_asserts (basic_block bb, gswitch *last)
{
tree next_min, next_max;
tree next_cl = gimple_switch_label (last, idx);
if (CASE_LABEL (next_cl) == CASE_LABEL (default_cl))
break;
next_min = CASE_LOW (next_cl);
next_max = CASE_HIGH (next_cl);