Hi.

As mentioned in the PR, the patch adds one more late pass_convert_switch
just before switch lowering.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

gcc/ChangeLog:

2019-11-13  Martin Liska  <mli...@suse.cz>

        PR tree-optimization/92005
        * passes.def: Add pass_convert_switch late.
        * tree-switch-conversion.c: Define clone
        method.

gcc/testsuite/ChangeLog:

2019-11-13  Martin Liska  <mli...@suse.cz>

        PR tree-optimization/92005
        * g++.dg/tree-ssa/pr92005.C: New test.
        * gcc.dg/tree-ssa/cswtch-2.c: Update dump file name.
        * gcc.dg/tree-ssa/cswtch-3.c: Likewise.
        * gcc.dg/tree-ssa/cswtch-4.c: Likewise.
        * gcc.dg/tree-ssa/cswtch-5.c: Likewise.
        * gcc.dg/tree-ssa/cswtch.c: Likewise.
        * gcc.dg/tree-ssa/pr36881.c: Likewise.
        * gcc.dg/tree-ssa/pr84436-1.c: Likewise.
        * gcc.dg/tree-ssa/pr84436-2.c: Likewise.
        * gcc.dg/tree-ssa/pr84436-3.c: Likewise.
        * gcc.dg/tree-ssa/pr84436-4.c: Likewise.
        * gcc.dg/tree-ssa/pr84436-5.c: Likewise.
        * gcc.dg/tree-ssa/pr88753.c: Likewise.
        * gcc.target/i386/pr45830.c: Likewise.
---
 gcc/passes.def                            |  1 +
 gcc/testsuite/g++.dg/tree-ssa/pr92005.C   | 50 +++++++++++++++++++++++
 gcc/testsuite/gcc.dg/tree-ssa/cswtch-2.c  |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/cswtch-3.c  |  4 +-
 gcc/testsuite/gcc.dg/tree-ssa/cswtch-4.c  |  4 +-
 gcc/testsuite/gcc.dg/tree-ssa/cswtch-5.c  |  4 +-
 gcc/testsuite/gcc.dg/tree-ssa/cswtch.c    |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr36881.c   |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr84436-1.c |  4 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr84436-2.c |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr84436-3.c |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr84436-4.c |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr84436-5.c |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr88753.c   |  2 +-
 gcc/testsuite/gcc.target/i386/pr45830.c   |  2 +-
 gcc/tree-switch-conversion.c              |  1 +
 16 files changed, 69 insertions(+), 17 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr92005.C


diff --git a/gcc/passes.def b/gcc/passes.def
index 798a391bd35..48204af1009 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -305,6 +305,7 @@ along with GCC; see the file COPYING3.  If not see
       POP_INSERT_PASSES ()
       NEXT_PASS (pass_simduid_cleanup);
       NEXT_PASS (pass_lower_vector_ssa);
+      NEXT_PASS (pass_convert_switch);
       NEXT_PASS (pass_lower_switch);
       NEXT_PASS (pass_cse_reciprocals);
       NEXT_PASS (pass_reassoc, false /* insert_powi_p */);
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr92005.C b/gcc/testsuite/g++.dg/tree-ssa/pr92005.C
new file mode 100644
index 00000000000..ce228b0a20c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr92005.C
@@ -0,0 +1,50 @@
+/* PR tree-optimization/92005 */
+/* { dg-options "-O2 -fdump-tree-optimized -std=c++17" } */
+
+template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
+template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;
+
+struct T0 {};
+struct T1 {};
+struct T2 {};
+struct T3 {};
+struct T4 {};
+
+struct variant
+{
+    unsigned index_;
+
+    union
+    {
+        T0 t0_;
+        T1 t1_;
+        T2 t2_;
+        T3 t3_;
+        T4 t4_;
+    };
+};
+
+template<class F> int visit( F f, variant const& v )
+{
+    switch( v.index_ )
+    {
+        case 0: return f( v.t0_ );
+        case 1: return f( v.t1_ );
+        case 2: return f( v.t2_ );
+        case 3: return f( v.t3_ );
+        case 4: return f( v.t4_ );
+        default: __builtin_unreachable();
+    }
+}
+
+int do_visit(variant const& v) {
+     return visit(overloaded{
+        [](T0 val) { return 3; },
+        [](T1 val) { return 5; },
+        [](T2 val) { return 8; },
+        [](T3 val) { return 9; },
+        [](T4 val) { return 10; }
+    }, v);
+}
+
+/* { dg-final { scan-tree-dump "CSWTCH" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-2.c b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-2.c
index 87ed7bba517..44e25ebbac1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-2.c
@@ -17,4 +17,4 @@ int h1 (X x)
     }
 }
 
-/* { dg-final { scan-tree-dump-times "CSWTCH" 0 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "CSWTCH" 0 "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-3.c b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-3.c
index b983c8fbe92..25c2e75c5a2 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-3.c
@@ -326,5 +326,5 @@ main ()
   T (f5 (231, 0), 2, { 80, 0 });
 }
 
-/* { dg-final { scan-tree-dump-times "Switch converted" 5 "switchconv" } } */
-/* { dg-final { scan-tree-dump-times "= CSWTCH" 8 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "Switch converted" 5 "switchconv1" } } */
+/* { dg-final { scan-tree-dump-times "= CSWTCH" 8 "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-4.c b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-4.c
index 857fdc03941..b4b30aa956b 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-4.c
@@ -53,5 +53,5 @@ frobulate_for_gcc (unsigned int v)
   __builtin_printf ("%s\n", s);
 }
 
-/* { dg-final { scan-tree-dump-times "Switch converted" 2 "switchconv" } } */
-/* { dg-final { scan-tree-dump-times "= CSWTCH" 2 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "Switch converted" 2 "switchconv1" } } */
+/* { dg-final { scan-tree-dump-times "= CSWTCH" 2 "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-5.c b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-5.c
index 319e565d9d0..2d0c55ba942 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cswtch-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cswtch-5.c
@@ -62,5 +62,5 @@ bar (unsigned int v, int w)
   return v + w;
 }
 
-/* { dg-final { scan-tree-dump-times "Switch converted" 2 "switchconv" } } */
-/* { dg-final { scan-tree-dump-times "= CSWTCH" 2 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "Switch converted" 2 "switchconv1" } } */
+/* { dg-final { scan-tree-dump-times "= CSWTCH" 2 "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cswtch.c b/gcc/testsuite/gcc.dg/tree-ssa/cswtch.c
index 5737a0ef3c8..e0d347b267c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/cswtch.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/cswtch.c
@@ -76,4 +76,4 @@ int main ()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump "Switch converted" "switchconv" } } */
+/* { dg-final { scan-tree-dump "Switch converted" "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr36881.c b/gcc/testsuite/gcc.dg/tree-ssa/pr36881.c
index 3f3249e015d..9dbfb2ef0a6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr36881.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr36881.c
@@ -22,4 +22,4 @@ const char *foo (int i)
 }
 
 /* { dg-final { scan-assembler-not "CSWTCH" } } */
-/* { dg-final { scan-tree-dump "need runtime relocations" "switchconv" } } */
+/* { dg-final { scan-tree-dump "need runtime relocations" "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-1.c
index a045b44c2b9..ab23d3faed5 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-1.c
@@ -31,6 +31,6 @@ int main()
 }
 
 
-/* { dg-final { scan-tree-dump-times "100 \\*" 1 "switchconv" } } */
-/* { dg-final { scan-tree-dump-times ".* \\+ 5" 1 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "100 \\*" 1 "switchconv1" } } */
+/* { dg-final { scan-tree-dump-times ".* \\+ 5" 1 "switchconv1" } } */
 /* { dg-final { scan-tree-dump-not "switch" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-2.c
index c34027a08b9..cc40b2939a2 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-2.c
@@ -63,5 +63,5 @@ lowerit(char a)
     }
 }
 
-/* { dg-final { scan-tree-dump-times "a_.*\\+ 32" 1 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "a_.*\\+ 32" 1 "switchconv1" } } */
 /* { dg-final { scan-tree-dump-not "switch" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-3.c
index 87937f30ab1..a5ae2cfe4c8 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-3.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-3.c
@@ -20,5 +20,5 @@ void f() {
   h(g);
 }
 
-/* { dg-final { scan-tree-dump-times ".* \\+ 4294967247" 1 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times ".* \\+ 4294967247" 1 "switchconv1" } } */
 /* { dg-final { scan-tree-dump-not "switch" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-4.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-4.c
index 979250edd1c..e9a89f2857d 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-4.c
@@ -1,5 +1,5 @@
 /* PR tree-optimization/84436 */
-/* { dg-options "-O2 -fdump-tree-switchconv -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
 /* { dg-do run } */
 
 enum E
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-5.c b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-5.c
index e8c1337de3e..d742744c090 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr84436-5.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr84436-5.c
@@ -34,5 +34,5 @@ int main()
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "40 *\\*" 1 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "40 *\\*" 1 "switchconv1" } } */
 /* { dg-final { scan-tree-dump-not "switch" "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr88753.c b/gcc/testsuite/gcc.dg/tree-ssa/pr88753.c
index eaefc38962f..ab6ca9d1ec9 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr88753.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr88753.c
@@ -54,4 +54,4 @@ int main(int argc, char **argv)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Linear transformation with A = 1 and B = 256" 1 "switchconv" } } */
+/* { dg-final { scan-tree-dump-times "Linear transformation with A = 1 and B = 256" 1 "switchconv1" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr45830.c b/gcc/testsuite/gcc.target/i386/pr45830.c
index dfe1b0d1a01..f4b88feba19 100644
--- a/gcc/testsuite/gcc.target/i386/pr45830.c
+++ b/gcc/testsuite/gcc.target/i386/pr45830.c
@@ -26,5 +26,5 @@ foo (int *a)
     }
 }
 
-/* { dg-final { scan-tree-dump "expanding as bit test is preferable" "switchconv" } } */
+/* { dg-final { scan-tree-dump "expanding as bit test is preferable" "switchconv1" } } */
 /* { dg-final { scan-assembler-not "CSWTCH" } } */
diff --git a/gcc/tree-switch-conversion.c b/gcc/tree-switch-conversion.c
index e741f56b520..8f4b9994732 100644
--- a/gcc/tree-switch-conversion.c
+++ b/gcc/tree-switch-conversion.c
@@ -2368,6 +2368,7 @@ public:
   {}
 
   /* opt_pass methods: */
+  opt_pass * clone () { return new pass_convert_switch { m_ctxt }; }
   virtual bool gate (function *) { return flag_tree_switch_conversion != 0; }
   virtual unsigned int execute (function *);
 

Reply via email to