From: Eli Friedman Date: Sat, 3 Jul 2010 07:38:12 +0000 (+0000) Subject: Note switch-lowering inefficiency. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=b4a74c1d820bd913e91e4c921a141824f6bfe2df;p=oota-llvm.git Note switch-lowering inefficiency. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107565 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/README.txt b/lib/Target/README.txt index b1080b594ff..8f785393fd0 100644 --- a/lib/Target/README.txt +++ b/lib/Target/README.txt @@ -1888,3 +1888,39 @@ of the ADD, and replacing the ADD with the ADDE, should give the desired result. (That said, we are doing a lot better than gcc on this testcase. :) ) //===---------------------------------------------------------------------===// + +Switch lowering generates less than ideal code for the following switch: +define void @a(i32 %x) nounwind { +entry: + switch i32 %x, label %if.end [ + i32 0, label %if.then + i32 1, label %if.then + i32 2, label %if.then + i32 3, label %if.then + i32 5, label %if.then + ] +if.then: + tail call void @foo() nounwind + ret void +if.end: + ret void +} +declare void @foo() + +Generated code on x86-64 (other platforms give similar results): +a: + cmpl $5, %edi + ja .LBB0_2 + movl %edi, %eax + movl $47, %ecx + btq %rax, %rcx + jb .LBB0_3 +.LBB0_2: + ret +.LBB0_3: + xorb %al, %al + jmp foo@PLT # TAILCALL + +The movl+movl+btq+jb could be simplified to a cmpl+jne. + +//===---------------------------------------------------------------------===//