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 *);