if-to-switch: fix matching of negative conditions

gcc/ChangeLog:

	PR tree-optimization/98182
	* gimple-if-to-switch.cc (pass_if_to_switch::execute): Request
	chain linkage through false edges only.

gcc/testsuite/ChangeLog:

	PR tree-optimization/98182
	* gcc.dg/tree-ssa/if-to-switch-10.c: New test.
	* gcc.dg/tree-ssa/pr98182.c: New test.
This commit is contained in:
Martin Liska 2020-12-08 13:18:37 +01:00
parent dded5f78cc
commit f7251a2c10
3 changed files with 68 additions and 0 deletions

View File

@ -522,6 +522,12 @@ pass_if_to_switch::execute (function *fun)
if (!info2 || info->m_ranges[0].exp != info2->m_ranges[0].exp)
break;
/* It is important that the blocks are linked through FALSE_EDGE.
For an expression of index != VALUE, true and false edges
are flipped. */
if (info2->m_false_edge != e)
break;
chain->m_entries.safe_push (info2);
bitmap_set_bit (seen_bbs, e->src->index);
info = info2;

View File

@ -0,0 +1,44 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-iftoswitch-optimized" } */
int global;
int foo ();
int main(int argc, char **argv)
{
if (argc != 1)
{
if (argc != 2)
{
if (argc == 3)
{
foo ();
foo ();
}
else if (argc == 4)
{
foo ();
}
else if (argc == 5)
{
global = 2;
}
else
global -= 123;
}
else
{
global += 1;
}
}
else
foo ();
global -= 12;
return 0;
}
/* { dg-final { scan-tree-dump "Canonical GIMPLE case clusters: 1 2 3 4 5" "iftoswitch" } } */
/* { dg-final { scan-tree-dump "Condition chain with \[^\n\r]\* BBs transformed into a switch statement." "iftoswitch" } } */

View File

@ -0,0 +1,18 @@
/* PR tree-optimization/98182 */
/* { dg-do compile } */
/* { dg-options "-O1 --param case-values-threshold=1 -fdump-tree-iftoswitch-optimized" } */
int global;
int foo ();
int main(int argc, char **argv)
{
if (argc != 1)
__builtin_abort ();
else if (argc != 2)
__builtin_abort ();
else
return 0;
}
/* { dg-final { scan-tree-dump-not "Condition chain" "iftoswitch" } } */