aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/IRObjectFile.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-07-04 08:11:49 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-07-04 08:11:49 +0000
commit5d79bb5d32be680858f8ffa6a820eb2276950c0c (patch)
tree4eed8e61798a9fe960011f3d7f0910575039dc18 /llvm/lib/Object/IRObjectFile.cpp
parent872d59232611d091ad806f78ca39cb14d01868ba (diff)
downloadllvm-5d79bb5d32be680858f8ffa6a820eb2276950c0c.zip
llvm-5d79bb5d32be680858f8ffa6a820eb2276950c0c.tar.gz
llvm-5d79bb5d32be680858f8ffa6a820eb2276950c0c.tar.bz2
[x86] Generalize BuildVectorSDNode::getConstantSplatValue to work for
any constant, constant FP, or undef splat and to tolerate any undef lanes in a splat, then replace all uses of isSplatVector in X86's lowering with it. This fixes issues where undef lanes in an otherwise splat vector would prevent the splat logic from firing. It is a touch more awkward to use this interface, but it is much more accurate. Suggestions for better interface structuring welcome. With this fix, the code generated with the widening legalization strategy for widen_cast-4.ll is *dramatically* improved as the special lowering strategies for a v16i8 SRA kick in even though the high lanes are undef. We also get a slightly different choice for broadcasting an aligned memory location, and use vpshufd instead of vbroadcastss. This looks like a minor win for pipelining and domain crossing, but a minor loss for the number of micro-ops. I suspect its a wash, but folks can easily tweak the lowering if they want. llvm-svn: 212324
Diffstat (limited to 'llvm/lib/Object/IRObjectFile.cpp')
0 files changed, 0 insertions, 0 deletions