summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorDaniel Sanders <daniel.sanders@imgtec.com>2013-11-22 13:14:06 +0000
committerDaniel Sanders <daniel.sanders@imgtec.com>2013-11-22 13:14:06 +0000
commit630dbe0a14d54659ccb02e6f7fdf0cd8eb36a880 (patch)
tree3b39406e6d4c53240b2a54be2a2b464ef48172dd /llvm/lib/Target
parent831bfabad947faa908b3d9630ee545e982983916 (diff)
downloadbcm5719-llvm-630dbe0a14d54659ccb02e6f7fdf0cd8eb36a880.tar.gz
bcm5719-llvm-630dbe0a14d54659ccb02e6f7fdf0cd8eb36a880.zip
[mips][msa] Fix corner case for integer constant splats with undef values.
lowerBUILD_VECTOR() was treating integer constant splats as being legal regardless of whether they had undef values. This caused instruction selection failures when the undefs were legalized to zero, making the constant non-splat. Fixed this by requiring HasAnyUndef to be false for a integer constant splat to be legal. If it is true, a new node is generated with the undefs replaced with the necessary values to remain a splat. llvm-svn: 195455
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/Mips/MipsSEISelLowering.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Target/Mips/MipsSEISelLowering.cpp b/llvm/lib/Target/Mips/MipsSEISelLowering.cpp
index c02c235eb7d..0c9cecb7335 100644
--- a/llvm/lib/Target/Mips/MipsSEISelLowering.cpp
+++ b/llvm/lib/Target/Mips/MipsSEISelLowering.cpp
@@ -2211,8 +2211,9 @@ SDValue MipsSETargetLowering::lowerBUILD_VECTOR(SDValue Op,
// If the value fits into a simm10 then we can use ldi.[bhwd]
// However, if it isn't an integer type we will have to bitcast from an
- // integer type first.
- if (ResTy.isInteger() && SplatValue.isSignedIntN(10))
+ // integer type first. Also, it there are any undefs, we must lower them
+ // to defined values first.
+ if (ResTy.isInteger() && !HasAnyUndefs && SplatValue.isSignedIntN(10))
return Op;
EVT ViaVecTy;
OpenPOWER on IntegriCloud