diff options
| author | Anton Korobeynikov <asl@math.spbu.ru> | 2007-05-09 20:07:08 +0000 |
|---|---|---|
| committer | Anton Korobeynikov <asl@math.spbu.ru> | 2007-05-09 20:07:08 +0000 |
| commit | 192d09c2d9feaa79d369cac6d44bb07ee64e6f3c (patch) | |
| tree | cd3acc291c4f5fd263eccf048ebb3da21bbd9ecc /llvm | |
| parent | bbe26581d9067af4a59a93f8d89f4f1f4cfdfd68 (diff) | |
| download | bcm5719-llvm-192d09c2d9feaa79d369cac6d44bb07ee64e6f3c.tar.gz bcm5719-llvm-192d09c2d9feaa79d369cac6d44bb07ee64e6f3c.zip | |
Do not assert, when case range split metric is zero and JTs are not allowed: just emit binary tree in this case. This
fixes PR1403.
llvm-svn: 36959
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 17 | ||||
| -rw-r--r-- | llvm/test/CodeGen/SPARC/2007-05-09-JumpTables.ll | 30 |
2 files changed, 42 insertions, 5 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index b70366357d9..075a9c4a464 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1462,6 +1462,11 @@ bool SelectionDAGLowering::handleSmallSwitchRange(CaseRec& CR, return true; } +static inline bool areJTsAllowed(const TargetLowering &TLI) { + return (TLI.isOperationLegal(ISD::BR_JT, MVT::Other) || + TLI.isOperationLegal(ISD::BRIND, MVT::Other)); +} + /// handleJTSwitchCase - Emit jumptable for current switch case range bool SelectionDAGLowering::handleJTSwitchCase(CaseRec& CR, CaseRecVector& WorkList, @@ -1478,9 +1483,7 @@ bool SelectionDAGLowering::handleJTSwitchCase(CaseRec& CR, I!=E; ++I) TSize += I->size(); - if ((!TLI.isOperationLegal(ISD::BR_JT, MVT::Other) && - !TLI.isOperationLegal(ISD::BRIND, MVT::Other)) || - TSize <= 3) + if (!areJTsAllowed(TLI) || TSize <= 3) return false; double Density = (double)TSize / (double)((Last - First) + 1ULL); @@ -1622,8 +1625,12 @@ bool SelectionDAGLowering::handleBTSplitSwitchCase(CaseRec& CR, LSize += J->size(); RSize -= J->size(); } - // If our case is dense we *really* should handle it earlier! - assert((FMetric > 0) && "Should handle dense range earlier!"); + if (areJTsAllowed(TLI)) { + // If our case is dense we *really* should handle it earlier! + assert((FMetric > 0) && "Should handle dense range earlier!"); + } else { + Pivot = CR.Range.first + Size/2; + } CaseRange LHSR(CR.Range.first, Pivot); CaseRange RHSR(Pivot, CR.Range.second); diff --git a/llvm/test/CodeGen/SPARC/2007-05-09-JumpTables.ll b/llvm/test/CodeGen/SPARC/2007-05-09-JumpTables.ll new file mode 100644 index 00000000000..a014acefa90 --- /dev/null +++ b/llvm/test/CodeGen/SPARC/2007-05-09-JumpTables.ll @@ -0,0 +1,30 @@ +; RUN: llvm-as < %s | llc -march=sparc + +; We cannot emit jump tables on Sparc, but we should correctly handle this case. + +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64" + +define i32 @foo(i32 %f) { +entry: + switch i32 %f, label %bb14 [ + i32 0, label %UnifiedReturnBlock + i32 1, label %bb4 + i32 2, label %bb7 + i32 3, label %bb10 + ] + +bb4: ; preds = %entry + ret i32 2 + +bb7: ; preds = %entry + ret i32 5 + +bb10: ; preds = %entry + ret i32 9 + +bb14: ; preds = %entry + ret i32 0 + +UnifiedReturnBlock: ; preds = %entry + ret i32 1 +} |

