diff options
| author | Sanjay Patel <spatel@rotateright.com> | 2016-04-12 23:16:23 +0000 |
|---|---|---|
| committer | Sanjay Patel <spatel@rotateright.com> | 2016-04-12 23:16:23 +0000 |
| commit | 5e5056d93971a6dae6918a5869d348962fab2fa2 (patch) | |
| tree | ec26dc088e8af2c7eb315d075502d0477c82b29e /llvm/lib/Transforms/InstCombine | |
| parent | 2d3690bc986c9d852ffd96f96ba274750ef084b3 (diff) | |
| download | bcm5719-llvm-5e5056d93971a6dae6918a5869d348962fab2fa2.tar.gz bcm5719-llvm-5e5056d93971a6dae6918a5869d348962fab2fa2.zip | |
[x86, InstCombine] fix masked load pass-through operand to be a zero vector
This bug was introduced with:
http://reviews.llvm.org/rL262269
AVX masked loads are specified to set vector lanes to zero when the high bit of the mask
element for that lane is zero:
"If the mask is 0, the corresponding data element is set to zero in the load form of these
instructions, and unmodified in the store form." --Intel manual
Differential Revision: http://reviews.llvm.org/D19017
llvm-svn: 266148
Diffstat (limited to 'llvm/lib/Transforms/InstCombine')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 89f164a5fff..15d9f71510a 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -834,11 +834,12 @@ static Instruction *simplifyMaskedScatter(IntrinsicInst &II, InstCombiner &IC) { static Instruction *simplifyX86MaskedLoad(IntrinsicInst &II, InstCombiner &IC) { Value *Ptr = II.getOperand(0); Value *Mask = II.getOperand(1); + Constant *ZeroVec = Constant::getNullValue(II.getType()); // Special case a zero mask since that's not a ConstantDataVector. - // This masked load instruction does nothing, so return an undef. + // This masked load instruction creates a zero vector. if (isa<ConstantAggregateZero>(Mask)) - return IC.replaceInstUsesWith(II, UndefValue::get(II.getType())); + return IC.replaceInstUsesWith(II, ZeroVec); auto *ConstMask = dyn_cast<ConstantDataVector>(Mask); if (!ConstMask) @@ -857,7 +858,9 @@ static Instruction *simplifyX86MaskedLoad(IntrinsicInst &II, InstCombiner &IC) { // on each element's most significant bit (the sign bit). Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask); - CallInst *NewMaskedLoad = IC.Builder->CreateMaskedLoad(PtrCast, 1, BoolMask); + // The pass-through vector for an x86 masked load is a zero vector. + CallInst *NewMaskedLoad = + IC.Builder->CreateMaskedLoad(PtrCast, 1, BoolMask, ZeroVec); return IC.replaceInstUsesWith(II, NewMaskedLoad); } |

