[SDAGBuilder] Don't create a binary tree for switches in minsize mode

This bloats codesize - all of the non-leaf nodes are extra code.

llvm-svn: 280932
This commit is contained in:
James Molloy 2016-09-08 13:12:22 +00:00
parent 7771462b28
commit c6a6144966
2 changed files with 36 additions and 1 deletions

View File

@ -9237,7 +9237,8 @@ void SelectionDAGBuilder::visitSwitch(const SwitchInst &SI) {
WorkList.pop_back(); WorkList.pop_back();
unsigned NumClusters = W.LastCluster - W.FirstCluster + 1; unsigned NumClusters = W.LastCluster - W.FirstCluster + 1;
if (NumClusters > 3 && TM.getOptLevel() != CodeGenOpt::None) { if (NumClusters > 3 && TM.getOptLevel() != CodeGenOpt::None &&
!DefaultMBB->getParent()->getFunction()->optForMinSize()) {
// For optimized builds, lower large range as a balanced binary tree. // For optimized builds, lower large range as a balanced binary tree.
splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB); splitWorkItem(WorkList, W, SI.getCondition(), SwitchMBB);
continue; continue;

View File

@ -0,0 +1,34 @@
; RUN: llc < %s | FileCheck %s
target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
target triple = "thumbv7-apple-ios8.0.0"
; CHECK: beq
; CHECK: beq
; CHECK: beq
; CHECK: cbnz
declare void @g(i32)
define void @f(i32 %val) optsize minsize {
switch i32 %val, label %def [
i32 0, label %one
i32 9, label %two
i32 994, label %three
i32 1154, label %four
]
one:
call void @g(i32 1)
ret void
two:
call void @g(i32 001)
ret void
three:
call void @g(i32 78)
ret void
four:
call void @g(i32 87)
ret void
def:
call void @g(i32 11)
ret void
}