[llvm-commits] Reworked SwitchInst prototype with case-ranges.
Stepan Dyatkovskiy
stpworld at narod.ru
Tue Oct 23 23:46:32 PDT 2012
Hi Duncan. I'd propose to use "unreacheble" block. I also propose to
mark ranges with some tombstone marker and skip them in iteration
cycles. Based on example in previous post, initially we should have next
collection of numbers:
Format is: [Low, SuccessorIndex]
[0, 0]
[5, 1]
[10, 2]
[15, 3]
While successors collection contains the next successors:
[Successor0, Successor1, Successor2, Successor3]
removeRange("[5..10)") will changes these collection with next way:
[0, 0]
[5, *Tombstone*]
[10, 2]
[15, 3]
[Successor0, *Unreachable*, Successor2, Successor3]
What do you think about it?
It doesn't means that I deny schema with IRBuilder. E.g. if you know
that most of cases will be removed, of course it is better to rebuild
the 'switch'.
P.S.: Based on some additional statistics, I found that removeCase is
used for only ~1.6% of all switches. Though if "remove" operation has a
place, it removes about ~32% of all cases.
The link to the statistics post is here:
http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-October/054750.html
-Stepan.
Duncan Sands wrote:
> Hi Stepan,
>
>> One more question. Let assume, default case went away, and we have
>> next ranges set:
>> [0..5) --> Successor0
>> [5..10) --> Successor1
>> [10..15) --> Successor2
>> [15..0) --> Successor3
>>
>> Remove range [5..10):
>
> a "remove" operation doesn't make any sense and shouldn't exist. All that
> makes sense is saying: change 5..10 to now go to successorXYZ. Most of the
> time the optimizer making the change will know perfectly well where 5..10
> should go, so no problem. There is another case though: when the
> optimizers
> prove that 5..10 are impossible, i.e. cannot occur. Then the optimizers
> should
> do the optimal thing :) Which is probably to send 5..10 to the same
> place as
> the abutting ranges. In your example this means either to Successor0 or
> Successor1. Probably the best thing to do is to add them to whichever
> of these
> has the largest set of values going to it. In your case they both have 6
> values going to them. At this point the optimizers will have to make an
> arbitrary choice, eg it chooses to send them to Successor0. An
> alternative is
> to allow a destination to be "undef" and send 5..10 to undef. Or
> introduce a
> basic block containing only "unreachable" and send 5..10 there.
More information about the llvm-commits
mailing list