mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Fix PR18054
- Fix bug in (vsext (vzext x)) -> (vsext x) in SIGN_EXTEND_IN_REG lowering where we need to check whether x is a vector type (in-reg type) of i8, i16 or i32; otherwise, that optimization is not valid. llvm-svn: 195779
This commit is contained in:
parent
c8e93646d8
commit
8c702e1a18
@ -13166,19 +13166,27 @@ SDValue X86TargetLowering::LowerSIGN_EXTEND_INREG(SDValue Op,
|
||||
// fall through
|
||||
case MVT::v4i32:
|
||||
case MVT::v8i16: {
|
||||
// (sext (vzext x)) -> (vsext x)
|
||||
SDValue Op0 = Op.getOperand(0);
|
||||
SDValue Op00 = Op0.getOperand(0);
|
||||
SDValue Tmp1;
|
||||
// Hopefully, this VECTOR_SHUFFLE is just a VZEXT.
|
||||
if (Op0.getOpcode() == ISD::BITCAST &&
|
||||
Op00.getOpcode() == ISD::VECTOR_SHUFFLE)
|
||||
Op00.getOpcode() == ISD::VECTOR_SHUFFLE) {
|
||||
// (sext (vzext x)) -> (vsext x)
|
||||
Tmp1 = LowerVectorIntExtend(Op00, Subtarget, DAG);
|
||||
if (Tmp1.getNode()) {
|
||||
SDValue Tmp1Op0 = Tmp1.getOperand(0);
|
||||
assert(Tmp1Op0.getOpcode() == X86ISD::VZEXT &&
|
||||
"This optimization is invalid without a VZEXT.");
|
||||
return DAG.getNode(X86ISD::VSEXT, dl, VT, Tmp1Op0.getOperand(0));
|
||||
if (Tmp1.getNode()) {
|
||||
EVT ExtraEltVT = ExtraVT.getVectorElementType();
|
||||
// This folding is only valid when the in-reg type is a vector of i8,
|
||||
// i16, or i32.
|
||||
if (ExtraEltVT == MVT::i8 || ExtraEltVT == MVT::i16 ||
|
||||
ExtraEltVT == MVT::i32) {
|
||||
SDValue Tmp1Op0 = Tmp1.getOperand(0);
|
||||
assert(Tmp1Op0.getOpcode() == X86ISD::VZEXT &&
|
||||
"This optimization is invalid without a VZEXT.");
|
||||
return DAG.getNode(X86ISD::VSEXT, dl, VT, Tmp1Op0.getOperand(0));
|
||||
}
|
||||
Op0 = Tmp1;
|
||||
}
|
||||
}
|
||||
|
||||
// If the above didn't work, then just use Shift-Left + Shift-Right.
|
||||
|
10
test/CodeGen/X86/pr18054.ll
Normal file
10
test/CodeGen/X86/pr18054.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-pc-linux -mcpu=penryn | FileCheck %s
|
||||
|
||||
define void @foo(<16 x i32>* %p, <16 x i1> %x) {
|
||||
%ret = sext <16 x i1> %x to <16 x i32>
|
||||
store <16 x i32> %ret, <16 x i32>* %p
|
||||
ret void
|
||||
; CHECK: foo
|
||||
; CHECK-NOT: pmovsxbd
|
||||
; CHECK: ret
|
||||
}
|
Loading…
Reference in New Issue
Block a user