Skip to content

Commit 3e52d80

Browse files
committed
!fixup don't perform transform with large clusters.
1 parent 31b25a6 commit 3e52d80

File tree

2 files changed

+47
-34
lines changed

2 files changed

+47
-34
lines changed

llvm/lib/CodeGen/SwitchLoweringUtils.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,12 @@ void SwitchCG::SwitchLowering::findBitTestClusters(CaseClusterVector &Clusters,
363363
}
364364
Clusters.resize(DstIndex);
365365

366+
// Don't try to fold clusters checking for zero and a power-of-2 constant, if
367+
// larger ranges may be lowered as balanced binary trees later on, which won't
368+
// work correctly after applying the transform below.
369+
if (Clusters.size() > 4)
370+
return;
371+
366372
// Check if the clusters contain one checking for 0 and another one checking
367373
// for a power-of-2 constant with matching destinations. Those clusters can be
368374
// combined to a single one with CC_And.

llvm/test/CodeGen/AArch64/switch-cases-to-branch-and.ll

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -878,56 +878,63 @@ pow2.dst:
878878
define void @switch_large_enough_for_clustering(i32 %x, ptr %dst) {
879879
; CHECK-LABEL: switch_large_enough_for_clustering:
880880
; CHECK: ; %bb.0: ; %entry
881-
; CHECK-NEXT: cmp w0, #3
882-
; CHECK-NEXT: b.gt LBB12_4
881+
; CHECK-NEXT: cmp w0, #1
882+
; CHECK-NEXT: b.le LBB12_5
883883
; CHECK-NEXT: ; %bb.1: ; %entry
884-
; CHECK-NEXT: tst w0, #0xfffffffd
885-
; CHECK-NEXT: b.ne LBB12_7
886-
; CHECK-NEXT: ; %bb.2: ; %succ.1
887-
; CHECK-NEXT: strb wzr, [x1]
888-
; CHECK-NEXT: LBB12_3: ; %exit
889-
; CHECK-NEXT: ret
890-
; CHECK-NEXT: LBB12_4: ; %entry
884+
; CHECK-NEXT: cmp w0, #7
885+
; CHECK-NEXT: b.eq LBB12_9
886+
; CHECK-NEXT: ; %bb.2: ; %entry
891887
; CHECK-NEXT: cmp w0, #4
888+
; CHECK-NEXT: b.eq LBB12_7
889+
; CHECK-NEXT: ; %bb.3: ; %entry
890+
; CHECK-NEXT: cmp w0, #2
892891
; CHECK-NEXT: b.eq LBB12_8
893-
; CHECK-NEXT: ; %bb.5: ; %entry
894-
; CHECK-NEXT: cmp w0, #7
895-
; CHECK-NEXT: b.ne LBB12_3
896-
; CHECK-NEXT: ; %bb.6: ; %succ.3
897-
; CHECK-NEXT: strh wzr, [x1]
892+
; CHECK-NEXT: LBB12_4: ; %exit
898893
; CHECK-NEXT: ret
899-
; CHECK-NEXT: LBB12_7: ; %entry
894+
; CHECK-NEXT: LBB12_5: ; %entry
895+
; CHECK-NEXT: cbz w0, LBB12_8
896+
; CHECK-NEXT: ; %bb.6: ; %entry
900897
; CHECK-NEXT: cmp w0, #1
901-
; CHECK-NEXT: b.ne LBB12_3
902-
; CHECK-NEXT: LBB12_8: ; %succ.2
898+
; CHECK-NEXT: b.ne LBB12_4
899+
; CHECK-NEXT: LBB12_7: ; %succ.2
903900
; CHECK-NEXT: str wzr, [x1]
904901
; CHECK-NEXT: ret
902+
; CHECK-NEXT: LBB12_8: ; %succ.1
903+
; CHECK-NEXT: strb wzr, [x1]
904+
; CHECK-NEXT: ret
905+
; CHECK-NEXT: LBB12_9: ; %succ.3
906+
; CHECK-NEXT: strh wzr, [x1]
907+
; CHECK-NEXT: ret
905908
;
906909
; GISEL-LABEL: switch_large_enough_for_clustering:
907910
; GISEL: ; %bb.0: ; %entry
908-
; GISEL-NEXT: cmp w0, #4
909-
; GISEL-NEXT: b.ge LBB12_4
911+
; GISEL-NEXT: cmp w0, #2
912+
; GISEL-NEXT: b.lt LBB12_5
910913
; GISEL-NEXT: ; %bb.1: ; %entry
911-
; GISEL-NEXT: cmn w0, #3
912-
; GISEL-NEXT: b.ne LBB12_7
913-
; GISEL-NEXT: ; %bb.2: ; %succ.1
914-
; GISEL-NEXT: strb wzr, [x1]
915-
; GISEL-NEXT: LBB12_3: ; %exit
916-
; GISEL-NEXT: ret
917-
; GISEL-NEXT: LBB12_4: ; %entry
918-
; GISEL-NEXT: b.eq LBB12_8
919-
; GISEL-NEXT: ; %bb.5: ; %entry
920914
; GISEL-NEXT: cmp w0, #7
921-
; GISEL-NEXT: b.ne LBB12_3
922-
; GISEL-NEXT: ; %bb.6: ; %succ.3
923-
; GISEL-NEXT: strh wzr, [x1]
915+
; GISEL-NEXT: b.eq LBB12_9
916+
; GISEL-NEXT: ; %bb.2: ; %entry
917+
; GISEL-NEXT: cmp w0, #4
918+
; GISEL-NEXT: b.eq LBB12_7
919+
; GISEL-NEXT: ; %bb.3: ; %entry
920+
; GISEL-NEXT: cmp w0, #2
921+
; GISEL-NEXT: b.eq LBB12_8
922+
; GISEL-NEXT: LBB12_4: ; %exit
924923
; GISEL-NEXT: ret
925-
; GISEL-NEXT: LBB12_7: ; %entry
924+
; GISEL-NEXT: LBB12_5: ; %entry
925+
; GISEL-NEXT: cbz w0, LBB12_8
926+
; GISEL-NEXT: ; %bb.6: ; %entry
926927
; GISEL-NEXT: cmp w0, #1
927-
; GISEL-NEXT: b.ne LBB12_3
928-
; GISEL-NEXT: LBB12_8: ; %succ.2
928+
; GISEL-NEXT: b.ne LBB12_4
929+
; GISEL-NEXT: LBB12_7: ; %succ.2
929930
; GISEL-NEXT: str wzr, [x1]
930931
; GISEL-NEXT: ret
932+
; GISEL-NEXT: LBB12_8: ; %succ.1
933+
; GISEL-NEXT: strb wzr, [x1]
934+
; GISEL-NEXT: ret
935+
; GISEL-NEXT: LBB12_9: ; %succ.3
936+
; GISEL-NEXT: strh wzr, [x1]
937+
; GISEL-NEXT: ret
931938
entry:
932939
switch i32 %x, label %exit [
933940
i32 0, label %succ.1

0 commit comments

Comments
 (0)