[LLVMbugs] [Bug 18348] New: Switch with large ranges may generate huge jump tables

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Dec 31 06:55:56 PST 2013


http://llvm.org/bugs/show_bug.cgi?id=18348

            Bug ID: 18348
           Summary: Switch with large ranges may generate huge jump tables
           Product: libraries
           Version: 3.3
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Common Code Generator Code
          Assignee: unassignedbugs at nondot.org
          Reporter: jn at sirrida.de
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

When compiling with clang -O3 -S the following program is implemented with a
huge jump table where a decision tree would have been much more appropriate:

int main(int argc, char **argv) {
  switch (argc) {
    case 5000 ... 5063: return 100;
    case 5100 ... 5163: return 200;
    case 5200 ... 5263: return 300;
    case 5300 ... 5364: return 400;
    case 5400 ... 5463: return 500;
    case 5500 ... 5563: return 600;
    default: return -1;
    }
  }

As far as I can see the jump table covers the whole range 5000 ... 5563.
All jump table covers only ranges with up to 64 elements; all larger ranges are
tested afterwards, i.e. the range 5300 ... 5364 (containing 65 elements) is
tested later.

I consider the resulting jump table as being inadequately large (564 entries
for 5 ranges, this amounts to 4512 bytes on a 64 bit system). The special case
for ranges with more than 64 elements seems to artificial as also discussed in
bug #1255.

Instead of testing the density of the jump table it probably would be better to
compare the switch label range with the number of conditional statements of the
competing decision tree - this can easily be changed in
SelectionDAGBuilder::handleJTSwitchCase
(lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp).

As far as I can see this quirk is also present in trunk.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20131231/26c5e60a/attachment.html>


More information about the llvm-bugs mailing list