diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-05-27 09:02:25 +0000 | 
|---|---|---|
| committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-05-27 09:02:25 +0000 | 
| commit | 4642a57fbfda606d6af3da4f0ee5c17c96cfcce5 (patch) | |
| tree | 9e974b951d5d21527747287cee31f89993d22637 /llvm/lib/Transforms/InstCombine | |
| parent | 99302edd1c63639204f0f1a8799384995dba4ca1 (diff) | |
| download | bcm5719-llvm-4642a57fbfda606d6af3da4f0ee5c17c96cfcce5.tar.gz bcm5719-llvm-4642a57fbfda606d6af3da4f0ee5c17c96cfcce5.zip | |
Revert: r270973 - [X86][SSE] Replace (V)PMOVSX and (V)PMOVZX integer extension intrinsics with generic IR (llvm)
llvm-svn: 270976
Diffstat (limited to 'llvm/lib/Transforms/InstCombine')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 44 | 
1 files changed, 44 insertions, 0 deletions
| diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index c87d0466a9d..c07ca85d3a4 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -325,6 +325,24 @@ static Value *simplifyX86immShift(const IntrinsicInst &II,    return Builder.CreateAShr(Vec, ShiftVec);  } +static Value *simplifyX86extend(const IntrinsicInst &II, +                                InstCombiner::BuilderTy &Builder, +                                bool SignExtend) { +  VectorType *SrcTy = cast<VectorType>(II.getArgOperand(0)->getType()); +  VectorType *DstTy = cast<VectorType>(II.getType()); +  unsigned NumDstElts = DstTy->getNumElements(); + +  // Extract a subvector of the first NumDstElts lanes and sign/zero extend. +  SmallVector<int, 8> ShuffleMask; +  for (int i = 0; i != (int)NumDstElts; ++i) +    ShuffleMask.push_back(i); + +  Value *SV = Builder.CreateShuffleVector(II.getArgOperand(0), +                                          UndefValue::get(SrcTy), ShuffleMask); +  return SignExtend ? Builder.CreateSExt(SV, DstTy) +                    : Builder.CreateZExt(SV, DstTy); +} +  static Value *simplifyX86insertps(const IntrinsicInst &II,                                    InstCombiner::BuilderTy &Builder) {    auto *CInt = dyn_cast<ConstantInt>(II.getArgOperand(2)); @@ -1631,6 +1649,32 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {      break;    } +  case Intrinsic::x86_avx2_pmovsxbd: +  case Intrinsic::x86_avx2_pmovsxbq: +  case Intrinsic::x86_avx2_pmovsxbw: +  case Intrinsic::x86_avx2_pmovsxdq: +  case Intrinsic::x86_avx2_pmovsxwd: +  case Intrinsic::x86_avx2_pmovsxwq: +    if (Value *V = simplifyX86extend(*II, *Builder, true)) +      return replaceInstUsesWith(*II, V); +    break; + +  case Intrinsic::x86_sse41_pmovzxbd: +  case Intrinsic::x86_sse41_pmovzxbq: +  case Intrinsic::x86_sse41_pmovzxbw: +  case Intrinsic::x86_sse41_pmovzxdq: +  case Intrinsic::x86_sse41_pmovzxwd: +  case Intrinsic::x86_sse41_pmovzxwq: +  case Intrinsic::x86_avx2_pmovzxbd: +  case Intrinsic::x86_avx2_pmovzxbq: +  case Intrinsic::x86_avx2_pmovzxbw: +  case Intrinsic::x86_avx2_pmovzxdq: +  case Intrinsic::x86_avx2_pmovzxwd: +  case Intrinsic::x86_avx2_pmovzxwq: +    if (Value *V = simplifyX86extend(*II, *Builder, false)) +      return replaceInstUsesWith(*II, V); +    break; +    case Intrinsic::x86_sse41_insertps:      if (Value *V = simplifyX86insertps(*II, *Builder))        return replaceInstUsesWith(*II, V); | 

