From ae0254dabca242f69e2d534097df84f810c7a2d0 Mon Sep 17 00:00:00 2001 From: Hans Wennborg Date: Fri, 8 May 2015 21:23:39 +0000 Subject: [PATCH] Switch lowering: cluster adjacent fall-through cases even at -O0 It's cheap to do, and codegen is much faster if cases can be merged into clusters. llvm-svn: 236905 --- .../CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 8 +++++--- llvm/test/CodeGen/X86/switch.ll | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 52d12fcea31e..832437c33f44 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -8012,10 +8012,12 @@ void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) { MachineBasicBlock *DefaultMBB = FuncInfo.MBBMap[SI.getDefaultDest()]; - if (TM.getOptLevel() != CodeGenOpt::None) { - // Cluster adjacent cases with the same destination. - sortAndRangeify(Clusters); + // Cluster adjacent cases with the same destination. We do this at all + // optimization levels because it's cheap to do and will make codegen faster + // if there are many clusters. + sortAndRangeify(Clusters); + if (TM.getOptLevel() != CodeGenOpt::None) { // Replace an unreachable default with the most popular destination. // FIXME: Exploit unreachable default more aggressively. bool UnreachableDefault = diff --git a/llvm/test/CodeGen/X86/switch.ll b/llvm/test/CodeGen/X86/switch.ll index d50eabaa2618..66a739c8470c 100644 --- a/llvm/test/CodeGen/X86/switch.ll +++ b/llvm/test/CodeGen/X86/switch.ll @@ -9,18 +9,19 @@ entry: i32 3, label %bb0 i32 1, label %bb1 i32 4, label %bb1 - i32 5, label %bb0 + i32 5, label %bb2 ] bb0: tail call void @g(i32 0) br label %return bb1: tail call void @g(i32 1) br label %return +bb2: tail call void @g(i32 1) br label %return return: ret void ; Should be lowered as straight compares in -O0 mode. ; NOOPT-LABEL: basic -; NOOPT: subl $3, %eax -; NOOPT: je ; NOOPT: subl $1, %eax ; NOOPT: je +; NOOPT: subl $3, %eax +; NOOPT: je ; NOOPT: subl $4, %eax ; NOOPT: je ; NOOPT: subl $5, %eax @@ -58,6 +59,14 @@ return: ret void ; CHECK: jae ; CHECK: cmpl $3 ; CHECK: ja + +; We do this even at -O0, because it's cheap and makes codegen faster. +; NOOPT-LABEL: simple_ranges +; NOOPT: subl $4 +; NOOPT: jb +; NOOPT: addl $-100 +; NOOPT: subl $4 +; NOOPT: jb }