diff options
author | Martin Liska <mliska@suse.cz> | 2020-12-08 13:18:37 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-12-08 21:02:51 +0100 |
commit | f7251a2c103bc48775cb9726a4bebeaebde96684 (patch) | |
tree | 1c5b090164fd7d975b75e4751e904cc750171222 /gcc | |
parent | dded5f78ccb785520804444871a7b6ca4b735370 (diff) | |
download | gcc-f7251a2c103bc48775cb9726a4bebeaebde96684.zip gcc-f7251a2c103bc48775cb9726a4bebeaebde96684.tar.gz gcc-f7251a2c103bc48775cb9726a4bebeaebde96684.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/gimple-if-to-switch.cc | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-10.c | 44 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr98182.c | 18 |
3 files changed, 68 insertions, 0 deletions
diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 8e1043a..311f6f6 100644 --- a/gcc/gimple-if-to-switch.cc +++ b/gcc/gimple-if-to-switch.cc @@ -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; diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-10.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-10.c new file mode 100644 index 0000000..7b8da1c --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-10.c @@ -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" } } */ + diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr98182.c b/gcc/testsuite/gcc.dg/tree-ssa/pr98182.c new file mode 100644 index 0000000..29a547e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr98182.c @@ -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" } } */ |