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:
parent
ed2def05fe
commit
6b520e8d4a
4 changed files with 52 additions and 0 deletions
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
31
gcc/testsuite/gcc.dg/tree-ssa/vrp112.c
Normal file
31
gcc/testsuite/gcc.dg/tree-ssa/vrp112.c
Normal 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;
|
||||
}
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue