[llvm-commits] Reworked SwitchInst prototype with case-ranges.
Stepan Dyatkovskiy
STPWORLD at narod.ru
Sun Sep 16 15:37:54 PDT 2012
ping
10.09.2012, 19:27, "Stepan Dyatkovskiy" <stpworld at narod.ru>:
> Hi Nuno,
>
>> Uhm, I see. This map can be used when performing backwards range
>> analysis (e.g., LazyValueInfo - LVI). Right now LVI has to iterate over
>> all switch cases.
>> For example, can we have this map being built lazily, and then cached?
>> If something changes in the switch, discard the cache.
>> I'm just trying to reduce the memory usage, since I'm not sure if this
>> map will be used that often.
>
> Not sure about lazy values. It allows to mark Value object as constant,
> nonconstant etc. Switch cases will just APInts, so LVI will not iterate
> over cases in future. In concept almost everywhere, where switch is
> analysed it is modified then, that will cause cache rebuilding. Though I
> to need think more about this idea.
>
> Perhaps we can replace removed BB operand with default BB? Then we can
> store BB-operand-index--to--range-index safely.
>
>>> 3. Relative to defaults. IMHO default BB should be. It will less
>>> generic, but more comfortable for usage. We just add some cases and
>>> then say: "else do the default". And if user wishes to resolve the
>>> default BB he needn't to think "which BB is default here after all?",
>>> he just use SI->getDefaultDest().
>>> I also think that we should skip default ranges during cases
>>> enumeration, since it may confuse the user: e.g. he adds 3 ranges, but
>>> got 5, since there is two default ranges between. To me it is just
>>> good to mark wasted ranges as defaults. In this case we needn't to
>>> rebuild the ranges array, and we keep it without holes.
>>> So I propose to keep methods for default case "as is". So only
>>> 'switch' internals knows this secret :-)
>> But with a proper factory in place the user doesn't need to care about
>> filling holes, so I think the default case should go away.
>
> From the factory side - yes. We can implement factory that would
> compile generic ranges set.
>
> But how to be with "read" access? We can got performance regression if
> we will use generic way. Consider next example.
> We have 3 ranges: [0..5] [10..15] and [20..25]. All except these ranges
> is default. And we need to process each of them. In generic approach we
> need to process 6 ranges: [0..5], [6..9], [10..15], [16..19], [20..25]
> and [26..-1] // the last one is wrapping.
> In old style approach it will 4 ranges only. Internally we use generic
> representation and have 6 ranges too, but Case iterator will skip
> default ranges.
>
> -Stepan.
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list