Lines Matching full:hvc
62 cl::opt<bool> DumpModule("hvc-dump-module", cl::Hidden);
63 cl::opt<bool> VAEnabled("hvc-va", cl::Hidden, cl::init(true)); // Align
64 cl::opt<bool> VIEnabled("hvc-vi", cl::Hidden, cl::init(true)); // Idioms
65 cl::opt<bool> VADoFullStores("hvc-va-full-stores", cl::Hidden);
67 cl::opt<unsigned> VAGroupCountLimit("hvc-va-group-count-limit", cl::Hidden,
69 cl::opt<unsigned> VAGroupSizeLimit("hvc-va-group-size-limit", cl::Hidden,
199 AlignVectors(const HexagonVectorCombine &HVC_) : HVC(HVC_) {}
209 AddrInfo(const HexagonVectorCombine &HVC, Instruction *I, Value *A, Type *T,
212 NeedAlign(HVC.getTypeAlignment(ValTy)) {}
364 const HexagonVectorCombine &HVC;
422 HvxIdioms(const HexagonVectorCombine &HVC_) : HVC(HVC_) {
423 auto *Int32Ty = HVC.getIntTy(32);
424 HvxI32Ty = HVC.getHvxTy(Int32Ty, /*Pair=*/false);
425 HvxP32Ty = HVC.getHvxTy(Int32Ty, /*Pair=*/true);
480 const HexagonVectorCombine &HVC;
624 return AddrInfo(HVC, L, L->getPointerOperand(), L->getType(),
627 return AddrInfo(HVC, S, S->getPointerOperand(),
633 return AddrInfo(HVC, II, II->getArgOperand(0), II->getType(),
636 return AddrInfo(HVC, II, II->getArgOperand(1),
645 return HVC.HST.isTypeForHVX(AI.ValTy);
671 return HVC.getFullValue(HVC.getBoolTy(HVC.length(VecTy)));
672 return HVC.getFullValue(HVC.getBoolTy());
690 return Builder.CreatePtrAdd(Ptr, HVC.getConstInt(Adjust), "gep");
705 Value *AsInt = Builder.CreatePtrToInt(Ptr, HVC.getIntTy(), "pti");
706 Value *Mask = HVC.getConstInt(-Alignment);
716 bool HvxHasPredLoad = HVC.HST.useHVXV62Ops();
721 if (HVC.isFalse(Predicate))
723 if (!HVC.isTrue(Predicate) && HvxHasPredLoad) {
730 assert(!HVC.isUndef(Mask)); // Should this be allowed?
731 if (HVC.isZero(Mask))
733 if (HVC.isTrue(Mask))
757 assert(HVC.HST.isTypeForHVX(ValTy) &&
761 assert(HVC.getSizeOf(ValTy, HVC.Alloc) % Alignment == 0);
762 if (HVC.isFalse(Predicate))
764 if (HVC.isTrue(Predicate))
767 auto V6_vL32b_pred_ai = HVC.HST.getIntrinsicId(Hexagon::V6_vL32b_pred_ai);
769 return HVC.createHvxIntrinsic(Builder, V6_vL32b_pred_ai, ValTy,
770 {Predicate, Ptr, HVC.getConstInt(0)},
777 if (HVC.isZero(Mask) || HVC.isUndef(Val) || HVC.isUndef(Mask))
782 if (HVC.isFalse(Predicate))
784 if (HVC.isTrue(Predicate))
789 if (HVC.isTrue(Mask)) {
829 assert(HVC.HST.isTypeForHVX(Val->getType()) &&
832 if (HVC.isFalse(Predicate))
834 if (HVC.isTrue(Predicate))
837 assert(HVC.getSizeOf(Val, HVC.Alloc) % Alignment == 0);
838 auto V6_vS32b_pred_ai = HVC.HST.getIntrinsicId(Hexagon::V6_vS32b_pred_ai);
840 return HVC.createHvxIntrinsic(Builder, V6_vS32b_pred_ai, nullptr,
841 {Predicate, Ptr, HVC.getConstInt(0), Val},
876 if (auto D = HVC.calculatePointerDifference(AI.Addr, W.Addr))
907 traverseBlock(HVC.DT.getRootNode(), traverseBlock);
917 G.second, [&](auto &I) { return HVC.HST.isTypeForHVX(I.ValTy); });
943 if (!HVC.isSafeToMoveBeforeInBB(*Info.Inst, Base->getIterator()))
947 return HVC.isSafeToMoveBeforeInBB(*I, Base->getIterator()) &&
948 HVC.isSafeToClone(*I);
972 if (!HVC.HST.useHVXV62Ops())
1003 if (!HVC.isSafeToMoveBeforeInBB(*Info.Inst, Base->getIterator(), Move.Main))
1023 if (!HVC.HST.useHVXV62Ops())
1034 return HVC.HST.isHVXVectorType(
1085 assert(HVC.isSafeToClone(*I));
1103 Type *SecTy = HVC.getByteTy(ScLen);
1105 bool DoAlign = !HVC.isZero(AlignVal);
1110 auto *True = HVC.getFullValue(HVC.getBoolTy(ScLen));
1240 if (!HVC.isSafeToMoveBeforeInBB(*Load, BasePos))
1258 Val = HVC.vralignb(Builder, Val, NextLoad, AlignVal);
1267 Value *Accum = UndefValue::get(HVC.getByteTy(B.Seg.Size));
1288 Value *Pay = HVC.vbytes(Builder, getPayload(S->Seg.Val));
1290 HVC.insertb(Builder, Accum, Pay, S->Seg.Start, S->Seg.Size, S->Pos);
1312 Type *SecTy = HVC.getByteTy(ScLen);
1314 bool DoAlign = !HVC.isZero(AlignVal);
1337 Value *Zero = HVC.getNullValue(SecTy);
1342 Value *Mask = HVC.rescale(Builder, MakeVec(Builder, getMask(S.Seg.Val)),
1343 Pay->getType(), HVC.getByteTy());
1344 Value *PartM = HVC.insertb(Builder, Zero, HVC.vbytes(Builder, Mask),
1348 Value *PartV = HVC.insertb(Builder, Undef, HVC.vbytes(Builder, Pay),
1369 ASpanV[Index - 1].Seg.Val = HVC.vlalignb(Builder, PrevV, ThisV, AlignVal);
1370 ASpanM[Index - 1].Seg.Val = HVC.vlalignb(Builder, PrevM, ThisM, AlignVal);
1383 if (HVC.isUndef(Val) || HVC.isZero(Mask))
1395 HVC.vlsb(Builder, Mask),
1464 InstSimplifyFolder(HVC.DL));
1481 AlignVal = HVC.getConstInt(Diff);
1496 Builder.CreatePtrToInt(WithMinOffset.Addr, HVC.getIntTy(), "pti");
1505 VSpan.Blocks.emplace_back(AI.Inst, HVC.getSizeOf(AI.ValTy),
1512 int ScLen = Move.IsHvx ? HVC.HST.getVectorLength()
1545 if (!HVC.isByteVecTy(Ty))
1547 int Size = HVC.getSizeOf(Ty);
1548 if (HVC.HST.isTypeForHVX(Ty))
1549 return Size == static_cast<int>(HVC.HST.getVectorLength());
1554 LLVM_DEBUG(dbgs() << "Running HVC::AlignVectors on " << HVC.F.getName()
1603 LLVM_DEBUG(dbgs() << "After moveTogether:\n" << HVC.F);
1619 unsigned Bits = HVC.getNumSignificantBits(V, In);
1625 KnownBits Known = HVC.getKnownBits(V, In);
1725 if ((HVC.length(VecTy) * ElemWidth) % (8 * HVC.HST.getVectorLength()) != 0)
1745 InstSimplifyFolder(HVC.DL));
1768 auto *ResizeTy = VectorType::get(HVC.getIntTy(Width), VecTy);
1781 unsigned VecLen = HVC.length(ResizeTy);
1782 unsigned ChopLen = (8 * HVC.HST.getVectorLength()) / std::min(Width, 32u);
1789 ChopOp.X.Val = HVC.subvector(Builder, X, V * ChopLen, ChopLen);
1790 ChopOp.Y.Val = HVC.subvector(Builder, Y, V * ChopLen, ChopLen);
1799 Value *Cat = HVC.concat(Builder, Results);
1847 Value *RoundVal = HVC.getConstSplat(Prod32->getType(), 1 << *Op.RoundAt);
1851 Value *ShiftAmt = HVC.getConstSplat(Prod32->getType(), Op.Frac);
1862 auto WordX = HVC.splitVectorElements(Builder, Op.X.Val, /*ToWidth=*/32);
1863 auto WordY = HVC.splitVectorElements(Builder, Op.Y.Val, /*ToWidth=*/32);
1870 Value *Zero = HVC.getNullValue(WordX[0]->getType());
1873 HVC.getConstSplat(HvxWordTy, 1 << (*Op.RoundAt % 32));
1881 Constant *ShiftAmt = HVC.getConstSplat(HvxWordTy, Op.Frac % 32);
1899 return HVC.joinVectorElements(Builder, WordP, Op.ResTy);
1905 assert(X.Val->getType()->getScalarType() == HVC.getIntTy(16));
1906 assert(HVC.HST.isHVXVectorType(EVT::getEVT(X.Val->getType(), false)));
1912 auto V6_vmpyhvsrs = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhvsrs);
1913 return HVC.createHvxIntrinsic(Builder, V6_vmpyhvsrs, X.Val->getType(),
1921 assert(InpTy->getScalarType() == HVC.getIntTy(32));
1922 assert(HVC.HST.isHVXVectorType(EVT::getEVT(InpTy, false)));
1927 auto V6_vmpyewuh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyewuh);
1929 ? HVC.HST.getIntrinsicId(Hexagon::V6_vmpyowh_rnd_sacc)
1930 : HVC.HST.getIntrinsicId(Hexagon::V6_vmpyowh_sacc);
1932 HVC.createHvxIntrinsic(Builder, V6_vmpyewuh, InpTy, {X.Val, Y.Val});
1933 return HVC.createHvxIntrinsic(Builder, V6_vmpyo_acc, InpTy,
1942 if (VecTy == HvxI32Ty && HVC.HST.useHVXV62Ops()) {
1945 if (CarryIn == nullptr && HVC.HST.useHVXV66Ops()) {
1946 AddCarry = HVC.HST.getIntrinsicId(Hexagon::V6_vaddcarryo);
1948 AddCarry = HVC.HST.getIntrinsicId(Hexagon::V6_vaddcarry);
1950 CarryIn = HVC.getNullValue(HVC.getBoolTy(HVC.length(VecTy)));
1953 Value *Ret = HVC.createHvxIntrinsic(Builder, AddCarry,
1971 auto V6_vandqrt = HVC.HST.getIntrinsicId(Hexagon::V6_vandqrt);
1973 HVC.createHvxIntrinsic(Builder, V6_vandqrt, /*RetTy=*/nullptr,
1974 {CarryIn, HVC.getConstInt(Mask)});
1990 V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhv);
1993 V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyhus);
1995 V6_vmpyh = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyuhv);
2000 HVC.createHvxIntrinsic(Builder, V6_vmpyh, HvxP32Ty, {Y.Val, X.Val});
2002 return HVC.vshuff(Builder, HVC.sublo(Builder, P), HVC.subhi(Builder, P));
2007 Type *HvxI16Ty = HVC.getHvxTy(HVC.getIntTy(16), /*Pair=*/false);
2009 if (HVC.HST.useHVXV69Ops()) {
2011 auto V6_vmpyuhvs = HVC.HST.getIntrinsicId(Hexagon::V6_vmpyuhvs);
2012 return HVC.createHvxIntrinsic(Builder, V6_vmpyuhvs, HvxI16Ty,
2017 Type *HvxP16Ty = HVC.getHvxTy(HVC.getIntTy(16), /*Pair=*/true);
2020 unsigned Len = HVC.length(HvxP16Ty) / 2;
2027 HVC.sublo(Builder, Pair16), HVC.subhi(Builder, Pair16), PickOdd, "shf");
2046 Value *Parts = HVC.createHvxIntrinsic(Builder, V6_vmpy_parts, nullptr,
2061 if (HVC.isZero(WordX[Idx]))
2063 else if (HVC.isZero(WordY[Idx]))
2098 Value *Zero = HVC.getNullValue(WordX[0]->getType());
2133 for (BasicBlock &B : HVC.F) {
2143 RecursivelyDeleteTriviallyDeadInstructions(&*It, &HVC.TLI);
2970 HexagonVectorCombine HVC(F, AA, AC, DT, SE, TLI, TM);
2971 return HVC.run();