[llvm-dev] (RFC) JumpMaps: switch statement optimization
Witold Waligora via llvm-dev
llvm-dev at lists.llvm.org
Tue Feb 14 05:28:23 PST 2017
JumpMap lowering is nearly identical to that of JumpTables with the
exception of lack of range-check basic-block.
We introduce JumpMapInfo structure which follows the same flow as
JumpTableInfo and is finally emitted by AsmPrinter.
There are many ways a Target may want to encode jumpmaps (deltas,
compression, relative vs absolute), so we plan to keep this flexible and
target-driven when upstreaming.
Witold
W dniu 2017-02-14 o 10:53, Nema, Ashutosh pisze:
> Hi Witold,
>
> Can you explain what you meant by adding support in compiler_rt & changes in lowering.
>
> Did you tried any benchmarks, please share if you have any numbers with performance improvements & code size reduction ?
>
> Regards,
> Ashutosh
>
> -----Original Message-----
> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of Witold Waligora via llvm-dev
> Sent: Monday, February 13, 2017 6:41 PM
> To: llvm-dev at lists.llvm.org
> Subject: [llvm-dev] (RFC) JumpMaps: switch statement optimization
>
> Hi All,
>
> This is our first appearance on llvm-dev so a small introduction is in order.
> We are a team of two working for good few years now on an out-of-tree embedded back-end. Our primary goal is code size, secondary performance.
> We've recently implemented an optimization that we believe others could use. It's about time to contribute back.
>
> -------------------------------------------------------
> JumpMaps: a generalization of JumpTables JumpTables produce fast and small code but have a limitation - they only work if case values are easy to compute from the variable being switch()ed. To overcome this limitation we introduce a {key,value} structure - a JumpMap.
>
> Simplifying somewhat, LLVM would currently generate a sequential
> if-elseif- for small switches and an inline binary-search for large switches, if it can't produce a JumpTable. JumpMaps would instead generate a call followed by a jump-through-register.
> Pseudo-code example:
>
> switch(x) {
> case 0x6851: {BB1}
> case 0x1383: {BB2}
> case 0x2224: {BB3}
> default: {defaultBB}
> }
>
> Without Jump Maps:
> if(x==0x6851) {
> goto BB1
> }
> else if(x==0x1383) {
> goto BB2
> }
> else if(x==0x2224){
> goto BB3
> }
> else{
> goto defaultBB
> }
>
> With Jump Maps:
> jumpmap_0 = {
> keys = {3, 0x6851, 0x1383, 0x2224}
> vals = {defaultBB, BB1, BB2, BB3}
> }
> addr dst = __jumpmap_find(&jumpmap_0, x)
> goto dst;
>
> On our target Jump Maps produce both smaller and faster code even for quite small switch statements. We believe other architectures would benefit as well, X86 and ARM included:
> - jumpmap struct has a good chance of being cached more efficiently than a large chunk of inline binary-search code
> - for large switches branch prediction should have an easier time compared to inline binary-search
> - embedded architectures (ARM, MSP430) would benefit from smaller code (trading off .text for .rodata)
>
> In terms of lowering, JumpMap flow is very similar to that of JumpTables. The lowering is even slightly easier as JumpMaps do not require an extra range-check basic-block - the default case is also handled by __jumpmap_find.
> Targets need to provide lowering for the map structure and __jumpmap_find function, which would typically become a part of compier-rt library and could be written in hand-crafted asm for extra speed.
>
>
> Questions or comments?
> Please let me know.
>
>
> Best Regards,
> Witold Waligóra
> Myre Laboratories
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
More information about the llvm-dev
mailing list