Switch lowering: cluster adjacent fall-through cases even at -O0
authorHans Wennborg <hans@hanshq.net>
Fri, 8 May 2015 21:23:39 +0000 (21:23 +0000)
committerHans Wennborg <hans@hanshq.net>
Fri, 8 May 2015 21:23:39 +0000 (21:23 +0000)
It's cheap to do, and codegen is much faster if cases can be merged
into clusters.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236905 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
test/CodeGen/X86/switch.ll

index 52d12fc..832437c 100644 (file)
@@ -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 =
index d50eaba..66a739c 100644 (file)
@@ -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
 }