diff options
| author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2014-05-27 15:57:51 +0000 |
|---|---|---|
| committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2014-05-27 15:57:51 +0000 |
| commit | 71dddd51d928945d5ceb7e84322f2fe8244054d2 (patch) | |
| tree | f9f6ca3db859efd130d529071979c3b48e5ec1ef /clang/test/CodeGen | |
| parent | 74bae981a521a292930ec1b074ed1ae1546a7f60 (diff) | |
| download | bcm5719-llvm-71dddd51d928945d5ceb7e84322f2fe8244054d2.tar.gz bcm5719-llvm-71dddd51d928945d5ceb7e84322f2fe8244054d2.zip | |
[PATCH] Correct type used for VADD_SPLAT optimization on PowerPC
In PPCISelLowering.cpp: PPCTargetLowering::LowerBUILD_VECTOR(), there
is an optimization for certain patterns to generate one or two vector
splats followed by a vector add or subtract. This operation is
represented by a VADD_SPLAT in the selection DAG. Prior to this
patch, it was possible for the VADD_SPLAT to be assigned the wrong
data type, causing incorrect code generation. This patch corrects the
problem.
Specifically, the code previously assigned the value type of the
BUILD_VECTOR node to the newly generated VADD_SPLAT node. This is
correct much of the time, but not always. The problem is that the
call to isConstantSplat() may return a SplatBitSize that is not the
same as the number of bits in the original element vector type. The
correct type to assign is a vector type with the same element bit size
as SplatBitSize.
The included test case shows an example of this, where the
BUILD_VECTOR node has a type of v16i8. The vector to be built is {0,
16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16, 0, 16}. isConstantSplat
detects that we can generate a splat of 16 for type v8i16, which is
the type we must assign to the VADD_SPLAT node. If we do not, we
generate a vspltisb of 8 and a vaddubm, which generates the incorrect
result {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16}. The correct code generation is a vspltish of 8 and a vadduhm.
This patch also corrected code generation for
CodeGen/PowerPC/2008-07-10-SplatMiscompile.ll, which had been marked
as an XFAIL, so we can remove the XFAIL from the test case.
llvm-svn: 209662
Diffstat (limited to 'clang/test/CodeGen')
0 files changed, 0 insertions, 0 deletions

