On December 8, 2020 2:35:35 PM GMT+01:00, "Martin Liška" <mli...@suse.cz> wrote:
>We must be careful which edge we follow for conditions
>of a negative form (index != 2).
>
>Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
>Ready to be installed?

Ok. 

Richard. 

>Thanks,
>Martin
>
>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.
>---
>  gcc/gimple-if-to-switch.cc                    |  6 +++
> .../gcc.dg/tree-ssa/if-to-switch-10.c         | 44 +++++++++++++++++++
>  gcc/testsuite/gcc.dg/tree-ssa/pr98182.c       | 18 ++++++++
>  3 files changed, 68 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-10.c
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr98182.c
>
>diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc
>index 8e1043ae7c4..311f6f6ac97 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 00000000000..7b8da1c9f3c
>--- /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 00000000000..29a547e3788
>--- /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" } }
>*/

Reply via email to