public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Martin Liška" <mliska@suse.cz>
To: Richard Biener <richard.guenther@gmail.com>
Cc: Jakub Jelinek <jakub@redhat.com>,
	GCC Patches <gcc-patches@gcc.gnu.org>,
	kazu@gcc.gnu.org, Jan Hubicka <hubicka@ucw.cz>
Subject: Re: [PATCH] Add if-chain to switch conversion pass.
Date: Tue, 1 Sep 2020 13:47:56 +0200	[thread overview]
Message-ID: <42c91f11-c1a6-3ae4-08da-0a0b77f63b80@suse.cz> (raw)
In-Reply-To: <35eb0279-77d8-36f8-3ab7-afb9ae97fdb3@suse.cz>

[-- Attachment #1: Type: text/plain, Size: 516 bytes --]

Hello.

There's a new version of the patch attempt. I mentioned couple of issues with the v1 here:
https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542821.html

The patch addresses the biggest blocker which fact that the optimization was done unconditionally.
Now the transformation happens only when a bit test or (and) a jump table can be created.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests. I'm also sending list
of if-chains that are transformed in GCC.

Thoughts?
Thanks,
Martin

[-- Attachment #2: if-to-switch.txt --]
[-- Type: text/plain, Size: 77388 bytes --]

build-x86_64-pc-linux-gnu/libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:371) with 5 conditions (5 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:391) with 5 conditions (5 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:411) with 5 conditions (5 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:431) with 5 conditions (5 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/init.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/init.c:553) with 8 conditions (8 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:1856) with 27 conditions (14 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:3512) with 3 conditions (2 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:4147) with 3 conditions (2 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:4185) with 4 conditions (2 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/macro.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/macro.c:1164) with 6 conditions (6 BBs) transformed into a switch statement.
build-x86_64-pc-linux-gnu/libcpp/traditional.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/traditional.c:492) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/alias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/alias.c:2923) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/alias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/alias.c:2925) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/asan.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/asan.h:168) with 12 conditions (9 BBs) transformed into a switch statement.
gcc/attribs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/attribs.c:729) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/build/genautomata.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/genautomata.c:951) with 8 conditions (8 BBs) transformed into a switch statement.
gcc/build/gengtype.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gengtype.c:1107) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/build/gengtype.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gengtype.c:2491) with 5 conditions (4 BBs) transformed into a switch statement.
gcc/build/gengtype.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gengtype.h:344) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/build/genmatch.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/is-a.h:224) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/build/genmatch.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/is-a.h:224) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/build/genmatch.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/is-a.h:224) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/build/genoutput.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/genoutput.c:763) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/build/genpeep.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/genpeep.c:250) with 8 conditions (8 BBs) transformed into a switch statement.
gcc/build/genpreds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/genpreds.c:794) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/build/gensupport.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gensupport.c:1634) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/build/gensupport.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gensupport.c:1674) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/build/gensupport.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gensupport.c:3260) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/build/read-md.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/read-md.c:467) with 6 conditions (3 BBs) transformed into a switch statement.
gcc/build/read-rtl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/read-rtl.c:1889) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/builtins.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/asan.h:168) with 12 conditions (9 BBs) transformed into a switch statement.
gcc/builtins.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:10564) with 10 conditions (10 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:10621) with 11 conditions (11 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:10682) with 9 conditions (9 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:10734) with 9 conditions (9 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:10785) with 8 conditions (8 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:10831) with 12 conditions (12 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:12065) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/c/c-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-decl.c:7511) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/c/c-parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-parser.c:384) with 8 conditions (4 BBs) transformed into a switch statement.
gcc/c/c-typeck.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-typeck.c:2830) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/c/c-typeck.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c/c-typeck.c:8031) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/c-family/c-ada-spec.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-ada-spec.c:468) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/c-family/c-attribs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-attribs.c:1827) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/c-family/c-common.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-common.c:2872) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/c-family/c-common.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-common.c:6179) with 10 conditions (10 BBs) transformed into a switch statement.
gcc/c-family/c-format.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-format.c:2447) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/c-family/c-lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-lex.c:545) with 8 conditions (7 BBs) transformed into a switch statement.
gcc/c-family/c-omp.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-omp.c:2022) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/c-family/c-warn.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-warn.c:1796) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/c-family/c-warn.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/c-family/c-warn.c:2950) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cfgexpand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cfgexpand.c:224) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/cfgexpand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cfgexpand.c:4992) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cfgexpand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cfgexpand.c:6145) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/cgraph.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:11875) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:11890) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:11895) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:6695) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:6712) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:6750) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/combine.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/combine.c:9398) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/cp/call.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/call.c:10611) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cp/cp-gimplify.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/cp-gimplify.c:1240) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cp/cp-gimplify.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-expr.h:87) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/cp/decl2.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/decl2.c:1356) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/cp/decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/decl.c:2495) with 8 conditions (8 BBs) transformed into a switch statement.
gcc/cp/error.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/error.c:3089) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/cp/init.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/init.c:2608) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/lex.c:695) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:10890) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:11901) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:20818) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:22477) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:22896) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:24874) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:26353) with 6 conditions (5 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:29085) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:30973) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:31823) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:32669) with 12 conditions (7 BBs) transformed into a switch statement.
gcc/cp/parser.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/parser.c:7488) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/cp/pt.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/pt.c:20116) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/cp/pt.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/type-utils.h:44) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/cp/semantics.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/semantics.c:5663) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/cp/tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cp/tree.c:5388) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/cselib.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cselib.c:1004) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cselib.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cselib.c:1358) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/cselib.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cselib.c:1398) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cselib.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cselib.c:878) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/cselib.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cselib.c:974) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/diagnostic-show-locus.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/diagnostic-show-locus.c:823) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/diagnostic-show-locus.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/diagnostic-show-locus.c:830) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:14551) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:14561) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:14573) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:16918) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:20725) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:21545) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:29651) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:5412) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:7127) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:7924) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/dwarf2out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/dwarf2out.c:8615) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/emit-rtl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/emit-rtl.c:6359) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/emit-rtl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/emit-rtl.c:6380) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/expmed.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/expmed.c:1708) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/expmed.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/expmed.c:6272) with 8 conditions (8 BBs) transformed into a switch statement.
gcc/final.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/final.c:3325) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:1022) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:1025) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:1039) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:1098) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:1112) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:145) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:148) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:159) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:182) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:240) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:328) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:403) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:518) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:630) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:682) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:69) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:782) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:786) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:790) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:794) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:823) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:828) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:886) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:889) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:890) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:896) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:937) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:940) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fixed-value.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fixed-value.c:977) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:10330) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:1848) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:2100) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:2105) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:2117) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:8332) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:8719) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/fold-const.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fold-const.c:9063) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/check.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/check.c:329) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/check.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/check.c:418) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/decl.c:10381) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/decl.c:4139) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/decl.c:5457) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/decl.c:6166) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/decl.c:6178) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/dump-parse-tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/dump-parse-tree.c:1891) with 8 conditions (7 BBs) transformed into a switch statement.
gcc/fortran/dump-parse-tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/dump-parse-tree.c:3262) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/fortran/interface.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/interface.c:4091) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/intrinsic.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/intrinsic.c:4932) with 6 conditions (5 BBs) transformed into a switch statement.
gcc/fortran/match.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/match.c:173) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/match.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/match.c:214) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/match.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/match.c:2934) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/fortran/match.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/match.c:3043) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/module.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/module.c:1020) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/module.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/module.c:1042) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/module.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/module.c:3601) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/module.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/module.c:4574) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/module.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/module.c:5355) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fortran/parse.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/parse.c:1819) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fortran/parse.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/parse.c:338) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/primary.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/primary.c:1155) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/primary.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/primary.c:3892) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/resolve.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/resolve.c:1551) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fortran/resolve.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/resolve.c:1687) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/fortran/resolve.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/resolve.c:2788) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/resolve.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/resolve.c:547) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/resolve.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/resolve.c:7869) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/resolve.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/resolve.c:8061) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/scanner.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/scanner.c:1038) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/fortran/scanner.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/scanner.c:1553) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/scanner.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/scanner.c:1805) with 5 conditions (4 BBs) transformed into a switch statement.
gcc/fortran/scanner.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/scanner.c:2215) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/fortran/scanner.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/scanner.c:950) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/scanner.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/scanner.c:979) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/symbol.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/symbol.c:1766) with 7 conditions (5 BBs) transformed into a switch statement.
gcc/fortran/symbol.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/symbol.c:3703) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/symbol.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/symbol.c:5219) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/trans.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/trans.c:355) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/fortran/trans-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/trans-decl.c:5259) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/trans-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/trans-decl.c:889) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/trans-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/trans-decl.c:896) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/trans-decl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/trans-decl.c:913) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/fortran/trans-io.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fortran/trans-io.c:2410) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/fwprop.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/fwprop.c:373) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:3204) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:3428) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:3436) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:6156) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:6508) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:6530) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:9352) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:9364) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:9445) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/gcc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gcc.c:9465) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/generic-match.c.043t.iftoswitch:Condition chain (at generic-match.c:4798) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/generic-match.c.043t.iftoswitch:Condition chain (at generic-match.c:8807) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/gengtype.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gengtype.c:1107) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gengtype.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gengtype.c:2491) with 5 conditions (4 BBs) transformed into a switch statement.
gcc/gengtype.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gengtype.h:344) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/gimple.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.c:1613) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/gimple-expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-expr.h:87) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/gimple-fold.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-fold.c:900) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/gimple-fold.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-fold.c:901) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/gimple-match.c.043t.iftoswitch:Condition chain (at gimple-match.c:5041) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/gimple-match.c.043t.iftoswitch:Condition chain (at gimple-match.c:9498) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/gimple-ssa-isolate-paths.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-ssa-isolate-paths.c:480) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gimple-ssa-split-paths.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-ssa-split-paths.c:141) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/gimple-ssa-strength-reduction.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-ssa-strength-reduction.c:2137) with 7 conditions (4 BBs) transformed into a switch statement.
gcc/gimple-ssa-warn-alloca.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/gimplify.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-expr.h:87) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/gimplify.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimplify.c:6471) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:13140) with 6 conditions (3 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:16393) with 24 conditions (24 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:16405) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:1858) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19001) with 12 conditions (10 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19010) with 8 conditions (4 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19016) with 16 conditions (16 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19040) with 8 conditions (8 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19198) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19199) with 6 conditions (5 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19628) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:19644) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:20961) with 6 conditions (5 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:20963) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:2622) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:2884) with 14 conditions (14 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:3328) with 22 conditions (22 BBs) transformed into a switch statement.
gcc/i386.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.c:9860) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/i386-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386-expand.c:16909) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/i386-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386-expand.c:19452) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/i386-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386-expand.c:2706) with 9 conditions (5 BBs) transformed into a switch statement.
gcc/i386-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386-expand.c:380) with 22 conditions (22 BBs) transformed into a switch statement.
gcc/i386-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386-expand.c:401) with 22 conditions (22 BBs) transformed into a switch statement.
gcc/i386-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386-expand.c:4573) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/ifcvt.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ifcvt.c:237) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:1113) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:14363) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:1551) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:1906) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:19163) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:19390) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:2295) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:2976) with 13 conditions (10 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:4524) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:4559) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:503) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:557) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:5893) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:5992) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:872) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:910) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:910) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:922) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:20700) with 31 conditions (31 BBs) transformed into a switch statement.
gcc/insn-attrtab.c.043t.iftoswitch:Condition chain (at insn-attrtab.c:82) with 22 conditions (22 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:15509) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16158) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16158) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16171) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16171) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16391) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:20649) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:2453) with 14 conditions (8 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:26034) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-dfatab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:3326) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:15656) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16860) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16860) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16913) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:16913) with 7 conditions (7 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:17089) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:20655) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:2398) with 14 conditions (8 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:25945) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-latencytab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/i386.md:3307) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1067) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-output.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/sse.md:1185) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:1292) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:1313) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:1353) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:1737) with 9 conditions (9 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:1809) with 10 conditions (10 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:818) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:842) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/insn-preds.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/config/i386/predicates.md:850) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ipa.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ipa-fnsummary.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ipa-fnsummary.c:1248) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/ipa-icf-gimple.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ipa-icf-gimple.c:151) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ipa-inline-analysis.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ipa-inline-transform.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ipa-param-manipulation.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/ipa-utils.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ipa-utils.c:367) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/ipa-visibility.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ira-build.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ira-build.c:1839) with 8 conditions (6 BBs) transformed into a switch statement.
gcc/jump.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/jump.c:709) with 5 conditions (3 BBs) transformed into a switch statement.
gcc/jump.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/jump.c:720) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/jump.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/jump.c:730) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/loop-invariant.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/loop-invariant.c:329) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/loop-invariant.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/loop-invariant.c:397) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/lra-constraints.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/lra-constraints.c:4167) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/lra-constraints.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/lra-constraints.c:4275) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/lto/lto-common.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/lto/lto-common.c:1196) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/lto/lto-common.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/lto/lto-common.c:1411) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/lto/lto-partition.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/lto-streamer-in.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/lto-streamer-in.c:1535) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/lto-streamer-out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/lto-streamer-out.c:1216) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:1828) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:1920) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:1934) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:3809) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:3826) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:6689) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/omp-expand.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-expand.c:7179) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/omp-low.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-low.c:12888) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/omp-low.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/omp-low.c:637) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/optabs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/optabs.c:1339) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/optabs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/optabs-query.h:89) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/optabs-libfuncs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/optabs-libfuncs.c:322) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/optabs-libfuncs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/optabs-libfuncs.c:348) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/optabs-libfuncs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/optabs-libfuncs.c:361) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/optabs-libfuncs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/optabs-query.h:89) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/opts-common.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/opts-common.c:1720) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/opts-common.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/opts-common.c:384) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/predict.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/print-rtl.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/print-rtl.c:512) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/read-md.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/read-md.c:467) with 6 conditions (3 BBs) transformed into a switch statement.
gcc/read-rtl-function.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/read-rtl-function.c:1400) with 10 conditions (10 BBs) transformed into a switch statement.
gcc/recog.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/recog.c:1853) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/reg-stack.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reg-stack.c:1567) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/reload1.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload1.c:1448) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/reload1.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload1.c:1573) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/reload1.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload1.c:5565) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/reload1.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload1.c:5625) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/reload1.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload1.c:6616) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/reload1.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload1.c:8460) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/reload.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload.c:1228) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/reload.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/reload.c:6536) with 6 conditions (5 BBs) transformed into a switch statement.
gcc/rtlanal.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/rtlanal.c:1732) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/rtlanal.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/rtlanal.c:3475) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/rtlanal.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/rtlanal.c:5899) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/sanopt.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/sanopt.c:520) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/symtab.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/toplev.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/toplev.c:2221) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/trans-mem.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/trans-mem.c:375) with 10 conditions (5 BBs) transformed into a switch statement.
gcc/trans-mem.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/trans-mem.c:421) with 10 conditions (5 BBs) transformed into a switch statement.
gcc/trans-mem.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/trans-mem.c:588) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree.c:10819) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree.c:4265) with 5 conditions (4 BBs) transformed into a switch statement.
gcc/tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree.c:4278) with 5 conditions (4 BBs) transformed into a switch statement.
gcc/tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree.c:5069) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree.c:5737) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/tree-cfg.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-expr.h:87) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-cfg.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-cfg.c:5281) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-cfg.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-cfg.c:6792) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-chrec.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-chrec.c:948) with 8 conditions (7 BBs) transformed into a switch statement.
gcc/tree-data-ref.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-data-ref.c:714) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-nested.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-nested.c:1767) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-nested.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-nested.c:3027) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-nested.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-nested.c:999) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-address.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-address.c:1038) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-alias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-alias.c:3154) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-ssa-alias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-alias.c:3155) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-ssa-alias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-alias.c:371) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-alias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-alias.c:383) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa.c:1002) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-dce.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-dce.c:960) with 13 conditions (13 BBs) transformed into a switch statement.
gcc/tree-ssa-forwprop.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-loop-ivopts.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-expr.h:87) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-ssa-loop-ivopts.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-loop-ivopts.c:4322) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/tree-ssa-phiopt.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-propagate.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple-expr.h:87) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-ssa-reassoc.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-strlen.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-structalias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-structalias.c:6533) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-structalias.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-structalias.c:6624) with 6 conditions (6 BBs) transformed into a switch statement.
gcc/tree-ssa-threadbackward.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-threadbackward.c:84) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-ssa-threadedge.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-ssa-threadedge.c:1096) with 3 conditions (3 BBs) transformed into a switch statement.
gcc/tree-stdarg.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-streamer-in.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-streamer-in.c:272) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-streamer-out.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-streamer-out.c:235) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/tree-tailcall.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-tailcall.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-tailcall.c:444) with 4 conditions (4 BBs) transformed into a switch statement.
gcc/tree-vect-data-refs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-vect-data-refs.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-vect-data-refs.c:135) with 5 conditions (5 BBs) transformed into a switch statement.
gcc/tree-vect-generic.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/tree-vect-generic.c:1619) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/tree-vect-patterns.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-vect-stmts.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/tree-vrp.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/ubsan.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/gimple.h:2877) with 4 conditions (2 BBs) transformed into a switch statement.
gcc/ubsan.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ubsan.c:1452) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/ubsan.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/ubsan.c:2162) with 4 conditions (3 BBs) transformed into a switch statement.
gcc/varpool.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/cgraph.h:2791) with 3 conditions (2 BBs) transformed into a switch statement.
gcc/vr-values.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/gcc/vr-values.c:2232) with 3 conditions (2 BBs) transformed into a switch statement.
libbacktrace/dwarf.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libbacktrace/dwarf.c:3218) with 3 conditions (2 BBs) transformed into a switch statement.
libbacktrace/.libs/dwarf.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libbacktrace/dwarf.c:3218) with 3 conditions (2 BBs) transformed into a switch statement.
libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:371) with 5 conditions (5 BBs) transformed into a switch statement.
libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:391) with 5 conditions (5 BBs) transformed into a switch statement.
libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:411) with 5 conditions (5 BBs) transformed into a switch statement.
libcpp/expr.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/expr.c:431) with 5 conditions (5 BBs) transformed into a switch statement.
libcpp/init.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/init.c:553) with 8 conditions (8 BBs) transformed into a switch statement.
libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:1856) with 27 conditions (14 BBs) transformed into a switch statement.
libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:3512) with 3 conditions (2 BBs) transformed into a switch statement.
libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:4147) with 3 conditions (2 BBs) transformed into a switch statement.
libcpp/lex.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/lex.c:4185) with 4 conditions (2 BBs) transformed into a switch statement.
libcpp/macro.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/macro.c:1164) with 6 conditions (6 BBs) transformed into a switch statement.
libcpp/traditional.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libcpp/traditional.c:492) with 3 conditions (3 BBs) transformed into a switch statement.
libdecnumber/decContext.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libdecnumber/decContext.c:357) with 14 conditions (14 BBs) transformed into a switch statement.
libdecnumber/decNumber.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libdecnumber/decNumber.c:3322) with 10 conditions (10 BBs) transformed into a switch statement.
libiberty/argv.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/argv.c:315) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/cp-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/cp-demangle.c:1776) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/cp-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/cp-demangle.c:4699) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/cp-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/cp-demangle.c:6356) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/pic/argv.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/argv.c:315) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/pic/cp-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/cp-demangle.c:1776) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/pic/cp-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/cp-demangle.c:4699) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/pic/cp-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/cp-demangle.c:6356) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/pic/rust-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/rust-demangle.c:368) with 3 conditions (2 BBs) transformed into a switch statement.
libiberty/rust-demangle.c.043t.iftoswitch:Condition chain (at /home/marxin/Programming/gcc2/libiberty/rust-demangle.c:368) with 3 conditions (2 BBs) transformed into a switch statement.

[-- Attachment #3: 0001-Add-if-chain-to-switch-conversion-pass.patch --]
[-- Type: text/x-patch, Size: 37987 bytes --]

From 1b0b511bc57d1565c768bc1f424e7126fa9fa905 Mon Sep 17 00:00:00 2001
From: Martin Liska <mliska@suse.cz>
Date: Fri, 28 Aug 2020 10:26:13 +0200
Subject: [PATCH] Add if-chain to switch conversion pass.

gcc/ChangeLog:

	* Makefile.in: Add new gimple-if-to-switch.o.
	* common.opt: Add new option.
	* dbgcnt.def (DEBUG_COUNTER): Add new debug counter.
	* doc/invoke.texi:
	* opts.c:
	* passes.def: Register new pass.
	* timevar.def (TV_TREE_IF_TO_SWITCH): Add new time variable.
	* tree-pass.h (make_pass_if_to_switch): New.
	* tree-switch-conversion.h: New file.
	* gimple-if-to-switch.c: New file.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/reassoc-32.c:
	* gcc.dg/tree-ssa/if-to-switch-1.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-2.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-3.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-4.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-5.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-6.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-7.c: New test.
	* gcc.dg/tree-ssa/if-to-switch-8.c: New test.
---
 gcc/Makefile.in                               |   1 +
 gcc/common.opt                                |   4 +
 gcc/dbgcnt.def                                |   1 +
 gcc/doc/invoke.texi                           |  13 +-
 gcc/gimple-if-to-switch.c                     | 762 ++++++++++++++++++
 gcc/opts.c                                    |   1 +
 gcc/passes.def                                |   1 +
 .../gcc.dg/tree-ssa/if-to-switch-1.c          |  35 +
 .../gcc.dg/tree-ssa/if-to-switch-2.c          |  11 +
 .../gcc.dg/tree-ssa/if-to-switch-3.c          |  11 +
 .../gcc.dg/tree-ssa/if-to-switch-4.c          |  36 +
 .../gcc.dg/tree-ssa/if-to-switch-5.c          |  12 +
 .../gcc.dg/tree-ssa/if-to-switch-6.c          |  42 +
 .../gcc.dg/tree-ssa/if-to-switch-7.c          |  25 +
 .../gcc.dg/tree-ssa/if-to-switch-8.c          |  27 +
 gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c    |   2 +-
 gcc/timevar.def                               |   1 +
 gcc/tree-pass.h                               |   1 +
 gcc/tree-switch-conversion.h                  |  15 +-
 19 files changed, 993 insertions(+), 8 deletions(-)
 create mode 100644 gcc/gimple-if-to-switch.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-1.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-2.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-4.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-6.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-7.c
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 79e854aa938..782e9cfe95b 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1361,6 +1361,7 @@ OBJS = \
 	gimple-array-bounds.o \
 	gimple-builder.o \
 	gimple-expr.o \
+	gimple-if-to-switch.o \
 	gimple-iterator.o \
 	gimple-fold.o \
 	gimple-laddress.o \
diff --git a/gcc/common.opt b/gcc/common.opt
index dd68c61ae1d..80e60934f22 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1173,6 +1173,10 @@ fconserve-stack
 Common Var(flag_conserve_stack) Optimization
 Do not perform optimizations increasing noticeably stack usage.
 
+fconvert-if-to-switch
+Common Report Var(flag_convert_if_to_switch) Optimization
+Perform conversions of if-elseif chain into a switch statement.
+
 fcprop-registers
 Common Report Var(flag_cprop_registers) Optimization
 Perform a register copy-propagation optimization pass.
diff --git a/gcc/dbgcnt.def b/gcc/dbgcnt.def
index cf8775b2b66..e393e45deb4 100644
--- a/gcc/dbgcnt.def
+++ b/gcc/dbgcnt.def
@@ -170,6 +170,7 @@ DEBUG_COUNTER (if_after_combine)
 DEBUG_COUNTER (if_after_reload)
 DEBUG_COUNTER (if_conversion)
 DEBUG_COUNTER (if_conversion_tree)
+DEBUG_COUNTER (if_to_switch)
 DEBUG_COUNTER (ipa_cp_bits)
 DEBUG_COUNTER (ipa_sra_params)
 DEBUG_COUNTER (ipa_sra_retvalues)
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 5d29a7fa23c..fcaf993e2c2 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -467,7 +467,7 @@ Objective-C and Objective-C++ Dialects}.
 -fassociative-math  -fauto-profile  -fauto-profile[=@var{path}] @gol
 -fauto-inc-dec  -fbranch-probabilities @gol
 -fcaller-saves @gol
--fcombine-stack-adjustments  -fconserve-stack @gol
+-fcombine-stack-adjustments  -fconserve-stack -fconvert-if-to-switch  @gol
 -fcompare-elim  -fcprop-registers  -fcrossjumping @gol
 -fcse-follow-jumps  -fcse-skip-blocks  -fcx-fortran-rules @gol
 -fcx-limited-range @gol
@@ -534,7 +534,7 @@ Objective-C and Objective-C++ Dialects}.
 -fthread-jumps  -ftracer  -ftree-bit-ccp @gol
 -ftree-builtin-call-dce  -ftree-ccp  -ftree-ch @gol
 -ftree-coalesce-vars  -ftree-copy-prop  -ftree-dce  -ftree-dominator-opts @gol
--ftree-dse  -ftree-forwprop  -ftree-fre  -fcode-hoisting @gol
+-ftree-dse  -ftree-forwprop  -ftree-fre -fcode-hoisting @gol
 -ftree-loop-if-convert  -ftree-loop-im @gol
 -ftree-phiprop  -ftree-loop-distribution  -ftree-loop-distribute-patterns @gol
 -ftree-loop-ivcanon  -ftree-loop-linear  -ftree-loop-optimize @gol
@@ -2648,6 +2648,14 @@ Allow conditional expressions with mismatched types in the second and
 third arguments.  The value of such an expression is void.  This option
 is not supported for C++.
 
+@item -fconvert-if-to-switch
+@opindex fconvert-if-to-switch
+Perform conversion of an if cascade into a switch statement.
+Do so if the switch can be later transformed using a jump table
+or a bit test.  The transformation can help to produce faster code for
+the switch statement.  This flag is enabled by default
+at @option{-O2} and higher.
+
 @item -flax-vector-conversions
 @opindex flax-vector-conversions
 Allow implicit conversions between vectors with differing numbers of
@@ -9581,6 +9589,7 @@ also turns on the following optimization flags:
 -falign-labels  -falign-loops @gol
 -fcaller-saves @gol
 -fcode-hoisting @gol
+-fconvert-if-to-switch @gol
 -fcrossjumping @gol
 -fcse-follow-jumps  -fcse-skip-blocks @gol
 -fdelete-null-pointer-checks @gol
diff --git a/gcc/gimple-if-to-switch.c b/gcc/gimple-if-to-switch.c
new file mode 100644
index 00000000000..d67099cd614
--- /dev/null
+++ b/gcc/gimple-if-to-switch.c
@@ -0,0 +1,762 @@
+/* If-elseif-else to switch conversion pass
+   Copyright (C) 2020 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+/* Algorithm of the pass runs in the following steps:
+   a) We walk basic blocks in DOMINATOR order so that we first reach
+      a first condition of a future switch.
+   b) We follow false edges of a if-else-chain and we record chain
+      of GIMPLE conditions.  These blocks are only used for comparison
+      of a common SSA_NAME and we do not allow any side effect.
+   c) We remove all basic blocks (except first) of such chain and
+      GIMPLE switch replaces the condition in the first basic block.
+   d) We move all GIMPLE statements in the removed blocks into the
+      first one.  */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+#include "backend.h"
+#include "rtl.h"
+#include "tree.h"
+#include "gimple.h"
+#include "tree-pass.h"
+#include "ssa.h"
+#include "gimple-pretty-print.h"
+#include "fold-const.h"
+#include "gimple-iterator.h"
+#include "tree-cfg.h"
+#include "tree-dfa.h"
+#include "tree-cfgcleanup.h"
+#include "alias.h"
+#include "tree-ssa-loop.h"
+#include "diagnostic.h"
+#include "cfghooks.h"
+#include "tree-into-ssa.h"
+#include "cfganal.h"
+#include "dbgcnt.h"
+#include "target.h"
+#include "alloc-pool.h"
+#include "tree-switch-conversion.h"
+
+using namespace tree_switch_conversion;
+
+/* Tuple that holds minimum and maximum values in a case.  */
+
+struct case_range
+{
+  /* Default constructor.  */
+  case_range ():
+    m_min (NULL_TREE), m_max (NULL_TREE)
+  {}
+
+  case_range (tree min, tree max):
+    m_min (min), m_max (max)
+  {}
+
+  /* Minimum case value.  */
+  tree m_min;
+  /* Maximum case value.  */
+  tree m_max;
+};
+
+/* One entry of a if chain.  */
+
+struct if_chain_entry
+{
+  /* Constructor.  */
+  if_chain_entry (basic_block bb, edge true_edge, edge false_edge)
+    : m_case_values (), m_bb (bb),
+      m_true_edge (true_edge), m_false_edge (false_edge)
+  {
+    m_case_values.create (2);
+  }
+
+  /* Vector of at maximum 2 case ranges.  */
+  vec<case_range> m_case_values;
+  /* Basic block of the original condition.  */
+  basic_block m_bb;
+  /* True edge of the gimple condition.  */
+  edge m_true_edge;
+  /* False edge of the gimple condition.  */
+  edge m_false_edge;
+};
+
+/* Master structure for one if to switch conversion candidate.  */
+
+struct if_chain
+{
+  /* Default constructor.  */
+  if_chain():
+    m_first_condition (NULL), m_index (NULL_TREE), m_entries (),
+    m_phi_map ()
+  {
+    m_entries.create (2);
+  }
+
+  /* Default destructor.  */
+  ~if_chain ()
+  {
+    m_entries.release ();
+  }
+
+  /* Set index and check that it is not a different one.  */
+  bool set_and_check_index (tree index);
+
+  /* Verify that all case ranges do not overlap.  */
+  bool check_non_overlapping_cases ();
+
+  /* Return true when the switch can be expanded with a jump table or
+     a bit test (at least partially).  */
+  bool is_beneficial ();
+
+  /* Record PHI arguments of a given edge E and return true
+     if GIMPLE switch creation will violate a PHI node.  */
+  bool record_phi_arguments (edge e);
+
+  /* First condition of the chain.  */
+  gcond *m_first_condition;
+  /* Switch index.  */
+  tree m_index;
+  /* If chain entries.  */
+  vec<if_chain_entry> m_entries;
+  /* PHI map that is later used for reconstruction of PHI nodes.  */
+  hash_map<gphi *, tree> m_phi_map;
+};
+
+bool
+if_chain::set_and_check_index (tree index)
+{
+  if (TREE_CODE (index) != SSA_NAME || !INTEGRAL_TYPE_P (TREE_TYPE (index)))
+    return false;
+
+  if (m_index == NULL)
+    m_index = index;
+
+  return index == m_index;
+}
+
+/* Compare two case ranges by minimum value.  */
+
+static int
+range_cmp (const void *a, const void *b)
+{
+  const case_range *cr1 = *(const case_range * const *) a;
+  const case_range *cr2 = *(const case_range * const *) b;
+
+  return tree_int_cst_compare (cr1->m_min, cr2->m_min);
+}
+
+bool
+if_chain::check_non_overlapping_cases ()
+{
+  auto_vec<case_range *> all_ranges;
+  for (unsigned i = 0; i < m_entries.length (); i++)
+    for (unsigned j = 0; j < m_entries[i].m_case_values.length (); j++)
+      all_ranges.safe_push (&m_entries[i].m_case_values[j]);
+
+  all_ranges.qsort (range_cmp);
+
+  for (unsigned i = 0; i < all_ranges.length () - 1; i++)
+    {
+      case_range *left = all_ranges[i];
+      case_range *right = all_ranges[i + 1];
+      if (tree_int_cst_le (left->m_min, right->m_min)
+	  && tree_int_cst_le (right->m_min, left->m_max))
+	return false;
+    }
+
+  return true;
+}
+
+/* Compare clusters by minimum value.  */
+
+static int
+cluster_cmp (const void *a, const void *b)
+{
+  simple_cluster *sc1 = *(simple_cluster * const *) a;
+  simple_cluster *sc2 = *(simple_cluster * const *) b;
+
+  return tree_int_cst_compare (sc1->get_low (), sc2->get_high ());
+}
+
+static void
+dump_clusters (vec<cluster *> *clusters, const char *message)
+{
+  if (dump_file)
+    {
+      fprintf (dump_file, ";; %s: ", message);
+      for (unsigned i = 0; i < clusters->length (); i++)
+	(*clusters)[i]->dump (dump_file, dump_flags & TDF_DETAILS);
+      fprintf (dump_file, "\n");
+    }
+}
+
+/* Return true when the switch can be expanded with a jump table or
+   a bit test (at least partially).  */
+
+bool
+if_chain::is_beneficial ()
+{
+  profile_probability prob = profile_probability::uninitialized ();
+
+  auto_vec<cluster *> clusters;
+  clusters.create (m_entries.length ());
+
+  for (unsigned i = 0; i < m_entries.length (); i++)
+    {
+      if_chain_entry *entry = &m_entries[i];
+      for (unsigned j = 0; j < entry->m_case_values.length (); j++)
+	{
+	  case_range *range = &entry->m_case_values[j];
+	  clusters.safe_push (new simple_cluster (range->m_min, range->m_max,
+						  NULL_TREE,
+						  entry->m_true_edge->dest,
+						  prob));
+	}
+    }
+
+  /* Sort clusters and merge them.  */
+  auto_vec<cluster *> filtered_clusters;
+  filtered_clusters.create (16);
+  clusters.qsort (cluster_cmp);
+  simple_cluster *left = static_cast<simple_cluster *> (clusters[0]);
+  filtered_clusters.safe_push (left);
+
+  for (unsigned i = 1; i < clusters.length (); i++)
+    {
+      simple_cluster *right = static_cast<simple_cluster *> (clusters[i]);
+      tree type = TREE_TYPE (left->get_low ());
+      tree pos_one = build_int_cst (type, 1);
+      if (left->m_case_bb == right->m_case_bb)
+	{
+	  tree next = int_const_binop (PLUS_EXPR, left->get_high (), pos_one);
+	  if (tree_int_cst_equal (next, right->get_low ()))
+	    {
+	      left->set_high (right->get_high ());
+	      continue;
+	    }
+	}
+
+      left = static_cast<simple_cluster *> (clusters[i]);
+      filtered_clusters.safe_push (left);
+    }
+
+  dump_clusters (&filtered_clusters, "Canonical GIMPLE case clusters");
+
+  vec<cluster *> output = jump_table_cluster::find_jump_tables (filtered_clusters);
+  bool r = output.length () < filtered_clusters.length ();
+  if (r)
+    dump_clusters (&output, "JT can be built");
+  output.release ();
+  if (r)
+    return true;
+
+  output = bit_test_cluster::find_bit_tests (filtered_clusters);
+  r = output.length () < filtered_clusters.length ();
+  if (r)
+    dump_clusters (&output, "BT can be built");
+  output.release ();
+  return r;
+}
+
+bool
+if_chain::record_phi_arguments (edge e)
+{
+  for (gphi_iterator gsi = gsi_start_phis (e->dest); !gsi_end_p (gsi);
+       gsi_next (&gsi))
+    {
+      gphi *phi = gsi.phi ();
+      if (!virtual_operand_p (gimple_phi_result (phi)))
+	{
+	  tree arg = PHI_ARG_DEF_FROM_EDGE (phi, e);
+	  tree *v = m_phi_map.get (phi);
+	  if (v != NULL)
+	    {
+	      if (arg != *v)
+		return false;
+	    }
+	  else
+	    m_phi_map.put (phi, arg);
+	}
+    }
+
+  return true;
+}
+
+/* Build case label with MIN and MAX values of a given basic block DEST.  */
+
+static tree
+build_case_label (tree min, tree max, basic_block dest)
+{
+  tree label = gimple_block_label (dest);
+  return build_case_label (min, min == max ? NULL_TREE : max, label);
+}
+
+/* Compare two integer constants.  */
+
+static int
+label_cmp (const void *a, const void *b)
+{
+  const_tree l1 = *(const const_tree *) a;
+  const_tree l2 = *(const const_tree *) b;
+
+  return tree_int_cst_compare (CASE_LOW (l1), CASE_LOW (l2));
+}
+
+/* Convert a given if CHAIN into a switch GIMPLE statement.  */
+
+static void
+convert_if_conditions_to_switch (if_chain *chain)
+{
+  if (!dbg_cnt (if_to_switch))
+    return;
+
+  auto_vec<tree> labels;
+  if_chain_entry first_cond = chain->m_entries[0];
+
+  unsigned entries = chain->m_entries.length ();
+  edge default_edge = chain->m_entries[entries - 1].m_false_edge;
+  basic_block default_bb = default_edge->dest;
+
+  gimple_stmt_iterator gsi = gsi_for_stmt (chain->m_first_condition);
+  for (unsigned i = 0; i < chain->m_entries.length (); i++)
+    {
+      if_chain_entry entry = chain->m_entries[i];
+
+      basic_block case_bb = entry.m_true_edge->dest;
+
+      for (unsigned j = 0; j < entry.m_case_values.length (); j++)
+	labels.safe_push (build_case_label (entry.m_case_values[j].m_min,
+					    entry.m_case_values[j].m_max,
+					    case_bb));
+      default_bb = entry.m_false_edge->dest;
+
+      if (i == 0)
+	{
+	  remove_edge (first_cond.m_true_edge);
+	  remove_edge (first_cond.m_false_edge);
+	}
+      else
+	{
+	  /* Move all statements from the BB to the BB with gswitch.  */
+	  auto_vec<gimple *> stmts;
+	  for (gimple_stmt_iterator gsi = gsi_start_bb (entry.m_bb);
+	       !gsi_end_p (gsi); gsi_next (&gsi))
+	    {
+	      gimple *stmt = gsi_stmt (gsi);
+	      if (gimple_code (stmt) != GIMPLE_COND)
+		stmts.safe_push (stmt);
+	    }
+
+	  for (unsigned i = 0; i < stmts.length (); i++)
+	    {
+	      gimple_stmt_iterator gsi_from = gsi_for_stmt (stmts[i]);
+	      gsi_move_before (&gsi_from, &gsi);
+	    }
+
+	  delete_basic_block (entry.m_bb);
+	}
+
+      make_edge (first_cond.m_bb, case_bb, 0);
+    }
+
+  labels.qsort (label_cmp);
+
+  edge e = find_edge (first_cond.m_bb, default_bb);
+  if (e == NULL)
+    e = make_edge (first_cond.m_bb, default_bb, 0);
+  gswitch *s
+    = gimple_build_switch (chain->m_index,
+			   build_case_label (NULL_TREE, NULL_TREE, default_bb),
+			   labels);
+
+  gsi_remove (&gsi, true);
+  gsi_insert_before (&gsi, s, GSI_NEW_STMT);
+
+  if (dump_file)
+    {
+      fprintf (dump_file, "Expanded into a new gimple STMT: ");
+      print_gimple_stmt (dump_file, s, 0, TDF_SLIM);
+      putc ('\n', dump_file);
+    }
+
+  /* Fill up missing PHI node arguments.  */
+  for (hash_map<gphi *, tree>::iterator it = chain->m_phi_map.begin ();
+       it != chain->m_phi_map.end (); ++it)
+    {
+      gphi *phi = (*it).first;
+      if (!virtual_operand_p (gimple_phi_result (phi)))
+	{
+	  for (unsigned i = 0; i < gimple_phi_num_args (phi); i++)
+	    {
+	      if (gimple_phi_arg_def (phi, i) == NULL_TREE)
+		{
+		  add_phi_arg (phi, (*it).second, gimple_phi_arg_edge (phi, i),
+			       UNKNOWN_LOCATION);
+		  break;
+		}
+	    }
+	}
+    }
+}
+
+static bool
+extract_case_from_stmt (tree rhs1, tree rhs2, tree_code code,
+			if_chain *chain, if_chain_entry *entry,
+			unsigned *visited_stmt_count)
+{
+  tree index = NULL_TREE;
+  case_range range;
+
+  if (code == EQ_EXPR)
+    {
+      /* Handle situation 2a:
+	 _1 = aChar_8(D) == 1;  */
+      index = rhs1;
+
+      /* We can meet a readonly type used for a constant.  */
+      rhs2 = fold_convert (TREE_TYPE (index), rhs2);
+      if (TREE_CODE (rhs2) != INTEGER_CST)
+	return false;
+
+      range = case_range (rhs2, rhs2);
+      *visited_stmt_count += 1;
+    }
+  else if (code == LE_EXPR)
+    {
+      /* Handle situation 2b:
+	 aChar.1_1 = (unsigned int) aChar_10(D);
+	 _2 = aChar.1_1 + 4294967287;
+	 _3 = _2 <= 1;  */
+      tree ssa = rhs1;
+      tree range_size = rhs2;
+      if (TREE_CODE (ssa) != SSA_NAME
+	  || TREE_CODE (range_size) != INTEGER_CST)
+	return false;
+
+      gassign *subtraction = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (ssa));
+      if (subtraction == NULL
+	  || gimple_assign_rhs_code (subtraction) != PLUS_EXPR)
+	return false;
+
+      tree casted = gimple_assign_rhs1 (subtraction);
+      tree min = gimple_assign_rhs2 (subtraction);
+      if (TREE_CODE (casted) != SSA_NAME
+	  || TREE_CODE (min) != INTEGER_CST)
+	return false;
+
+      if (!SSA_NAME_IS_DEFAULT_DEF (casted))
+	{
+	  gassign *to_unsigned
+	    = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (casted));
+	  if (to_unsigned == NULL
+	      || !gimple_assign_unary_nop_p (to_unsigned)
+	      || !TYPE_UNSIGNED (TREE_TYPE (casted)))
+	    return false;
+	  index = gimple_assign_rhs1 (to_unsigned);
+	  ++(*visited_stmt_count);
+	}
+      else
+	index = casted;
+
+      tree type = TREE_TYPE (index);
+      tree range_min = fold_convert (type, const_unop (NEGATE_EXPR, type, min));
+      range = case_range (range_min, const_binop (PLUS_EXPR, type, range_min,
+						  fold_convert (type,
+								range_size)));
+      *visited_stmt_count += 2;
+    }
+  else
+    return false;
+
+  if (!chain->set_and_check_index (index))
+    return false;
+  entry->m_case_values.safe_push (range);
+
+  return true;
+}
+
+static void
+find_switch_in_bb (basic_block bb, auto_vec<if_chain *> *all_candidates,
+		   auto_bitmap *visited_bbs)
+{
+  if_chain *chain = new if_chain ();
+  unsigned total_case_values = 0;
+
+  while (true)
+    {
+      bool first = chain->m_entries.is_empty ();
+      if (bitmap_bit_p (*visited_bbs, bb->index))
+	break;
+      bitmap_set_bit (*visited_bbs, bb->index);
+
+      gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb);
+      if (gsi_end_p (gsi))
+	break;
+
+      if (!chain->m_entries.is_empty () && EDGE_COUNT (bb->preds) != 1)
+	break;
+
+      gcond *cond = dyn_cast<gcond *> (gsi_stmt (gsi));
+      if (cond == NULL)
+	break;
+
+      if (first)
+	chain->m_first_condition = cond;
+
+      edge true_edge, false_edge;
+      extract_true_false_edges_from_block (bb, &true_edge, &false_edge);
+
+      /* Prevent loosing information for a PHI node where 2 edges will
+	 be folded into one.  Note that we must do the same also for false_edge
+	 (for last BB in a if-elseif chain).  */
+      if (!chain->record_phi_arguments (true_edge)
+	  || !chain->record_phi_arguments (false_edge))
+	break;
+
+      if_chain_entry entry (bb, true_edge, false_edge);
+
+      /* Current we support following patterns (situations):
+
+	 1) if condition with equal operation:
+
+	    <bb 2> :
+	    if (argc_8(D) == 1)
+	      goto <bb 3>; [INV]
+	    else
+	      goto <bb 4>; [INV]
+
+	 2) if condition with a range check:
+
+	    <bb 3> :
+	    _4 = c_13(D) + 198;
+	    if (_4 <= 1)
+	      goto <bb 7>; [INV]
+	    else
+	      goto <bb 4>; [INV]
+
+	 3) mixture of 1) and 2) with a or condition:
+
+	    <bb 2> :
+	    _1 = aChar_8(D) == 1;
+	    _2 = aChar_8(D) == 10;
+	    _3 = _1 | _2;
+	    if (_3 != 0)
+	      goto <bb 5>; [INV]
+	    else
+	      goto <bb 3>; [INV]
+
+	    or:
+
+	    <bb 2> :
+	    aChar.1_1 = (unsigned int) aChar_10(D);
+	    _2 = aChar.1_1 + 4294967287;
+	    _3 = _2 <= 1;
+	    _4 = aChar_10(D) == 12;
+	    _5 = _3 | _4;
+	    if (_5 != 0)
+	      goto <bb 5>; [INV]
+	    else
+	      goto <bb 3>; [INV]
+		*/
+
+      tree lhs = gimple_cond_lhs (cond);
+      tree rhs = gimple_cond_rhs (cond);
+      tree_code code = gimple_cond_code (cond);
+      unsigned visited_stmt_count = 0;
+      unsigned case_values = 0;
+
+      /* Situation 1.  */
+      if (code == EQ_EXPR)
+	{
+	  if (!extract_case_from_stmt (lhs, rhs, code, chain, &entry,
+				       &visited_stmt_count))
+	    break;
+	  case_values = 1;
+	}
+      /* Situation 2.  */
+      else if (code == LE_EXPR)
+	{
+	  case_range range;
+	  if (!extract_case_from_stmt (lhs, rhs, code, chain, &entry,
+				       &visited_stmt_count))
+	    break;
+	  case_values = 1;
+	}
+      /* Situation 3.  */
+      else if (code == NE_EXPR
+	       && integer_zerop (rhs)
+	       && TREE_CODE (lhs) == SSA_NAME
+	       && TREE_CODE (TREE_TYPE (lhs)) == BOOLEAN_TYPE)
+	{
+	  gassign *def = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (lhs));
+	  if (def == NULL
+	      || gimple_assign_rhs_code (def) != BIT_IOR_EXPR
+	      || gimple_bb (def) != bb)
+	    break;
+
+	  tree rhs1 = gimple_assign_rhs1 (def);
+	  tree rhs2 = gimple_assign_rhs2 (def);
+	  if (TREE_CODE (rhs1) != SSA_NAME || TREE_CODE (rhs2) != SSA_NAME)
+	    break;
+
+	  gassign *def1 = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (rhs1));
+	  gassign *def2 = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (rhs2));
+	  if (def1 == NULL
+	      || def2 == NULL
+	      || def1 == def2
+	      || gimple_bb (def1) != bb
+	      || gimple_bb (def2) != bb)
+	    break;
+
+	  if (!extract_case_from_stmt (gimple_assign_rhs1 (def1),
+				       gimple_assign_rhs2 (def1),
+				       gimple_assign_rhs_code (def1),
+				       chain, &entry,
+				       &visited_stmt_count))
+	    break;
+
+	  if (!extract_case_from_stmt (gimple_assign_rhs1 (def2),
+				       gimple_assign_rhs2 (def2),
+				       gimple_assign_rhs_code (def2),
+				       chain, &entry,
+				       &visited_stmt_count))
+	    break;
+	  case_values = 2;
+	  visited_stmt_count += 2;
+	}
+      else
+	break;
+
+      /* If it's not the first condition, then we need a BB without
+	 any statements.  */
+      if (!first)
+	{
+	  unsigned stmt_count = 0;
+	  for (gimple_stmt_iterator gsi = gsi_start_nondebug_bb (bb);
+	       !gsi_end_p (gsi); gsi_next_nondebug (&gsi))
+	    ++stmt_count;
+
+	  if (stmt_count - visited_stmt_count != 0)
+	    break;
+	}
+
+      total_case_values += case_values;
+      chain->m_entries.safe_push (entry);
+
+      /* Follow if-elseif-elseif chain.  */
+      bb = false_edge->dest;
+    }
+
+  if (total_case_values >= 3
+      && chain->check_non_overlapping_cases ()
+      && chain->is_beneficial ())
+    {
+    expanded_location loc
+    = expand_location (gimple_location (chain->m_first_condition));
+      if (dump_file)
+	{
+	  fprintf (dump_file, "Condition chain (at %s:%d) with %d conditions "
+		   "(%d BBs) transformed into a switch statement.\n",
+		   loc.file, loc.line, total_case_values,
+		   chain->m_entries.length ());
+	}
+
+      all_candidates->safe_push (chain);
+    }
+  else
+    {
+      /* Unmark last if chain entry to that it can become a potential beginning
+	 of another chain.  */
+      if (!chain->m_entries.is_empty ())
+	bitmap_clear_bit (*visited_bbs, bb->index);
+      delete chain;
+    }
+}
+
+namespace {
+
+const pass_data pass_data_if_to_switch =
+{
+  GIMPLE_PASS, /* type */
+  "iftoswitch", /* name */
+  OPTGROUP_NONE, /* optinfo_flags */
+  TV_TREE_IF_TO_SWITCH, /* tv_id */
+  ( PROP_cfg | PROP_ssa ), /* properties_required */
+  0, /* properties_provided */
+  0, /* properties_destroyed */
+  0, /* todo_flags_start */
+  TODO_cleanup_cfg | TODO_update_ssa /* todo_flags_finish */
+};
+
+class pass_if_to_switch : public gimple_opt_pass
+{
+public:
+  pass_if_to_switch (gcc::context *ctxt)
+    : gimple_opt_pass (pass_data_if_to_switch, ctxt)
+  {}
+
+  /* opt_pass methods: */
+  virtual bool gate (function *) { return flag_convert_if_to_switch != 0; }
+  virtual unsigned int execute (function *);
+
+}; // class pass_if_to_switch
+
+unsigned int
+pass_if_to_switch::execute (function *fun)
+{
+  calculate_dominance_info (CDI_DOMINATORS);
+
+  auto_vec<if_chain *> all_candidates;
+  auto_vec<basic_block> worklist;
+  auto_bitmap visited_bbs;
+
+  worklist.safe_push (ENTRY_BLOCK_PTR_FOR_FN (fun));
+  while (!worklist.is_empty ())
+    {
+      basic_block bb = worklist.pop ();
+      find_switch_in_bb (bb, &all_candidates, &visited_bbs);
+      for (basic_block son = first_dom_son (CDI_DOMINATORS, bb); son;
+	   son = next_dom_son (CDI_DOMINATORS, son))
+	if (!bitmap_bit_p (visited_bbs, son->index))
+	  worklist.safe_push (son);
+    }
+
+  for (unsigned i = 0; i < all_candidates.length (); i++)
+    {
+      convert_if_conditions_to_switch (all_candidates[i]);
+      delete all_candidates[i];
+    }
+
+  /* For now, just wipe the dominator information.  */
+  free_dominance_info (CDI_DOMINATORS);
+
+  if (!all_candidates.is_empty ())
+    mark_virtual_operands_for_renaming (fun);
+
+  return 0;
+}
+
+} // anon namespace
+
+gimple_opt_pass *
+make_pass_if_to_switch (gcc::context *ctxt)
+{
+  return new pass_if_to_switch (ctxt);
+}
diff --git a/gcc/opts.c b/gcc/opts.c
index c5c60581f70..c8d8d5e2ffb 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -509,6 +509,7 @@ static const struct default_options default_options_table[] =
     { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP },
     { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
+    { OPT_LEVELS_2_PLUS, OPT_fconvert_if_to_switch, NULL, 1 },
 
     /* -O2 and above optimizations, but not -Os or -Og.  */
     { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 },
diff --git a/gcc/passes.def b/gcc/passes.def
index c0098d755bf..4c3fd3c42cc 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -92,6 +92,7 @@ along with GCC; see the file COPYING3.  If not see
 	  NEXT_PASS (pass_cd_dce);
 	  NEXT_PASS (pass_phiopt, true /* early_p */);
 	  NEXT_PASS (pass_tail_recursion);
+	  NEXT_PASS (pass_if_to_switch);
 	  NEXT_PASS (pass_convert_switch);
 	  NEXT_PASS (pass_cleanup_eh);
 	  NEXT_PASS (pass_profile);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-1.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-1.c
new file mode 100644
index 00000000000..bcb8ef2a160
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-1.c
@@ -0,0 +1,35 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int global;
+int foo ();
+
+int main(int argc, char **argv)
+{
+  if (argc == 1)
+    foo ();
+  else if (argc == 2)
+    {
+      global += 1;
+    }
+  else if (argc == 3)
+    {
+      foo ();
+      foo ();
+    }
+  else if (argc == 4)
+    {
+      foo ();
+    }
+  else if (argc == 5)
+    {
+      global = 2;
+    }
+  else
+    global -= 123;
+
+  global -= 12;
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump "Condition chain \\(at .*if-to-switch-1.c:9\\) with 5 conditions \\(5 BBs\\) transformed into a switch statement." "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-2.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-2.c
new file mode 100644
index 00000000000..316e772ec29
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int IsHTMLWhitespaceNoRange(int aChar)
+{
+  return aChar == 0x0001 || aChar == 0x000A ||
+         aChar == 0x000C || aChar == 0x000E ||
+         aChar == 0x0020;
+}
+
+/* { dg-final { scan-tree-dump "Condition chain \\(at .*if-to-switch-2.c:7\\) with 5 conditions \\(3 BBs\\) transformed into a switch statement." "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c
new file mode 100644
index 00000000000..fd07d909a3c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-3.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int IsHTMLWhitespace(int aChar)
+{
+  return aChar == 0x0009 || aChar == 0x000A ||
+         aChar == 0x000C || aChar == 0x000D ||
+         aChar == 0x0020 || aChar == 0x0030;
+}
+
+/* { dg-final { scan-tree-dump "Condition chain \\(at .*if-to-switch-3.c:8\\) with 5 conditions \\(3 BBs\\) transformed into a switch statement." "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-4.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-4.c
new file mode 100644
index 00000000000..3ae006f6ca2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-4.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int global;
+int foo ();
+
+int main(int argc, char **argv)
+{
+  if (argc == 1)
+    foo ();
+  else if (argc == 2)
+    {
+      global += 1;
+    }
+  else if (argc == 3)
+    {
+      foo ();
+      foo ();
+    }
+  else if (argc == 4)
+    {
+      foo ();
+    }
+  /* This will be removed with EVRP.  */
+  else if (argc == 1)
+    {
+      global = 2;
+    }
+  else
+    global -= 123;
+
+  global -= 12;
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "Condition chain" "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c
new file mode 100644
index 00000000000..acb8b4b1211
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-5.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int crud (unsigned char c)
+{
+  return (((((((((((int) c == 46) || (int) c == 44)
+		 || (int) c == 58) || (int) c == 59) || (int) c == 60)
+	      || (int) c == 62) || (int) c == 34) || (int) c == 92)
+	   || (int) c == 39) != 0);
+}
+
+/* { dg-final { scan-tree-dump "Condition chain \\(at .*if-to-switch-5.c:9\\) with 8 conditions \\(5 BBs\\) transformed into a switch statement." "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-6.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-6.c
new file mode 100644
index 00000000000..7af323ae251
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-6.c
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int global;
+int foo ();
+
+int main(int argc, char **argv)
+{
+  if (argc >= 1 && argc <= 10)
+    foo ();
+  else if (argc == 12)
+    {
+      global += 1;
+    }
+  else if (argc == 13)
+    {
+      foo ();
+      foo ();
+    }
+  else if (argc == 14)
+    {
+      foo ();
+    }
+  /* This will be removed with EVRP.  */
+  else if (argc == 5)
+    {
+      global = 2;
+    }
+  /* This will be removed with EVRP.  */
+  else if (argc >= 7 && argc <= 9)
+    {
+      global = 2;
+    }
+
+  else
+    global -= 123;
+
+  global -= 12;
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-not "Condition chain" "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-7.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-7.c
new file mode 100644
index 00000000000..1a919bf025a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-7.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int global;
+
+int foo(int a)
+{
+  int x = 0;
+  for (unsigned i = 0; i < a; i++)
+  {
+    if (a == 2)
+    {
+      global += 123;
+      x = 1;
+    }
+    else if (a == 3)
+      x = 2;
+    else if (a == 10)
+      x = 3;
+  }
+
+  return x;
+}
+
+/* { dg-final { scan-tree-dump-not "Condition chain " "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c
new file mode 100644
index 00000000000..a5f1a1eae18
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/if-to-switch-8.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-iftoswitch" } */
+
+int global;
+int global1;
+int global2;
+int global3;
+
+int foo(int a, int b)
+{
+  int x = 0;
+  for (unsigned i = 0; i < a; i++)
+  {
+    if (b == 1)
+      global += 2;
+    else if (a == 2)
+      global = 123;
+    else if (a == 3)
+      global1 = 1234;
+    else if (a == 10)
+      global2 = 12345;
+    else if (a == 1)
+      global2 = 123456;
+  }
+}
+
+/* { dg-final { scan-tree-dump-not "Condition chain" "iftoswitch" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c
index 944362ad076..8e53620a4df 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-32.c
@@ -1,6 +1,6 @@
 /* { dg-do run { target { ! "m68k*-*-* mmix*-*-* bfin*-*-* v850*-*-* moxie*-*-* cris*-*-* m32c*-*-* fr30*-*-* mcore*-*-* powerpc*-*-* xtensa*-*-*"} } } */
 
-/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1" } */
+/* { dg-options "-O2 -fno-inline -fdump-tree-reassoc1-details --param logical-op-non-short-circuit=1 -fno-convert-if-to-switch" } */
 /* { dg-additional-options "-mbranch-cost=2" { target branch_cost } } */
 
 
diff --git a/gcc/timevar.def b/gcc/timevar.def
index 7dd1e2685a4..3d7886546d3 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -290,6 +290,7 @@ DEFTIMEVAR (TV_VAR_TRACKING          , "variable tracking")
 DEFTIMEVAR (TV_VAR_TRACKING_DATAFLOW , "var-tracking dataflow")
 DEFTIMEVAR (TV_VAR_TRACKING_EMIT     , "var-tracking emit")
 DEFTIMEVAR (TV_TREE_IFCOMBINE        , "tree if-combine")
+DEFTIMEVAR (TV_TREE_IF_TO_SWITCH     , "if to switch conversion")
 DEFTIMEVAR (TV_TREE_UNINIT           , "uninit var analysis")
 DEFTIMEVAR (TV_PLUGIN_INIT           , "plugin initialization")
 DEFTIMEVAR (TV_PLUGIN_RUN            , "plugin execution")
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index f01e811917d..3410c0205c2 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -374,6 +374,7 @@ extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
+extern gimple_opt_pass *make_pass_if_to_switch (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
 extern gimple_opt_pass *make_pass_simduid_cleanup (gcc::context *ctxt);
diff --git a/gcc/tree-switch-conversion.h b/gcc/tree-switch-conversion.h
index 9ebcf109319..c6e90493049 100644
--- a/gcc/tree-switch-conversion.h
+++ b/gcc/tree-switch-conversion.h
@@ -48,8 +48,8 @@ class cluster
 {
 public:
   /* Constructor.  */
-  cluster (tree case_label_expr, basic_block case_bb, profile_probability prob,
-	   profile_probability subtree_prob);
+  inline cluster (tree case_label_expr, basic_block case_bb,
+		  profile_probability prob, profile_probability subtree_prob);
 
   /* Destructor.  */
   virtual ~cluster ()
@@ -122,8 +122,8 @@ class simple_cluster: public cluster
 {
 public:
   /* Constructor.  */
-  simple_cluster (tree low, tree high, tree case_label_expr,
-		  basic_block case_bb, profile_probability prob);
+  inline simple_cluster (tree low, tree high, tree case_label_expr,
+			 basic_block case_bb, profile_probability prob);
 
   /* Destructor.  */
   ~simple_cluster ()
@@ -147,6 +147,11 @@ public:
     return m_high;
   }
 
+  void set_high (tree high)
+  {
+    m_high = high;
+  }
+
   void
   debug ()
   {
@@ -272,7 +277,7 @@ public:
   static inline unsigned int case_values_threshold (void);
 
   /* Return whether jump table expansion is allowed.  */
-  static bool is_enabled (void);
+  static inline bool is_enabled (void);
 };
 
 /* A GIMPLE switch statement can be expanded to a short sequence of bit-wise
-- 
2.28.0


  reply	other threads:[~2020-09-01 11:47 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-04 14:23 Martin Liška
2019-11-04 14:49 ` Jakub Jelinek
2019-11-05 12:38   ` Richard Biener
2019-11-06 21:03     ` Bernhard Reutner-Fischer
2019-11-14  9:44       ` Martin Liška
2019-11-14 12:35         ` Bernhard Reutner-Fischer
2019-11-14  9:41     ` Martin Liška
2019-11-14 10:48       ` Richard Biener
2019-11-15 13:56         ` Martin Liška
2020-09-01 11:47           ` Martin Liška [this message]
2020-09-01 14:50             ` David Malcolm
2020-09-02 11:53               ` Martin Liška
2020-09-21  8:55                 ` Martin Liška
2020-09-24 12:41                 ` Richard Biener
2020-09-25 14:05                   ` Martin Liška
2020-09-29  8:46                     ` Richard Biener
2020-10-02 13:26                       ` Martin Liška
2020-10-02 14:19                         ` Andrew MacLeod
2020-10-06 12:09                           ` Martin Liška
2020-10-06 12:56                             ` Andrew MacLeod
2020-10-06 13:09                               ` Martin Liška
2020-10-06 13:23                                 ` Andrew MacLeod
2020-10-06 13:41                                 ` Richard Biener
2020-10-02 13:23                   ` Martin Liška
2020-10-06  7:47                     ` Richard Biener
2020-10-06 13:48                       ` Martin Liška
2020-10-06 14:12                         ` Jakub Jelinek
2020-10-12 12:39                           ` Martin Liška
2020-10-12 13:00                             ` Jakub Jelinek
2020-10-14 18:09                             ` Andrew MacLeod
2020-10-07  8:00                         ` Richard Biener
2020-10-12 12:44                           ` Martin Liška
2020-10-12 13:01                             ` Martin Liška
2020-10-15 12:38                               ` Richard Biener
2020-10-16 14:04                             ` [PATCH v2] " Martin Liška
2020-11-06 12:31                               ` Richard Biener
2020-11-09 12:26                                 ` Martin Liška
2020-11-16 12:21                                   ` Richard Biener
2020-11-18 12:25                                     ` Martin Liška
2020-11-19 14:46                                       ` Richard Biener
2020-11-20  8:57                                         ` Martin Liška
2020-11-20 14:37                                           ` Richard Biener
2020-11-27 15:07                                             ` Martin Liška
2020-12-01 10:34                                               ` Richard Biener
2020-12-01 13:57                                                 ` [PATCH] if-to-switch: Support chain with 2 BBs Martin Liška
2020-12-01 22:14                                                   ` Jeff Law
2019-11-13 11:32   ` [PATCH] Add if-chain to switch conversion pass Martin Liška
2019-11-13 16:14     ` Michael Matz
2019-11-14 10:07       ` Martin Liška

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=42c91f11-c1a6-3ae4-08da-0a0b77f63b80@suse.cz \
    --to=mliska@suse.cz \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=hubicka@ucw.cz \
    --cc=jakub@redhat.com \
    --cc=kazu@gcc.gnu.org \
    --cc=richard.guenther@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).