[llvm-commits] Reworked SwitchInst prototype with case-ranges.
Stepan Dyatkovskiy
stpworld at narod.ru
Fri Aug 3 01:59:32 PDT 2012
Hi all, please find the new SwitchInst prototype with case ranges in
attachment.
Main features.
1. Ranges are stored in flat ordered numbers collection (thanks to
Duncan and Chandler for this idea). Range [Low, High) may be represented
as Low=collection[i], High=collection[i+1]. Thus all set of integers is
covered. The collection is terminated by the wrapped range:
Low=collection[collection.size()-1], High=collection[0].
For each collection item we also assign BasicBlock, Range+BasicBlock
will called "Cluster". E.g.:
[1 -> Default] [2 -> Successor0] [5 -> Successor1] [8 -> Successor2]
That means that we have 3 clusters:
[2, 5) -> Successor0
[5, 8) -> Successor1
[8, 1) -> Successor2 // This range is wrapped.
2. I introduced successor ID (SID).
We need associate successors with case-ranges. But both ranges and
successors collections may be changed asynchronously:
Successors may change its indices during 'remove' operation.
Ranges may be removed.
But we need to keep always actual successor information for each range.
Even if successor was replaced by optimizer or its index was changed.
That's why SID was introduced, it will the same always. In that case
several SIDs may be assigned to the same successor after optimization.
3. Ranges directed to the default successor are always skipped during
iteration. Thus when user invokes getNumRanges, he got number of
non-default ranges. When user gets iterator case_begin(), he got
iterator to the first non-default range. And so on.
Probably its is less generic way. But it helps to reduce ranges
processing time. Since we process default after all, as some kind of
remainder.
4. Support for clusterification. Iterator has method
getClusterAndGoNext. This method allows to iterate over merged ranges
with the same successor and neighbouring borders. So if you need to
collect optimized clusters you just should use
CaseIt::getClusterAndGoNext instead of standard ++ operation.
P.S.: IntegersSubset, IntegersSubsetMapping and IntegersSubsetTest will
go away. I excluded these changes from current patch for better and
cleaner looking.
Thanks,
-Stepan.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cr-refactor-2012-08-03-prototype-2.patch
Type: text/x-patch
Size: 40131 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120803/37c44369/attachment.bin>
More information about the llvm-commits
mailing list