[Bug rtl-optimization/87925] New: Missed optimization: Single-value if-then-else chains treated differently than switch'es
eyalroz at technion dot ac.il
gcc-bugzilla@gcc.gnu.org
Wed Nov 7 22:23:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87925
Bug ID: 87925
Summary: Missed optimization: Single-value if-then-else chains
treated differently than switch'es
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: eyalroz at technion dot ac.il
Target Milestone: ---
Have a look at this GodBolt example: https://gcc.godbolt.org/z/zR03rA
On one hand, we have:
void foo(int i) {
switch (i) {
case 1: boo<1>(); break;
case 2: boo<2>(); break;
case 3: boo<3>(); break;
case 4: boo<4>(); break;
// etc. etc.
}
}
on the other hand we have the same, but using an if-then-else chain:
void bar(int i) {
if (i == 1) boo<1>();
else if (i == 2) boo<2>();
else if (i == 3) boo<3>();
else if (i == 4) boo<4>();
// etc. etc.
}
The switch statement gets a jump table; the if-then-else chain - does not. At
the link, there are 20 cases; g++ starts using a jump table with 4 switch
values.
This is not just a matter of programmers needing to remember to prefer switch
statements (which it's better not to require of them), but rather that
if-then-else chains are sometimes generated by expansion of templated code,
e.g. this example for checking for membership in a set of values (= all values
of an enum):
https://stackoverflow.com/a/53191264/1593077
while switch() statements of variable do not get generated AFAICT. It would
thus be quite useful if such generated code would not result in
highly-inefficient long chains of comparisons.
More information about the Gcc-bugs
mailing list