[llvm-commits] [LLVM, SwitchInst, case ranges] Auxiliary patch #1
Stepan Dyatkovskiy
STPWORLD at narod.ru
Thu Dec 15 10:41:38 PST 2011
Ping.
--
Truly yours,
Stepan Dyatkovskiy
12.12.2011, 12:50, "Stepan Dyatkovskiy" <stpworld at narod.ru>:
> Ping.
>
> -Stepan.
>
> Stepan Dyatkovskiy wrote:
>
>> ping.
>>
>> Stepan Dyatkovskiy wrote:
>>> Ping.
>>>
>>> -Stepan.
>>>
>>> Stepan Dyatkovskiy wrote:
>>>> ping.
>>>>
>>>> -Stepan.
>>>>
>>>> Stepan Dyatkovskiy wrote:
>>>>> ping.
>>>>> -Stepan.
>>>>>
>>>>> Stepan Dyatkovskiy wrote:
>>>>>> Hello, Duncan.
>>>>>>
>>>>>> Duncan Sands wrote:
>>>>>>> I guess Anton can comment on codegen, but the fact that it doesn't make
>>>>>>> codegen
>>>>>>> harder has nothing to do with increasing the complexity of the
>>>>>>> optimizers, since
>>>>>>> they work at the IR level. It may be that case ranges allow the
>>>>>>> optimizers to
>>>>>>> do a better job. It may be that they simplify the optimizers. But it
>>>>>>> also may
>>>>>>> be the opposite: they might make switches harder to work with and reason
>>>>>>> about
>>>>>>> for no advantage. Which is it? Do you have an example where case ranges
>>>>>>> would
>>>>>>> result in better code, or make it easier to produce better code?
>>>>>> I made impact analysis for new case ranges feature.
>>>>>> 24 out of more than 100 optimizations are affected. 20 of 24 just
>>>>>> require an integration of a new "case-range" type, i.e. small change of
>>>>>> code without. The remaining 4 requires some bigger changes. All affected
>>>>>> optimizers are listed in attached spreadsheet.
>>>>>>
>>>>>> Patches that are submitted in this branch are just functionality
>>>>>> extension for current classes. These patches doesn't brake any of
>>>>>> existing optimizations and keeps its speed without changes.
>>>>>>
>>>>>> Well. Let's enumerate 4 optimizations that should be reworked.
>>>>>>
>>>>>> 1. LowerSwitch::Clusterify
>>>>>>
>>>>>> This method groups neighbouring cases (by value) that goes to the same
>>>>>> destination.
>>>>>>
>>>>>> For example:
>>>>>>
>>>>>> switch i32 %cond, label %default [
>>>>>> i32 1, label %successorA
>>>>>> i32 2, label %successorA
>>>>>> i32 5, label %successorB
>>>>>> i32 3, label %successorA
>>>>>> i32 6, label %successorB
>>>>>> ]
>>>>>>
>>>>>> will be grouped to the two clusters:
>>>>>>
>>>>>> [[i32 1] .. [i32 3]], label %successorA
>>>>>> [[i32 5] .. [i32 6]], label %successorB
>>>>>>
>>>>>> This method will work faster if clusters will presented explicitly using
>>>>>> new case ranges feature.
>>>>>>
>>>>>> 2. SimplifyCFG.cpp, TurnSwitchRangeIntoICmp (static function)
>>>>>>
>>>>>> "Turns a switch that contains only an integer range comparison into a
>>>>>> sub, an icmp and a branch." (written in method comments). Algorithm that
>>>>>> determines "solid" case range should be changed.
>>>>>>
>>>>>> Now compare two switches (don't look at syntax of second switch, it is
>>>>>> still a subject of another discussion):
>>>>>>
>>>>>> switch i32 %cond, label %default [
>>>>>> i32 1, label %successorA
>>>>>> i32 2, label %successorA
>>>>>> i32 3, label %successorA
>>>>>> ]
>>>>>>
>>>>>> and hypothetical switch:
>>>>>>
>>>>>> switch i32 %cond, label %default [
>>>>>> [[i32 1],[i32 3]], label %successorA ; case range [1..3]
>>>>>> ]
>>>>>>
>>>>>> or even this one:
>>>>>>
>>>>>> switch i32 %cond, label %default [
>>>>>> [[i32 1],[i32 2]], label %successorA ; case range [1..2]
>>>>>> i32 3, label %successorA ; single case value "3"
>>>>>> ]
>>>>>>
>>>>>> Its obvious that last two switches will be processed faster than the
>>>>>> first one. We doesn't need to perform analysis for each separated case
>>>>>> value. We already know - that it is a range.
>>>>>>
>>>>>> 3. SimplifyCFG.cpp, EliminateDeadSwitchCases (static function).
>>>>>>
>>>>>> Here switch condition is analysed. We try to determine "1" and "0" bits
>>>>>> that MUST be in condition value. If we found them, then we look at case
>>>>>> values; if these bits are absent in case value we remove it since it
>>>>>> will be never equal to condition.
>>>>>> I need to think more about the ways of case ranges processing here. At
>>>>>> least we can represent case range as separated values set and apply
>>>>>> current algorithm to it. It slow down the processing a little bit, but
>>>>>> the complexity itself will be not increased. I'm sure that there are
>>>>>> also exists algorithms that allows to eliminate whole case ranges: e.g.
>>>>>> we can apply current algorithm to high bits that are constant in case
>>>>>> range.
>>>>>>
>>>>>> 4. lib/Transforms/Scalar/LoopUnswitch.cpp (the set of methods).
>>>>>>
>>>>>> Just a quote from LoopUnswitch.cpp header
>>>>>>
>>>>>> [quote]
>>>>>> This pass transforms loops that contain branches on loop-invariant
>>>>>> conditions
>>>>>> to have multiple loops. For example, it turns the left into the right code.
>>>>>>
>>>>>> for (...) if (lic)
>>>>>> A for (...)
>>>>>> if (lic) A; B; C
>>>>>> B else
>>>>>> C for (...)
>>>>>> A; C
>>>>>> [/quote]
>>>>>>
>>>>>> I also must think more about case ranges unswithing here.
>>>>>> By now loops with switch instruction are unswitched value-by-value.
>>>>>> There is no any case-values clustering before unswitching. For example
>>>>>> for case range [0..9] we need to run unswitch process 10 times!
>>>>>> Theoretically, explicitly given case ranges and properly implemented
>>>>>> unswitching should make this optimization better.
>>>>>>
>>>>>> So, as you can see complexity will not changed and even some of
>>>>>> optimizations will work faster.
>>>>>>
>>>>>> Regards,
>>>>>> Stepan.
>>>>>>
>>>>>> _______________________________________________
>>>>>> llvm-commits mailing list
>>>>>> llvm-commits at cs.uiuc.edu
>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>> _______________________________________________
>>>>> llvm-commits mailing list
>>>>> llvm-commits at cs.uiuc.edu
>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> 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