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
This commit is contained in:
Hans Wennborg 2015-05-08 21:23:39 +00:00
parent c67979bf4d
commit ae0254dabc
2 changed files with 17 additions and 6 deletions

View 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 =

View 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
}