summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2012-12-19 20:16:09 +0000
committerEvan Cheng <evan.cheng@apple.com>2012-12-19 20:16:09 +0000
commiteae6d2ccea2df8de064758feb316543631183408 (patch)
treeeeec9205cacfd8f0db3d31cf068fda72e33b474b /llvm/lib/Analysis
parent870f4fe261352482137a7d874bd1dbc0152dcc2c (diff)
downloadbcm5719-llvm-eae6d2ccea2df8de064758feb316543631183408.tar.gz
bcm5719-llvm-eae6d2ccea2df8de064758feb316543631183408.zip
LLVM sdisel normalize bit extraction of the form:
((x & 0xff00) >> 8) << 2 to (x >> 6) & 0x3fc This is general goodness since it folds a left shift into the mask. However, the trailing zeros in the mask prevents the ARM backend from using the bit extraction instructions. And worse since the mask materialization may require an addition instruction. This comes up fairly frequently when the result of the bit twiddling is used as memory address. e.g. = ptr[(x & 0xFF0000) >> 16] We want to generate: ubfx r3, r1, #16, #8 ldr.w r3, [r0, r3, lsl #2] vs. mov.w r9, #1020 and.w r2, r9, r1, lsr #14 ldr r2, [r0, r2] Add a late ARM specific isel optimization to ARMDAGToDAGISel::PreprocessISelDAG(). It folds the left shift to the 'base + offset' address computation; change the mask to one which doesn't have trailing zeros and enable the use of ubfx. Note the optimization has to be done late since it's target specific and we don't want to change the DAG normalization. It's also fairly restrictive as shifter operands are not always free. It's only done for lsh 1 / 2. It's known to be free on some cpus and they are most common for address computation. This is a slight win for blowfish, rijndael, etc. rdar://12870177 llvm-svn: 170581
Diffstat (limited to 'llvm/lib/Analysis')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud