1 //===-- AArch64TargetTransformInfo.cpp - AArch64 specific TTI -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "AArch64TargetTransformInfo.h"
10 #include "AArch64ExpandImm.h"
11 #include "MCTargetDesc/AArch64AddressingModes.h"
12 #include "llvm/Analysis/LoopInfo.h"
13 #include "llvm/Analysis/TargetTransformInfo.h"
14 #include "llvm/CodeGen/BasicTTIImpl.h"
15 #include "llvm/CodeGen/CostTable.h"
16 #include "llvm/CodeGen/TargetLowering.h"
17 #include "llvm/IR/IntrinsicInst.h"
18 #include "llvm/IR/IntrinsicsAArch64.h"
19 #include "llvm/IR/PatternMatch.h"
20 #include "llvm/Support/Debug.h"
21 #include "llvm/Transforms/InstCombine/InstCombiner.h"
22 #include <algorithm>
23 using namespace llvm;
24 using namespace llvm::PatternMatch;
25 
26 #define DEBUG_TYPE "aarch64tti"
27 
28 static cl::opt<bool> EnableFalkorHWPFUnrollFix("enable-falkor-hwpf-unroll-fix",
29                                                cl::init(true), cl::Hidden);
30 
31 bool AArch64TTIImpl::areInlineCompatible(const Function *Caller,
32                                          const Function *Callee) const {
33   const TargetMachine &TM = getTLI()->getTargetMachine();
34 
35   const FeatureBitset &CallerBits =
36       TM.getSubtargetImpl(*Caller)->getFeatureBits();
37   const FeatureBitset &CalleeBits =
38       TM.getSubtargetImpl(*Callee)->getFeatureBits();
39 
40   // Inline a callee if its target-features are a subset of the callers
41   // target-features.
42   return (CallerBits & CalleeBits) == CalleeBits;
43 }
44 
45 /// Calculate the cost of materializing a 64-bit value. This helper
46 /// method might only calculate a fraction of a larger immediate. Therefore it
47 /// is valid to return a cost of ZERO.
48 InstructionCost AArch64TTIImpl::getIntImmCost(int64_t Val) {
49   // Check if the immediate can be encoded within an instruction.
50   if (Val == 0 || AArch64_AM::isLogicalImmediate(Val, 64))
51     return 0;
52 
53   if (Val < 0)
54     Val = ~Val;
55 
56   // Calculate how many moves we will need to materialize this constant.
57   SmallVector<AArch64_IMM::ImmInsnModel, 4> Insn;
58   AArch64_IMM::expandMOVImm(Val, 64, Insn);
59   return Insn.size();
60 }
61 
62 /// Calculate the cost of materializing the given constant.
63 InstructionCost AArch64TTIImpl::getIntImmCost(const APInt &Imm, Type *Ty,
64                                               TTI::TargetCostKind CostKind) {
65   assert(Ty->isIntegerTy());
66 
67   unsigned BitSize = Ty->getPrimitiveSizeInBits();
68   if (BitSize == 0)
69     return ~0U;
70 
71   // Sign-extend all constants to a multiple of 64-bit.
72   APInt ImmVal = Imm;
73   if (BitSize & 0x3f)
74     ImmVal = Imm.sext((BitSize + 63) & ~0x3fU);
75 
76   // Split the constant into 64-bit chunks and calculate the cost for each
77   // chunk.
78   InstructionCost Cost = 0;
79   for (unsigned ShiftVal = 0; ShiftVal < BitSize; ShiftVal += 64) {
80     APInt Tmp = ImmVal.ashr(ShiftVal).sextOrTrunc(64);
81     int64_t Val = Tmp.getSExtValue();
82     Cost += getIntImmCost(Val);
83   }
84   // We need at least one instruction to materialze the constant.
85   return std::max<InstructionCost>(1, Cost);
86 }
87 
88 InstructionCost AArch64TTIImpl::getIntImmCostInst(unsigned Opcode, unsigned Idx,
89                                                   const APInt &Imm, Type *Ty,
90                                                   TTI::TargetCostKind CostKind,
91                                                   Instruction *Inst) {
92   assert(Ty->isIntegerTy());
93 
94   unsigned BitSize = Ty->getPrimitiveSizeInBits();
95   // There is no cost model for constants with a bit size of 0. Return TCC_Free
96   // here, so that constant hoisting will ignore this constant.
97   if (BitSize == 0)
98     return TTI::TCC_Free;
99 
100   unsigned ImmIdx = ~0U;
101   switch (Opcode) {
102   default:
103     return TTI::TCC_Free;
104   case Instruction::GetElementPtr:
105     // Always hoist the base address of a GetElementPtr.
106     if (Idx == 0)
107       return 2 * TTI::TCC_Basic;
108     return TTI::TCC_Free;
109   case Instruction::Store:
110     ImmIdx = 0;
111     break;
112   case Instruction::Add:
113   case Instruction::Sub:
114   case Instruction::Mul:
115   case Instruction::UDiv:
116   case Instruction::SDiv:
117   case Instruction::URem:
118   case Instruction::SRem:
119   case Instruction::And:
120   case Instruction::Or:
121   case Instruction::Xor:
122   case Instruction::ICmp:
123     ImmIdx = 1;
124     break;
125   // Always return TCC_Free for the shift value of a shift instruction.
126   case Instruction::Shl:
127   case Instruction::LShr:
128   case Instruction::AShr:
129     if (Idx == 1)
130       return TTI::TCC_Free;
131     break;
132   case Instruction::Trunc:
133   case Instruction::ZExt:
134   case Instruction::SExt:
135   case Instruction::IntToPtr:
136   case Instruction::PtrToInt:
137   case Instruction::BitCast:
138   case Instruction::PHI:
139   case Instruction::Call:
140   case Instruction::Select:
141   case Instruction::Ret:
142   case Instruction::Load:
143     break;
144   }
145 
146   if (Idx == ImmIdx) {
147     int NumConstants = (BitSize + 63) / 64;
148     InstructionCost Cost = AArch64TTIImpl::getIntImmCost(Imm, Ty, CostKind);
149     return (Cost <= NumConstants * TTI::TCC_Basic)
150                ? static_cast<int>(TTI::TCC_Free)
151                : Cost;
152   }
153   return AArch64TTIImpl::getIntImmCost(Imm, Ty, CostKind);
154 }
155 
156 InstructionCost
157 AArch64TTIImpl::getIntImmCostIntrin(Intrinsic::ID IID, unsigned Idx,
158                                     const APInt &Imm, Type *Ty,
159                                     TTI::TargetCostKind CostKind) {
160   assert(Ty->isIntegerTy());
161 
162   unsigned BitSize = Ty->getPrimitiveSizeInBits();
163   // There is no cost model for constants with a bit size of 0. Return TCC_Free
164   // here, so that constant hoisting will ignore this constant.
165   if (BitSize == 0)
166     return TTI::TCC_Free;
167 
168   // Most (all?) AArch64 intrinsics do not support folding immediates into the
169   // selected instruction, so we compute the materialization cost for the
170   // immediate directly.
171   if (IID >= Intrinsic::aarch64_addg && IID <= Intrinsic::aarch64_udiv)
172     return AArch64TTIImpl::getIntImmCost(Imm, Ty, CostKind);
173 
174   switch (IID) {
175   default:
176     return TTI::TCC_Free;
177   case Intrinsic::sadd_with_overflow:
178   case Intrinsic::uadd_with_overflow:
179   case Intrinsic::ssub_with_overflow:
180   case Intrinsic::usub_with_overflow:
181   case Intrinsic::smul_with_overflow:
182   case Intrinsic::umul_with_overflow:
183     if (Idx == 1) {
184       int NumConstants = (BitSize + 63) / 64;
185       InstructionCost Cost = AArch64TTIImpl::getIntImmCost(Imm, Ty, CostKind);
186       return (Cost <= NumConstants * TTI::TCC_Basic)
187                  ? static_cast<int>(TTI::TCC_Free)
188                  : Cost;
189     }
190     break;
191   case Intrinsic::experimental_stackmap:
192     if ((Idx < 2) || (Imm.getBitWidth() <= 64 && isInt<64>(Imm.getSExtValue())))
193       return TTI::TCC_Free;
194     break;
195   case Intrinsic::experimental_patchpoint_void:
196   case Intrinsic::experimental_patchpoint_i64:
197     if ((Idx < 4) || (Imm.getBitWidth() <= 64 && isInt<64>(Imm.getSExtValue())))
198       return TTI::TCC_Free;
199     break;
200   case Intrinsic::experimental_gc_statepoint:
201     if ((Idx < 5) || (Imm.getBitWidth() <= 64 && isInt<64>(Imm.getSExtValue())))
202       return TTI::TCC_Free;
203     break;
204   }
205   return AArch64TTIImpl::getIntImmCost(Imm, Ty, CostKind);
206 }
207 
208 TargetTransformInfo::PopcntSupportKind
209 AArch64TTIImpl::getPopcntSupport(unsigned TyWidth) {
210   assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
211   if (TyWidth == 32 || TyWidth == 64)
212     return TTI::PSK_FastHardware;
213   // TODO: AArch64TargetLowering::LowerCTPOP() supports 128bit popcount.
214   return TTI::PSK_Software;
215 }
216 
217 InstructionCost
218 AArch64TTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
219                                       TTI::TargetCostKind CostKind) {
220   auto *RetTy = ICA.getReturnType();
221   switch (ICA.getID()) {
222   case Intrinsic::umin:
223   case Intrinsic::umax: {
224     auto LT = TLI->getTypeLegalizationCost(DL, RetTy);
225     // umin(x,y) -> sub(x,usubsat(x,y))
226     // umax(x,y) -> add(x,usubsat(y,x))
227     if (LT.second == MVT::v2i64)
228       return LT.first * 2;
229     LLVM_FALLTHROUGH;
230   }
231   case Intrinsic::smin:
232   case Intrinsic::smax: {
233     static const auto ValidMinMaxTys = {MVT::v8i8,  MVT::v16i8, MVT::v4i16,
234                                         MVT::v8i16, MVT::v2i32, MVT::v4i32};
235     auto LT = TLI->getTypeLegalizationCost(DL, RetTy);
236     if (any_of(ValidMinMaxTys, [&LT](MVT M) { return M == LT.second; }))
237       return LT.first;
238     break;
239   }
240   case Intrinsic::sadd_sat:
241   case Intrinsic::ssub_sat:
242   case Intrinsic::uadd_sat:
243   case Intrinsic::usub_sat: {
244     static const auto ValidSatTys = {MVT::v8i8,  MVT::v16i8, MVT::v4i16,
245                                      MVT::v8i16, MVT::v2i32, MVT::v4i32,
246                                      MVT::v2i64};
247     auto LT = TLI->getTypeLegalizationCost(DL, RetTy);
248     // This is a base cost of 1 for the vadd, plus 3 extract shifts if we
249     // need to extend the type, as it uses shr(qadd(shl, shl)).
250     unsigned Instrs =
251         LT.second.getScalarSizeInBits() == RetTy->getScalarSizeInBits() ? 1 : 4;
252     if (any_of(ValidSatTys, [&LT](MVT M) { return M == LT.second; }))
253       return LT.first * Instrs;
254     break;
255   }
256   case Intrinsic::abs: {
257     static const auto ValidAbsTys = {MVT::v8i8,  MVT::v16i8, MVT::v4i16,
258                                      MVT::v8i16, MVT::v2i32, MVT::v4i32,
259                                      MVT::v2i64};
260     auto LT = TLI->getTypeLegalizationCost(DL, RetTy);
261     if (any_of(ValidAbsTys, [&LT](MVT M) { return M == LT.second; }))
262       return LT.first;
263     break;
264   }
265   case Intrinsic::experimental_stepvector: {
266     InstructionCost Cost = 1; // Cost of the `index' instruction
267     auto LT = TLI->getTypeLegalizationCost(DL, RetTy);
268     // Legalisation of illegal vectors involves an `index' instruction plus
269     // (LT.first - 1) vector adds.
270     if (LT.first > 1) {
271       Type *LegalVTy = EVT(LT.second).getTypeForEVT(RetTy->getContext());
272       InstructionCost AddCost =
273           getArithmeticInstrCost(Instruction::Add, LegalVTy, CostKind);
274       Cost += AddCost * (LT.first - 1);
275     }
276     return Cost;
277   }
278   default:
279     break;
280   }
281   return BaseT::getIntrinsicInstrCost(ICA, CostKind);
282 }
283 
284 /// The function will remove redundant reinterprets casting in the presence
285 /// of the control flow
286 static Optional<Instruction *> processPhiNode(InstCombiner &IC,
287                                               IntrinsicInst &II) {
288   SmallVector<Instruction *, 32> Worklist;
289   auto RequiredType = II.getType();
290 
291   auto *PN = dyn_cast<PHINode>(II.getArgOperand(0));
292   assert(PN && "Expected Phi Node!");
293 
294   // Don't create a new Phi unless we can remove the old one.
295   if (!PN->hasOneUse())
296     return None;
297 
298   for (Value *IncValPhi : PN->incoming_values()) {
299     auto *Reinterpret = dyn_cast<IntrinsicInst>(IncValPhi);
300     if (!Reinterpret ||
301         Reinterpret->getIntrinsicID() !=
302             Intrinsic::aarch64_sve_convert_to_svbool ||
303         RequiredType != Reinterpret->getArgOperand(0)->getType())
304       return None;
305   }
306 
307   // Create the new Phi
308   LLVMContext &Ctx = PN->getContext();
309   IRBuilder<> Builder(Ctx);
310   Builder.SetInsertPoint(PN);
311   PHINode *NPN = Builder.CreatePHI(RequiredType, PN->getNumIncomingValues());
312   Worklist.push_back(PN);
313 
314   for (unsigned I = 0; I < PN->getNumIncomingValues(); I++) {
315     auto *Reinterpret = cast<Instruction>(PN->getIncomingValue(I));
316     NPN->addIncoming(Reinterpret->getOperand(0), PN->getIncomingBlock(I));
317     Worklist.push_back(Reinterpret);
318   }
319 
320   // Cleanup Phi Node and reinterprets
321   return IC.replaceInstUsesWith(II, NPN);
322 }
323 
324 static Optional<Instruction *> instCombineConvertFromSVBool(InstCombiner &IC,
325                                                             IntrinsicInst &II) {
326   // If the reinterpret instruction operand is a PHI Node
327   if (isa<PHINode>(II.getArgOperand(0)))
328     return processPhiNode(IC, II);
329 
330   SmallVector<Instruction *, 32> CandidatesForRemoval;
331   Value *Cursor = II.getOperand(0), *EarliestReplacement = nullptr;
332 
333   const auto *IVTy = cast<VectorType>(II.getType());
334 
335   // Walk the chain of conversions.
336   while (Cursor) {
337     // If the type of the cursor has fewer lanes than the final result, zeroing
338     // must take place, which breaks the equivalence chain.
339     const auto *CursorVTy = cast<VectorType>(Cursor->getType());
340     if (CursorVTy->getElementCount().getKnownMinValue() <
341         IVTy->getElementCount().getKnownMinValue())
342       break;
343 
344     // If the cursor has the same type as I, it is a viable replacement.
345     if (Cursor->getType() == IVTy)
346       EarliestReplacement = Cursor;
347 
348     auto *IntrinsicCursor = dyn_cast<IntrinsicInst>(Cursor);
349 
350     // If this is not an SVE conversion intrinsic, this is the end of the chain.
351     if (!IntrinsicCursor || !(IntrinsicCursor->getIntrinsicID() ==
352                                   Intrinsic::aarch64_sve_convert_to_svbool ||
353                               IntrinsicCursor->getIntrinsicID() ==
354                                   Intrinsic::aarch64_sve_convert_from_svbool))
355       break;
356 
357     CandidatesForRemoval.insert(CandidatesForRemoval.begin(), IntrinsicCursor);
358     Cursor = IntrinsicCursor->getOperand(0);
359   }
360 
361   // If no viable replacement in the conversion chain was found, there is
362   // nothing to do.
363   if (!EarliestReplacement)
364     return None;
365 
366   return IC.replaceInstUsesWith(II, EarliestReplacement);
367 }
368 
369 static Optional<Instruction *> instCombineSVEDup(InstCombiner &IC,
370                                                  IntrinsicInst &II) {
371   IntrinsicInst *Pg = dyn_cast<IntrinsicInst>(II.getArgOperand(1));
372   if (!Pg)
373     return None;
374 
375   if (Pg->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue)
376     return None;
377 
378   const auto PTruePattern =
379       cast<ConstantInt>(Pg->getOperand(0))->getZExtValue();
380   if (PTruePattern != AArch64SVEPredPattern::vl1)
381     return None;
382 
383   // The intrinsic is inserting into lane zero so use an insert instead.
384   auto *IdxTy = Type::getInt64Ty(II.getContext());
385   auto *Insert = InsertElementInst::Create(
386       II.getArgOperand(0), II.getArgOperand(2), ConstantInt::get(IdxTy, 0));
387   Insert->insertBefore(&II);
388   Insert->takeName(&II);
389 
390   return IC.replaceInstUsesWith(II, Insert);
391 }
392 
393 static Optional<Instruction *> instCombineSVECmpNE(InstCombiner &IC,
394                                                    IntrinsicInst &II) {
395   LLVMContext &Ctx = II.getContext();
396   IRBuilder<> Builder(Ctx);
397   Builder.SetInsertPoint(&II);
398 
399   // Check that the predicate is all active
400   auto *Pg = dyn_cast<IntrinsicInst>(II.getArgOperand(0));
401   if (!Pg || Pg->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue)
402     return None;
403 
404   const auto PTruePattern =
405       cast<ConstantInt>(Pg->getOperand(0))->getZExtValue();
406   if (PTruePattern != AArch64SVEPredPattern::all)
407     return None;
408 
409   // Check that we have a compare of zero..
410   auto *DupX = dyn_cast<IntrinsicInst>(II.getArgOperand(2));
411   if (!DupX || DupX->getIntrinsicID() != Intrinsic::aarch64_sve_dup_x)
412     return None;
413 
414   auto *DupXArg = dyn_cast<ConstantInt>(DupX->getArgOperand(0));
415   if (!DupXArg || !DupXArg->isZero())
416     return None;
417 
418   // ..against a dupq
419   auto *DupQLane = dyn_cast<IntrinsicInst>(II.getArgOperand(1));
420   if (!DupQLane ||
421       DupQLane->getIntrinsicID() != Intrinsic::aarch64_sve_dupq_lane)
422     return None;
423 
424   // Where the dupq is a lane 0 replicate of a vector insert
425   if (!cast<ConstantInt>(DupQLane->getArgOperand(1))->isZero())
426     return None;
427 
428   auto *VecIns = dyn_cast<IntrinsicInst>(DupQLane->getArgOperand(0));
429   if (!VecIns ||
430       VecIns->getIntrinsicID() != Intrinsic::experimental_vector_insert)
431     return None;
432 
433   // Where the vector insert is a fixed constant vector insert into undef at
434   // index zero
435   if (!isa<UndefValue>(VecIns->getArgOperand(0)))
436     return None;
437 
438   if (!cast<ConstantInt>(VecIns->getArgOperand(2))->isZero())
439     return None;
440 
441   auto *ConstVec = dyn_cast<Constant>(VecIns->getArgOperand(1));
442   if (!ConstVec)
443     return None;
444 
445   auto *VecTy = dyn_cast<FixedVectorType>(ConstVec->getType());
446   auto *OutTy = dyn_cast<ScalableVectorType>(II.getType());
447   if (!VecTy || !OutTy || VecTy->getNumElements() != OutTy->getMinNumElements())
448     return None;
449 
450   unsigned NumElts = VecTy->getNumElements();
451   unsigned PredicateBits = 0;
452 
453   // Expand intrinsic operands to a 16-bit byte level predicate
454   for (unsigned I = 0; I < NumElts; ++I) {
455     auto *Arg = dyn_cast<ConstantInt>(ConstVec->getAggregateElement(I));
456     if (!Arg)
457       return None;
458     if (!Arg->isZero())
459       PredicateBits |= 1 << (I * (16 / NumElts));
460   }
461 
462   // If all bits are zero bail early with an empty predicate
463   if (PredicateBits == 0) {
464     auto *PFalse = Constant::getNullValue(II.getType());
465     PFalse->takeName(&II);
466     return IC.replaceInstUsesWith(II, PFalse);
467   }
468 
469   // Calculate largest predicate type used (where byte predicate is largest)
470   unsigned Mask = 8;
471   for (unsigned I = 0; I < 16; ++I)
472     if ((PredicateBits & (1 << I)) != 0)
473       Mask |= (I % 8);
474 
475   unsigned PredSize = Mask & -Mask;
476   auto *PredType = ScalableVectorType::get(
477       Type::getInt1Ty(Ctx), AArch64::SVEBitsPerBlock / (PredSize * 8));
478 
479   // Ensure all relevant bits are set
480   for (unsigned I = 0; I < 16; I += PredSize)
481     if ((PredicateBits & (1 << I)) == 0)
482       return None;
483 
484   auto *PTruePat =
485       ConstantInt::get(Type::getInt32Ty(Ctx), AArch64SVEPredPattern::all);
486   auto *PTrue = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_ptrue,
487                                         {PredType}, {PTruePat});
488   auto *ConvertToSVBool = Builder.CreateIntrinsic(
489       Intrinsic::aarch64_sve_convert_to_svbool, {PredType}, {PTrue});
490   auto *ConvertFromSVBool =
491       Builder.CreateIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool,
492                               {II.getType()}, {ConvertToSVBool});
493 
494   ConvertFromSVBool->takeName(&II);
495   return IC.replaceInstUsesWith(II, ConvertFromSVBool);
496 }
497 
498 static Optional<Instruction *> instCombineSVELast(InstCombiner &IC,
499                                                   IntrinsicInst &II) {
500   Value *Pg = II.getArgOperand(0);
501   Value *Vec = II.getArgOperand(1);
502   bool IsAfter = II.getIntrinsicID() == Intrinsic::aarch64_sve_lasta;
503 
504   auto *C = dyn_cast<Constant>(Pg);
505   if (IsAfter && C && C->isNullValue()) {
506     // The intrinsic is extracting lane 0 so use an extract instead.
507     auto *IdxTy = Type::getInt64Ty(II.getContext());
508     auto *Extract = ExtractElementInst::Create(Vec, ConstantInt::get(IdxTy, 0));
509     Extract->insertBefore(&II);
510     Extract->takeName(&II);
511     return IC.replaceInstUsesWith(II, Extract);
512   }
513 
514   auto *IntrPG = dyn_cast<IntrinsicInst>(Pg);
515   if (!IntrPG)
516     return None;
517 
518   if (IntrPG->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue)
519     return None;
520 
521   const auto PTruePattern =
522       cast<ConstantInt>(IntrPG->getOperand(0))->getZExtValue();
523 
524   // Can the intrinsic's predicate be converted to a known constant index?
525   unsigned Idx;
526   switch (PTruePattern) {
527   default:
528     return None;
529   case AArch64SVEPredPattern::vl1:
530     Idx = 0;
531     break;
532   case AArch64SVEPredPattern::vl2:
533     Idx = 1;
534     break;
535   case AArch64SVEPredPattern::vl3:
536     Idx = 2;
537     break;
538   case AArch64SVEPredPattern::vl4:
539     Idx = 3;
540     break;
541   case AArch64SVEPredPattern::vl5:
542     Idx = 4;
543     break;
544   case AArch64SVEPredPattern::vl6:
545     Idx = 5;
546     break;
547   case AArch64SVEPredPattern::vl7:
548     Idx = 6;
549     break;
550   case AArch64SVEPredPattern::vl8:
551     Idx = 7;
552     break;
553   case AArch64SVEPredPattern::vl16:
554     Idx = 15;
555     break;
556   }
557 
558   // Increment the index if extracting the element after the last active
559   // predicate element.
560   if (IsAfter)
561     ++Idx;
562 
563   // Ignore extracts whose index is larger than the known minimum vector
564   // length. NOTE: This is an artificial constraint where we prefer to
565   // maintain what the user asked for until an alternative is proven faster.
566   auto *PgVTy = cast<ScalableVectorType>(Pg->getType());
567   if (Idx >= PgVTy->getMinNumElements())
568     return None;
569 
570   // The intrinsic is extracting a fixed lane so use an extract instead.
571   auto *IdxTy = Type::getInt64Ty(II.getContext());
572   auto *Extract = ExtractElementInst::Create(Vec, ConstantInt::get(IdxTy, Idx));
573   Extract->insertBefore(&II);
574   Extract->takeName(&II);
575   return IC.replaceInstUsesWith(II, Extract);
576 }
577 
578 static Optional<Instruction *> instCombineRDFFR(InstCombiner &IC,
579                                                 IntrinsicInst &II) {
580   LLVMContext &Ctx = II.getContext();
581   IRBuilder<> Builder(Ctx);
582   Builder.SetInsertPoint(&II);
583   // Replace rdffr with predicated rdffr.z intrinsic, so that optimizePTestInstr
584   // can work with RDFFR_PP for ptest elimination.
585   auto *AllPat =
586       ConstantInt::get(Type::getInt32Ty(Ctx), AArch64SVEPredPattern::all);
587   auto *PTrue = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_ptrue,
588                                         {II.getType()}, {AllPat});
589   auto *RDFFR =
590       Builder.CreateIntrinsic(Intrinsic::aarch64_sve_rdffr_z, {}, {PTrue});
591   RDFFR->takeName(&II);
592   return IC.replaceInstUsesWith(II, RDFFR);
593 }
594 
595 Optional<Instruction *>
596 AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC,
597                                      IntrinsicInst &II) const {
598   Intrinsic::ID IID = II.getIntrinsicID();
599   switch (IID) {
600   default:
601     break;
602   case Intrinsic::aarch64_sve_convert_from_svbool:
603     return instCombineConvertFromSVBool(IC, II);
604   case Intrinsic::aarch64_sve_dup:
605     return instCombineSVEDup(IC, II);
606   case Intrinsic::aarch64_sve_cmpne:
607   case Intrinsic::aarch64_sve_cmpne_wide:
608     return instCombineSVECmpNE(IC, II);
609   case Intrinsic::aarch64_sve_rdffr:
610     return instCombineRDFFR(IC, II);
611   case Intrinsic::aarch64_sve_lasta:
612   case Intrinsic::aarch64_sve_lastb:
613     return instCombineSVELast(IC, II);
614   }
615 
616   return None;
617 }
618 
619 bool AArch64TTIImpl::isWideningInstruction(Type *DstTy, unsigned Opcode,
620                                            ArrayRef<const Value *> Args) {
621 
622   // A helper that returns a vector type from the given type. The number of
623   // elements in type Ty determine the vector width.
624   auto toVectorTy = [&](Type *ArgTy) {
625     return VectorType::get(ArgTy->getScalarType(),
626                            cast<VectorType>(DstTy)->getElementCount());
627   };
628 
629   // Exit early if DstTy is not a vector type whose elements are at least
630   // 16-bits wide.
631   if (!DstTy->isVectorTy() || DstTy->getScalarSizeInBits() < 16)
632     return false;
633 
634   // Determine if the operation has a widening variant. We consider both the
635   // "long" (e.g., usubl) and "wide" (e.g., usubw) versions of the
636   // instructions.
637   //
638   // TODO: Add additional widening operations (e.g., mul, shl, etc.) once we
639   //       verify that their extending operands are eliminated during code
640   //       generation.
641   switch (Opcode) {
642   case Instruction::Add: // UADDL(2), SADDL(2), UADDW(2), SADDW(2).
643   case Instruction::Sub: // USUBL(2), SSUBL(2), USUBW(2), SSUBW(2).
644     break;
645   default:
646     return false;
647   }
648 
649   // To be a widening instruction (either the "wide" or "long" versions), the
650   // second operand must be a sign- or zero extend having a single user. We
651   // only consider extends having a single user because they may otherwise not
652   // be eliminated.
653   if (Args.size() != 2 ||
654       (!isa<SExtInst>(Args[1]) && !isa<ZExtInst>(Args[1])) ||
655       !Args[1]->hasOneUse())
656     return false;
657   auto *Extend = cast<CastInst>(Args[1]);
658 
659   // Legalize the destination type and ensure it can be used in a widening
660   // operation.
661   auto DstTyL = TLI->getTypeLegalizationCost(DL, DstTy);
662   unsigned DstElTySize = DstTyL.second.getScalarSizeInBits();
663   if (!DstTyL.second.isVector() || DstElTySize != DstTy->getScalarSizeInBits())
664     return false;
665 
666   // Legalize the source type and ensure it can be used in a widening
667   // operation.
668   auto *SrcTy = toVectorTy(Extend->getSrcTy());
669   auto SrcTyL = TLI->getTypeLegalizationCost(DL, SrcTy);
670   unsigned SrcElTySize = SrcTyL.second.getScalarSizeInBits();
671   if (!SrcTyL.second.isVector() || SrcElTySize != SrcTy->getScalarSizeInBits())
672     return false;
673 
674   // Get the total number of vector elements in the legalized types.
675   InstructionCost NumDstEls =
676       DstTyL.first * DstTyL.second.getVectorMinNumElements();
677   InstructionCost NumSrcEls =
678       SrcTyL.first * SrcTyL.second.getVectorMinNumElements();
679 
680   // Return true if the legalized types have the same number of vector elements
681   // and the destination element type size is twice that of the source type.
682   return NumDstEls == NumSrcEls && 2 * SrcElTySize == DstElTySize;
683 }
684 
685 InstructionCost AArch64TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
686                                                  Type *Src,
687                                                  TTI::CastContextHint CCH,
688                                                  TTI::TargetCostKind CostKind,
689                                                  const Instruction *I) {
690   int ISD = TLI->InstructionOpcodeToISD(Opcode);
691   assert(ISD && "Invalid opcode");
692 
693   // If the cast is observable, and it is used by a widening instruction (e.g.,
694   // uaddl, saddw, etc.), it may be free.
695   if (I && I->hasOneUse()) {
696     auto *SingleUser = cast<Instruction>(*I->user_begin());
697     SmallVector<const Value *, 4> Operands(SingleUser->operand_values());
698     if (isWideningInstruction(Dst, SingleUser->getOpcode(), Operands)) {
699       // If the cast is the second operand, it is free. We will generate either
700       // a "wide" or "long" version of the widening instruction.
701       if (I == SingleUser->getOperand(1))
702         return 0;
703       // If the cast is not the second operand, it will be free if it looks the
704       // same as the second operand. In this case, we will generate a "long"
705       // version of the widening instruction.
706       if (auto *Cast = dyn_cast<CastInst>(SingleUser->getOperand(1)))
707         if (I->getOpcode() == unsigned(Cast->getOpcode()) &&
708             cast<CastInst>(I)->getSrcTy() == Cast->getSrcTy())
709           return 0;
710     }
711   }
712 
713   // TODO: Allow non-throughput costs that aren't binary.
714   auto AdjustCost = [&CostKind](InstructionCost Cost) -> InstructionCost {
715     if (CostKind != TTI::TCK_RecipThroughput)
716       return Cost == 0 ? 0 : 1;
717     return Cost;
718   };
719 
720   EVT SrcTy = TLI->getValueType(DL, Src);
721   EVT DstTy = TLI->getValueType(DL, Dst);
722 
723   if (!SrcTy.isSimple() || !DstTy.isSimple())
724     return AdjustCost(
725         BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I));
726 
727   static const TypeConversionCostTblEntry
728   ConversionTbl[] = {
729     { ISD::TRUNCATE, MVT::v4i16, MVT::v4i32,  1 },
730     { ISD::TRUNCATE, MVT::v4i32, MVT::v4i64,  0 },
731     { ISD::TRUNCATE, MVT::v8i8,  MVT::v8i32,  3 },
732     { ISD::TRUNCATE, MVT::v16i8, MVT::v16i32, 6 },
733 
734     // Truncations on nxvmiN
735     { ISD::TRUNCATE, MVT::nxv2i1, MVT::nxv2i16, 1 },
736     { ISD::TRUNCATE, MVT::nxv2i1, MVT::nxv2i32, 1 },
737     { ISD::TRUNCATE, MVT::nxv2i1, MVT::nxv2i64, 1 },
738     { ISD::TRUNCATE, MVT::nxv4i1, MVT::nxv4i16, 1 },
739     { ISD::TRUNCATE, MVT::nxv4i1, MVT::nxv4i32, 1 },
740     { ISD::TRUNCATE, MVT::nxv4i1, MVT::nxv4i64, 2 },
741     { ISD::TRUNCATE, MVT::nxv8i1, MVT::nxv8i16, 1 },
742     { ISD::TRUNCATE, MVT::nxv8i1, MVT::nxv8i32, 3 },
743     { ISD::TRUNCATE, MVT::nxv8i1, MVT::nxv8i64, 5 },
744     { ISD::TRUNCATE, MVT::nxv2i16, MVT::nxv2i32, 1 },
745     { ISD::TRUNCATE, MVT::nxv2i32, MVT::nxv2i64, 1 },
746     { ISD::TRUNCATE, MVT::nxv4i16, MVT::nxv4i32, 1 },
747     { ISD::TRUNCATE, MVT::nxv4i32, MVT::nxv4i64, 2 },
748     { ISD::TRUNCATE, MVT::nxv8i16, MVT::nxv8i32, 3 },
749     { ISD::TRUNCATE, MVT::nxv8i32, MVT::nxv8i64, 6 },
750 
751     // The number of shll instructions for the extension.
752     { ISD::SIGN_EXTEND, MVT::v4i64,  MVT::v4i16, 3 },
753     { ISD::ZERO_EXTEND, MVT::v4i64,  MVT::v4i16, 3 },
754     { ISD::SIGN_EXTEND, MVT::v4i64,  MVT::v4i32, 2 },
755     { ISD::ZERO_EXTEND, MVT::v4i64,  MVT::v4i32, 2 },
756     { ISD::SIGN_EXTEND, MVT::v8i32,  MVT::v8i8,  3 },
757     { ISD::ZERO_EXTEND, MVT::v8i32,  MVT::v8i8,  3 },
758     { ISD::SIGN_EXTEND, MVT::v8i32,  MVT::v8i16, 2 },
759     { ISD::ZERO_EXTEND, MVT::v8i32,  MVT::v8i16, 2 },
760     { ISD::SIGN_EXTEND, MVT::v8i64,  MVT::v8i8,  7 },
761     { ISD::ZERO_EXTEND, MVT::v8i64,  MVT::v8i8,  7 },
762     { ISD::SIGN_EXTEND, MVT::v8i64,  MVT::v8i16, 6 },
763     { ISD::ZERO_EXTEND, MVT::v8i64,  MVT::v8i16, 6 },
764     { ISD::SIGN_EXTEND, MVT::v16i16, MVT::v16i8, 2 },
765     { ISD::ZERO_EXTEND, MVT::v16i16, MVT::v16i8, 2 },
766     { ISD::SIGN_EXTEND, MVT::v16i32, MVT::v16i8, 6 },
767     { ISD::ZERO_EXTEND, MVT::v16i32, MVT::v16i8, 6 },
768 
769     // LowerVectorINT_TO_FP:
770     { ISD::SINT_TO_FP, MVT::v2f32, MVT::v2i32, 1 },
771     { ISD::SINT_TO_FP, MVT::v4f32, MVT::v4i32, 1 },
772     { ISD::SINT_TO_FP, MVT::v2f64, MVT::v2i64, 1 },
773     { ISD::UINT_TO_FP, MVT::v2f32, MVT::v2i32, 1 },
774     { ISD::UINT_TO_FP, MVT::v4f32, MVT::v4i32, 1 },
775     { ISD::UINT_TO_FP, MVT::v2f64, MVT::v2i64, 1 },
776 
777     // Complex: to v2f32
778     { ISD::SINT_TO_FP, MVT::v2f32, MVT::v2i8,  3 },
779     { ISD::SINT_TO_FP, MVT::v2f32, MVT::v2i16, 3 },
780     { ISD::SINT_TO_FP, MVT::v2f32, MVT::v2i64, 2 },
781     { ISD::UINT_TO_FP, MVT::v2f32, MVT::v2i8,  3 },
782     { ISD::UINT_TO_FP, MVT::v2f32, MVT::v2i16, 3 },
783     { ISD::UINT_TO_FP, MVT::v2f32, MVT::v2i64, 2 },
784 
785     // Complex: to v4f32
786     { ISD::SINT_TO_FP, MVT::v4f32, MVT::v4i8,  4 },
787     { ISD::SINT_TO_FP, MVT::v4f32, MVT::v4i16, 2 },
788     { ISD::UINT_TO_FP, MVT::v4f32, MVT::v4i8,  3 },
789     { ISD::UINT_TO_FP, MVT::v4f32, MVT::v4i16, 2 },
790 
791     // Complex: to v8f32
792     { ISD::SINT_TO_FP, MVT::v8f32, MVT::v8i8,  10 },
793     { ISD::SINT_TO_FP, MVT::v8f32, MVT::v8i16, 4 },
794     { ISD::UINT_TO_FP, MVT::v8f32, MVT::v8i8,  10 },
795     { ISD::UINT_TO_FP, MVT::v8f32, MVT::v8i16, 4 },
796 
797     // Complex: to v16f32
798     { ISD::SINT_TO_FP, MVT::v16f32, MVT::v16i8, 21 },
799     { ISD::UINT_TO_FP, MVT::v16f32, MVT::v16i8, 21 },
800 
801     // Complex: to v2f64
802     { ISD::SINT_TO_FP, MVT::v2f64, MVT::v2i8,  4 },
803     { ISD::SINT_TO_FP, MVT::v2f64, MVT::v2i16, 4 },
804     { ISD::SINT_TO_FP, MVT::v2f64, MVT::v2i32, 2 },
805     { ISD::UINT_TO_FP, MVT::v2f64, MVT::v2i8,  4 },
806     { ISD::UINT_TO_FP, MVT::v2f64, MVT::v2i16, 4 },
807     { ISD::UINT_TO_FP, MVT::v2f64, MVT::v2i32, 2 },
808 
809 
810     // LowerVectorFP_TO_INT
811     { ISD::FP_TO_SINT, MVT::v2i32, MVT::v2f32, 1 },
812     { ISD::FP_TO_SINT, MVT::v4i32, MVT::v4f32, 1 },
813     { ISD::FP_TO_SINT, MVT::v2i64, MVT::v2f64, 1 },
814     { ISD::FP_TO_UINT, MVT::v2i32, MVT::v2f32, 1 },
815     { ISD::FP_TO_UINT, MVT::v4i32, MVT::v4f32, 1 },
816     { ISD::FP_TO_UINT, MVT::v2i64, MVT::v2f64, 1 },
817 
818     // Complex, from v2f32: legal type is v2i32 (no cost) or v2i64 (1 ext).
819     { ISD::FP_TO_SINT, MVT::v2i64, MVT::v2f32, 2 },
820     { ISD::FP_TO_SINT, MVT::v2i16, MVT::v2f32, 1 },
821     { ISD::FP_TO_SINT, MVT::v2i8,  MVT::v2f32, 1 },
822     { ISD::FP_TO_UINT, MVT::v2i64, MVT::v2f32, 2 },
823     { ISD::FP_TO_UINT, MVT::v2i16, MVT::v2f32, 1 },
824     { ISD::FP_TO_UINT, MVT::v2i8,  MVT::v2f32, 1 },
825 
826     // Complex, from v4f32: legal type is v4i16, 1 narrowing => ~2
827     { ISD::FP_TO_SINT, MVT::v4i16, MVT::v4f32, 2 },
828     { ISD::FP_TO_SINT, MVT::v4i8,  MVT::v4f32, 2 },
829     { ISD::FP_TO_UINT, MVT::v4i16, MVT::v4f32, 2 },
830     { ISD::FP_TO_UINT, MVT::v4i8,  MVT::v4f32, 2 },
831 
832     // Complex, from nxv2f32.
833     { ISD::FP_TO_SINT, MVT::nxv2i64, MVT::nxv2f32, 1 },
834     { ISD::FP_TO_SINT, MVT::nxv2i32, MVT::nxv2f32, 1 },
835     { ISD::FP_TO_SINT, MVT::nxv2i16, MVT::nxv2f32, 1 },
836     { ISD::FP_TO_SINT, MVT::nxv2i8,  MVT::nxv2f32, 1 },
837     { ISD::FP_TO_UINT, MVT::nxv2i64, MVT::nxv2f32, 1 },
838     { ISD::FP_TO_UINT, MVT::nxv2i32, MVT::nxv2f32, 1 },
839     { ISD::FP_TO_UINT, MVT::nxv2i16, MVT::nxv2f32, 1 },
840     { ISD::FP_TO_UINT, MVT::nxv2i8,  MVT::nxv2f32, 1 },
841 
842     // Complex, from v2f64: legal type is v2i32, 1 narrowing => ~2.
843     { ISD::FP_TO_SINT, MVT::v2i32, MVT::v2f64, 2 },
844     { ISD::FP_TO_SINT, MVT::v2i16, MVT::v2f64, 2 },
845     { ISD::FP_TO_SINT, MVT::v2i8,  MVT::v2f64, 2 },
846     { ISD::FP_TO_UINT, MVT::v2i32, MVT::v2f64, 2 },
847     { ISD::FP_TO_UINT, MVT::v2i16, MVT::v2f64, 2 },
848     { ISD::FP_TO_UINT, MVT::v2i8,  MVT::v2f64, 2 },
849 
850     // Complex, from nxv2f64.
851     { ISD::FP_TO_SINT, MVT::nxv2i64, MVT::nxv2f64, 1 },
852     { ISD::FP_TO_SINT, MVT::nxv2i32, MVT::nxv2f64, 1 },
853     { ISD::FP_TO_SINT, MVT::nxv2i16, MVT::nxv2f64, 1 },
854     { ISD::FP_TO_SINT, MVT::nxv2i8,  MVT::nxv2f64, 1 },
855     { ISD::FP_TO_UINT, MVT::nxv2i64, MVT::nxv2f64, 1 },
856     { ISD::FP_TO_UINT, MVT::nxv2i32, MVT::nxv2f64, 1 },
857     { ISD::FP_TO_UINT, MVT::nxv2i16, MVT::nxv2f64, 1 },
858     { ISD::FP_TO_UINT, MVT::nxv2i8,  MVT::nxv2f64, 1 },
859 
860     // Complex, from nxv4f32.
861     { ISD::FP_TO_SINT, MVT::nxv4i64, MVT::nxv4f32, 4 },
862     { ISD::FP_TO_SINT, MVT::nxv4i32, MVT::nxv4f32, 1 },
863     { ISD::FP_TO_SINT, MVT::nxv4i16, MVT::nxv4f32, 1 },
864     { ISD::FP_TO_SINT, MVT::nxv4i8,  MVT::nxv4f32, 1 },
865     { ISD::FP_TO_UINT, MVT::nxv4i64, MVT::nxv4f32, 4 },
866     { ISD::FP_TO_UINT, MVT::nxv4i32, MVT::nxv4f32, 1 },
867     { ISD::FP_TO_UINT, MVT::nxv4i16, MVT::nxv4f32, 1 },
868     { ISD::FP_TO_UINT, MVT::nxv4i8,  MVT::nxv4f32, 1 },
869 
870     // Complex, from nxv8f64. Illegal -> illegal conversions not required.
871     { ISD::FP_TO_SINT, MVT::nxv8i16, MVT::nxv8f64, 7 },
872     { ISD::FP_TO_SINT, MVT::nxv8i8,  MVT::nxv8f64, 7 },
873     { ISD::FP_TO_UINT, MVT::nxv8i16, MVT::nxv8f64, 7 },
874     { ISD::FP_TO_UINT, MVT::nxv8i8,  MVT::nxv8f64, 7 },
875 
876     // Complex, from nxv4f64. Illegal -> illegal conversions not required.
877     { ISD::FP_TO_SINT, MVT::nxv4i32, MVT::nxv4f64, 3 },
878     { ISD::FP_TO_SINT, MVT::nxv4i16, MVT::nxv4f64, 3 },
879     { ISD::FP_TO_SINT, MVT::nxv4i8,  MVT::nxv4f64, 3 },
880     { ISD::FP_TO_UINT, MVT::nxv4i32, MVT::nxv4f64, 3 },
881     { ISD::FP_TO_UINT, MVT::nxv4i16, MVT::nxv4f64, 3 },
882     { ISD::FP_TO_UINT, MVT::nxv4i8,  MVT::nxv4f64, 3 },
883 
884     // Complex, from nxv8f32. Illegal -> illegal conversions not required.
885     { ISD::FP_TO_SINT, MVT::nxv8i16, MVT::nxv8f32, 3 },
886     { ISD::FP_TO_SINT, MVT::nxv8i8,  MVT::nxv8f32, 3 },
887     { ISD::FP_TO_UINT, MVT::nxv8i16, MVT::nxv8f32, 3 },
888     { ISD::FP_TO_UINT, MVT::nxv8i8,  MVT::nxv8f32, 3 },
889 
890     // Complex, from nxv8f16.
891     { ISD::FP_TO_SINT, MVT::nxv8i64, MVT::nxv8f16, 10 },
892     { ISD::FP_TO_SINT, MVT::nxv8i32, MVT::nxv8f16, 4 },
893     { ISD::FP_TO_SINT, MVT::nxv8i16, MVT::nxv8f16, 1 },
894     { ISD::FP_TO_SINT, MVT::nxv8i8,  MVT::nxv8f16, 1 },
895     { ISD::FP_TO_UINT, MVT::nxv8i64, MVT::nxv8f16, 10 },
896     { ISD::FP_TO_UINT, MVT::nxv8i32, MVT::nxv8f16, 4 },
897     { ISD::FP_TO_UINT, MVT::nxv8i16, MVT::nxv8f16, 1 },
898     { ISD::FP_TO_UINT, MVT::nxv8i8,  MVT::nxv8f16, 1 },
899 
900     // Complex, from nxv4f16.
901     { ISD::FP_TO_SINT, MVT::nxv4i64, MVT::nxv4f16, 4 },
902     { ISD::FP_TO_SINT, MVT::nxv4i32, MVT::nxv4f16, 1 },
903     { ISD::FP_TO_SINT, MVT::nxv4i16, MVT::nxv4f16, 1 },
904     { ISD::FP_TO_SINT, MVT::nxv4i8,  MVT::nxv4f16, 1 },
905     { ISD::FP_TO_UINT, MVT::nxv4i64, MVT::nxv4f16, 4 },
906     { ISD::FP_TO_UINT, MVT::nxv4i32, MVT::nxv4f16, 1 },
907     { ISD::FP_TO_UINT, MVT::nxv4i16, MVT::nxv4f16, 1 },
908     { ISD::FP_TO_UINT, MVT::nxv4i8,  MVT::nxv4f16, 1 },
909 
910     // Complex, from nxv2f16.
911     { ISD::FP_TO_SINT, MVT::nxv2i64, MVT::nxv2f16, 1 },
912     { ISD::FP_TO_SINT, MVT::nxv2i32, MVT::nxv2f16, 1 },
913     { ISD::FP_TO_SINT, MVT::nxv2i16, MVT::nxv2f16, 1 },
914     { ISD::FP_TO_SINT, MVT::nxv2i8,  MVT::nxv2f16, 1 },
915     { ISD::FP_TO_UINT, MVT::nxv2i64, MVT::nxv2f16, 1 },
916     { ISD::FP_TO_UINT, MVT::nxv2i32, MVT::nxv2f16, 1 },
917     { ISD::FP_TO_UINT, MVT::nxv2i16, MVT::nxv2f16, 1 },
918     { ISD::FP_TO_UINT, MVT::nxv2i8,  MVT::nxv2f16, 1 },
919 
920     // Truncate from nxvmf32 to nxvmf16.
921     { ISD::FP_ROUND, MVT::nxv2f16, MVT::nxv2f32, 1 },
922     { ISD::FP_ROUND, MVT::nxv4f16, MVT::nxv4f32, 1 },
923     { ISD::FP_ROUND, MVT::nxv8f16, MVT::nxv8f32, 3 },
924 
925     // Truncate from nxvmf64 to nxvmf16.
926     { ISD::FP_ROUND, MVT::nxv2f16, MVT::nxv2f64, 1 },
927     { ISD::FP_ROUND, MVT::nxv4f16, MVT::nxv4f64, 3 },
928     { ISD::FP_ROUND, MVT::nxv8f16, MVT::nxv8f64, 7 },
929 
930     // Truncate from nxvmf64 to nxvmf32.
931     { ISD::FP_ROUND, MVT::nxv2f32, MVT::nxv2f64, 1 },
932     { ISD::FP_ROUND, MVT::nxv4f32, MVT::nxv4f64, 3 },
933     { ISD::FP_ROUND, MVT::nxv8f32, MVT::nxv8f64, 6 },
934 
935     // Extend from nxvmf16 to nxvmf32.
936     { ISD::FP_EXTEND, MVT::nxv2f32, MVT::nxv2f16, 1},
937     { ISD::FP_EXTEND, MVT::nxv4f32, MVT::nxv4f16, 1},
938     { ISD::FP_EXTEND, MVT::nxv8f32, MVT::nxv8f16, 2},
939 
940     // Extend from nxvmf16 to nxvmf64.
941     { ISD::FP_EXTEND, MVT::nxv2f64, MVT::nxv2f16, 1},
942     { ISD::FP_EXTEND, MVT::nxv4f64, MVT::nxv4f16, 2},
943     { ISD::FP_EXTEND, MVT::nxv8f64, MVT::nxv8f16, 4},
944 
945     // Extend from nxvmf32 to nxvmf64.
946     { ISD::FP_EXTEND, MVT::nxv2f64, MVT::nxv2f32, 1},
947     { ISD::FP_EXTEND, MVT::nxv4f64, MVT::nxv4f32, 2},
948     { ISD::FP_EXTEND, MVT::nxv8f64, MVT::nxv8f32, 6},
949 
950   };
951 
952   if (const auto *Entry = ConvertCostTableLookup(ConversionTbl, ISD,
953                                                  DstTy.getSimpleVT(),
954                                                  SrcTy.getSimpleVT()))
955     return AdjustCost(Entry->Cost);
956 
957   return AdjustCost(
958       BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I));
959 }
960 
961 InstructionCost AArch64TTIImpl::getExtractWithExtendCost(unsigned Opcode,
962                                                          Type *Dst,
963                                                          VectorType *VecTy,
964                                                          unsigned Index) {
965 
966   // Make sure we were given a valid extend opcode.
967   assert((Opcode == Instruction::SExt || Opcode == Instruction::ZExt) &&
968          "Invalid opcode");
969 
970   // We are extending an element we extract from a vector, so the source type
971   // of the extend is the element type of the vector.
972   auto *Src = VecTy->getElementType();
973 
974   // Sign- and zero-extends are for integer types only.
975   assert(isa<IntegerType>(Dst) && isa<IntegerType>(Src) && "Invalid type");
976 
977   // Get the cost for the extract. We compute the cost (if any) for the extend
978   // below.
979   InstructionCost Cost =
980       getVectorInstrCost(Instruction::ExtractElement, VecTy, Index);
981 
982   // Legalize the types.
983   auto VecLT = TLI->getTypeLegalizationCost(DL, VecTy);
984   auto DstVT = TLI->getValueType(DL, Dst);
985   auto SrcVT = TLI->getValueType(DL, Src);
986   TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
987 
988   // If the resulting type is still a vector and the destination type is legal,
989   // we may get the extension for free. If not, get the default cost for the
990   // extend.
991   if (!VecLT.second.isVector() || !TLI->isTypeLegal(DstVT))
992     return Cost + getCastInstrCost(Opcode, Dst, Src, TTI::CastContextHint::None,
993                                    CostKind);
994 
995   // The destination type should be larger than the element type. If not, get
996   // the default cost for the extend.
997   if (DstVT.getFixedSizeInBits() < SrcVT.getFixedSizeInBits())
998     return Cost + getCastInstrCost(Opcode, Dst, Src, TTI::CastContextHint::None,
999                                    CostKind);
1000 
1001   switch (Opcode) {
1002   default:
1003     llvm_unreachable("Opcode should be either SExt or ZExt");
1004 
1005   // For sign-extends, we only need a smov, which performs the extension
1006   // automatically.
1007   case Instruction::SExt:
1008     return Cost;
1009 
1010   // For zero-extends, the extend is performed automatically by a umov unless
1011   // the destination type is i64 and the element type is i8 or i16.
1012   case Instruction::ZExt:
1013     if (DstVT.getSizeInBits() != 64u || SrcVT.getSizeInBits() == 32u)
1014       return Cost;
1015   }
1016 
1017   // If we are unable to perform the extend for free, get the default cost.
1018   return Cost + getCastInstrCost(Opcode, Dst, Src, TTI::CastContextHint::None,
1019                                  CostKind);
1020 }
1021 
1022 InstructionCost AArch64TTIImpl::getCFInstrCost(unsigned Opcode,
1023                                                TTI::TargetCostKind CostKind,
1024                                                const Instruction *I) {
1025   if (CostKind != TTI::TCK_RecipThroughput)
1026     return Opcode == Instruction::PHI ? 0 : 1;
1027   assert(CostKind == TTI::TCK_RecipThroughput && "unexpected CostKind");
1028   // Branches are assumed to be predicted.
1029   return 0;
1030 }
1031 
1032 InstructionCost AArch64TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val,
1033                                                    unsigned Index) {
1034   assert(Val->isVectorTy() && "This must be a vector type");
1035 
1036   if (Index != -1U) {
1037     // Legalize the type.
1038     std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, Val);
1039 
1040     // This type is legalized to a scalar type.
1041     if (!LT.second.isVector())
1042       return 0;
1043 
1044     // The type may be split. Normalize the index to the new type.
1045     unsigned Width = LT.second.getVectorNumElements();
1046     Index = Index % Width;
1047 
1048     // The element at index zero is already inside the vector.
1049     if (Index == 0)
1050       return 0;
1051   }
1052 
1053   // All other insert/extracts cost this much.
1054   return ST->getVectorInsertExtractBaseCost();
1055 }
1056 
1057 InstructionCost AArch64TTIImpl::getArithmeticInstrCost(
1058     unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
1059     TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
1060     TTI::OperandValueProperties Opd1PropInfo,
1061     TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
1062     const Instruction *CxtI) {
1063   // TODO: Handle more cost kinds.
1064   if (CostKind != TTI::TCK_RecipThroughput)
1065     return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
1066                                          Opd2Info, Opd1PropInfo,
1067                                          Opd2PropInfo, Args, CxtI);
1068 
1069   // Legalize the type.
1070   std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
1071 
1072   // If the instruction is a widening instruction (e.g., uaddl, saddw, etc.),
1073   // add in the widening overhead specified by the sub-target. Since the
1074   // extends feeding widening instructions are performed automatically, they
1075   // aren't present in the generated code and have a zero cost. By adding a
1076   // widening overhead here, we attach the total cost of the combined operation
1077   // to the widening instruction.
1078   InstructionCost Cost = 0;
1079   if (isWideningInstruction(Ty, Opcode, Args))
1080     Cost += ST->getWideningBaseCost();
1081 
1082   int ISD = TLI->InstructionOpcodeToISD(Opcode);
1083 
1084   switch (ISD) {
1085   default:
1086     return Cost + BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
1087                                                 Opd2Info,
1088                                                 Opd1PropInfo, Opd2PropInfo);
1089   case ISD::SDIV:
1090     if (Opd2Info == TargetTransformInfo::OK_UniformConstantValue &&
1091         Opd2PropInfo == TargetTransformInfo::OP_PowerOf2) {
1092       // On AArch64, scalar signed division by constants power-of-two are
1093       // normally expanded to the sequence ADD + CMP + SELECT + SRA.
1094       // The OperandValue properties many not be same as that of previous
1095       // operation; conservatively assume OP_None.
1096       Cost += getArithmeticInstrCost(Instruction::Add, Ty, CostKind,
1097                                      Opd1Info, Opd2Info,
1098                                      TargetTransformInfo::OP_None,
1099                                      TargetTransformInfo::OP_None);
1100       Cost += getArithmeticInstrCost(Instruction::Sub, Ty, CostKind,
1101                                      Opd1Info, Opd2Info,
1102                                      TargetTransformInfo::OP_None,
1103                                      TargetTransformInfo::OP_None);
1104       Cost += getArithmeticInstrCost(Instruction::Select, Ty, CostKind,
1105                                      Opd1Info, Opd2Info,
1106                                      TargetTransformInfo::OP_None,
1107                                      TargetTransformInfo::OP_None);
1108       Cost += getArithmeticInstrCost(Instruction::AShr, Ty, CostKind,
1109                                      Opd1Info, Opd2Info,
1110                                      TargetTransformInfo::OP_None,
1111                                      TargetTransformInfo::OP_None);
1112       return Cost;
1113     }
1114     LLVM_FALLTHROUGH;
1115   case ISD::UDIV:
1116     if (Opd2Info == TargetTransformInfo::OK_UniformConstantValue) {
1117       auto VT = TLI->getValueType(DL, Ty);
1118       if (TLI->isOperationLegalOrCustom(ISD::MULHU, VT)) {
1119         // Vector signed division by constant are expanded to the
1120         // sequence MULHS + ADD/SUB + SRA + SRL + ADD, and unsigned division
1121         // to MULHS + SUB + SRL + ADD + SRL.
1122         InstructionCost MulCost = getArithmeticInstrCost(
1123             Instruction::Mul, Ty, CostKind, Opd1Info, Opd2Info,
1124             TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
1125         InstructionCost AddCost = getArithmeticInstrCost(
1126             Instruction::Add, Ty, CostKind, Opd1Info, Opd2Info,
1127             TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
1128         InstructionCost ShrCost = getArithmeticInstrCost(
1129             Instruction::AShr, Ty, CostKind, Opd1Info, Opd2Info,
1130             TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
1131         return MulCost * 2 + AddCost * 2 + ShrCost * 2 + 1;
1132       }
1133     }
1134 
1135     Cost += BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
1136                                           Opd2Info,
1137                                           Opd1PropInfo, Opd2PropInfo);
1138     if (Ty->isVectorTy()) {
1139       // On AArch64, vector divisions are not supported natively and are
1140       // expanded into scalar divisions of each pair of elements.
1141       Cost += getArithmeticInstrCost(Instruction::ExtractElement, Ty, CostKind,
1142                                      Opd1Info, Opd2Info, Opd1PropInfo,
1143                                      Opd2PropInfo);
1144       Cost += getArithmeticInstrCost(Instruction::InsertElement, Ty, CostKind,
1145                                      Opd1Info, Opd2Info, Opd1PropInfo,
1146                                      Opd2PropInfo);
1147       // TODO: if one of the arguments is scalar, then it's not necessary to
1148       // double the cost of handling the vector elements.
1149       Cost += Cost;
1150     }
1151     return Cost;
1152 
1153   case ISD::MUL:
1154     if (LT.second != MVT::v2i64)
1155       return (Cost + 1) * LT.first;
1156     // Since we do not have a MUL.2d instruction, a mul <2 x i64> is expensive
1157     // as elements are extracted from the vectors and the muls scalarized.
1158     // As getScalarizationOverhead is a bit too pessimistic, we estimate the
1159     // cost for a i64 vector directly here, which is:
1160     // - four i64 extracts,
1161     // - two i64 inserts, and
1162     // - two muls.
1163     // So, for a v2i64 with LT.First = 1 the cost is 8, and for a v4i64 with
1164     // LT.first = 2 the cost is 16.
1165     return LT.first * 8;
1166   case ISD::ADD:
1167   case ISD::XOR:
1168   case ISD::OR:
1169   case ISD::AND:
1170     // These nodes are marked as 'custom' for combining purposes only.
1171     // We know that they are legal. See LowerAdd in ISelLowering.
1172     return (Cost + 1) * LT.first;
1173 
1174   case ISD::FADD:
1175     // These nodes are marked as 'custom' just to lower them to SVE.
1176     // We know said lowering will incur no additional cost.
1177     if (isa<FixedVectorType>(Ty) && !Ty->getScalarType()->isFP128Ty())
1178       return (Cost + 2) * LT.first;
1179 
1180     return Cost + BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
1181                                                 Opd2Info,
1182                                                 Opd1PropInfo, Opd2PropInfo);
1183   }
1184 }
1185 
1186 InstructionCost AArch64TTIImpl::getAddressComputationCost(Type *Ty,
1187                                                           ScalarEvolution *SE,
1188                                                           const SCEV *Ptr) {
1189   // Address computations in vectorized code with non-consecutive addresses will
1190   // likely result in more instructions compared to scalar code where the
1191   // computation can more often be merged into the index mode. The resulting
1192   // extra micro-ops can significantly decrease throughput.
1193   unsigned NumVectorInstToHideOverhead = 10;
1194   int MaxMergeDistance = 64;
1195 
1196   if (Ty->isVectorTy() && SE &&
1197       !BaseT::isConstantStridedAccessLessThan(SE, Ptr, MaxMergeDistance + 1))
1198     return NumVectorInstToHideOverhead;
1199 
1200   // In many cases the address computation is not merged into the instruction
1201   // addressing mode.
1202   return 1;
1203 }
1204 
1205 InstructionCost AArch64TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
1206                                                    Type *CondTy,
1207                                                    CmpInst::Predicate VecPred,
1208                                                    TTI::TargetCostKind CostKind,
1209                                                    const Instruction *I) {
1210   // TODO: Handle other cost kinds.
1211   if (CostKind != TTI::TCK_RecipThroughput)
1212     return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind,
1213                                      I);
1214 
1215   int ISD = TLI->InstructionOpcodeToISD(Opcode);
1216   // We don't lower some vector selects well that are wider than the register
1217   // width.
1218   if (isa<FixedVectorType>(ValTy) && ISD == ISD::SELECT) {
1219     // We would need this many instructions to hide the scalarization happening.
1220     const int AmortizationCost = 20;
1221 
1222     // If VecPred is not set, check if we can get a predicate from the context
1223     // instruction, if its type matches the requested ValTy.
1224     if (VecPred == CmpInst::BAD_ICMP_PREDICATE && I && I->getType() == ValTy) {
1225       CmpInst::Predicate CurrentPred;
1226       if (match(I, m_Select(m_Cmp(CurrentPred, m_Value(), m_Value()), m_Value(),
1227                             m_Value())))
1228         VecPred = CurrentPred;
1229     }
1230     // Check if we have a compare/select chain that can be lowered using CMxx &
1231     // BFI pair.
1232     if (CmpInst::isIntPredicate(VecPred)) {
1233       static const auto ValidMinMaxTys = {MVT::v8i8,  MVT::v16i8, MVT::v4i16,
1234                                           MVT::v8i16, MVT::v2i32, MVT::v4i32,
1235                                           MVT::v2i64};
1236       auto LT = TLI->getTypeLegalizationCost(DL, ValTy);
1237       if (any_of(ValidMinMaxTys, [&LT](MVT M) { return M == LT.second; }))
1238         return LT.first;
1239     }
1240 
1241     static const TypeConversionCostTblEntry
1242     VectorSelectTbl[] = {
1243       { ISD::SELECT, MVT::v16i1, MVT::v16i16, 16 },
1244       { ISD::SELECT, MVT::v8i1, MVT::v8i32, 8 },
1245       { ISD::SELECT, MVT::v16i1, MVT::v16i32, 16 },
1246       { ISD::SELECT, MVT::v4i1, MVT::v4i64, 4 * AmortizationCost },
1247       { ISD::SELECT, MVT::v8i1, MVT::v8i64, 8 * AmortizationCost },
1248       { ISD::SELECT, MVT::v16i1, MVT::v16i64, 16 * AmortizationCost }
1249     };
1250 
1251     EVT SelCondTy = TLI->getValueType(DL, CondTy);
1252     EVT SelValTy = TLI->getValueType(DL, ValTy);
1253     if (SelCondTy.isSimple() && SelValTy.isSimple()) {
1254       if (const auto *Entry = ConvertCostTableLookup(VectorSelectTbl, ISD,
1255                                                      SelCondTy.getSimpleVT(),
1256                                                      SelValTy.getSimpleVT()))
1257         return Entry->Cost;
1258     }
1259   }
1260   // The base case handles scalable vectors fine for now, since it treats the
1261   // cost as 1 * legalization cost.
1262   return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, I);
1263 }
1264 
1265 AArch64TTIImpl::TTI::MemCmpExpansionOptions
1266 AArch64TTIImpl::enableMemCmpExpansion(bool OptSize, bool IsZeroCmp) const {
1267   TTI::MemCmpExpansionOptions Options;
1268   if (ST->requiresStrictAlign()) {
1269     // TODO: Add cost modeling for strict align. Misaligned loads expand to
1270     // a bunch of instructions when strict align is enabled.
1271     return Options;
1272   }
1273   Options.AllowOverlappingLoads = true;
1274   Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize);
1275   Options.NumLoadsPerBlock = Options.MaxNumLoads;
1276   // TODO: Though vector loads usually perform well on AArch64, in some targets
1277   // they may wake up the FP unit, which raises the power consumption.  Perhaps
1278   // they could be used with no holds barred (-O3).
1279   Options.LoadSizes = {8, 4, 2, 1};
1280   return Options;
1281 }
1282 
1283 InstructionCost
1284 AArch64TTIImpl::getMaskedMemoryOpCost(unsigned Opcode, Type *Src,
1285                                       Align Alignment, unsigned AddressSpace,
1286                                       TTI::TargetCostKind CostKind) {
1287   if (!isa<ScalableVectorType>(Src))
1288     return BaseT::getMaskedMemoryOpCost(Opcode, Src, Alignment, AddressSpace,
1289                                         CostKind);
1290   auto LT = TLI->getTypeLegalizationCost(DL, Src);
1291   if (!LT.first.isValid())
1292     return InstructionCost::getInvalid();
1293   return LT.first * 2;
1294 }
1295 
1296 InstructionCost AArch64TTIImpl::getGatherScatterOpCost(
1297     unsigned Opcode, Type *DataTy, const Value *Ptr, bool VariableMask,
1298     Align Alignment, TTI::TargetCostKind CostKind, const Instruction *I) {
1299 
1300   if (!isa<ScalableVectorType>(DataTy))
1301     return BaseT::getGatherScatterOpCost(Opcode, DataTy, Ptr, VariableMask,
1302                                          Alignment, CostKind, I);
1303   auto *VT = cast<VectorType>(DataTy);
1304   auto LT = TLI->getTypeLegalizationCost(DL, DataTy);
1305   if (!LT.first.isValid())
1306     return InstructionCost::getInvalid();
1307 
1308   ElementCount LegalVF = LT.second.getVectorElementCount();
1309   Optional<unsigned> MaxNumVScale = getMaxVScale();
1310   assert(MaxNumVScale && "Expected valid max vscale value");
1311 
1312   InstructionCost MemOpCost =
1313       getMemoryOpCost(Opcode, VT->getElementType(), Alignment, 0, CostKind, I);
1314   unsigned MaxNumElementsPerGather =
1315       MaxNumVScale.getValue() * LegalVF.getKnownMinValue();
1316   return LT.first * MaxNumElementsPerGather * MemOpCost;
1317 }
1318 
1319 bool AArch64TTIImpl::useNeonVector(const Type *Ty) const {
1320   return isa<FixedVectorType>(Ty) && !ST->useSVEForFixedLengthVectors();
1321 }
1322 
1323 InstructionCost AArch64TTIImpl::getMemoryOpCost(unsigned Opcode, Type *Ty,
1324                                                 MaybeAlign Alignment,
1325                                                 unsigned AddressSpace,
1326                                                 TTI::TargetCostKind CostKind,
1327                                                 const Instruction *I) {
1328   // Type legalization can't handle structs
1329   if (TLI->getValueType(DL, Ty,  true) == MVT::Other)
1330     return BaseT::getMemoryOpCost(Opcode, Ty, Alignment, AddressSpace,
1331                                   CostKind);
1332 
1333   auto LT = TLI->getTypeLegalizationCost(DL, Ty);
1334   if (!LT.first.isValid())
1335     return InstructionCost::getInvalid();
1336 
1337   // TODO: consider latency as well for TCK_SizeAndLatency.
1338   if (CostKind == TTI::TCK_CodeSize || CostKind == TTI::TCK_SizeAndLatency)
1339     return LT.first;
1340 
1341   if (CostKind != TTI::TCK_RecipThroughput)
1342     return 1;
1343 
1344   if (ST->isMisaligned128StoreSlow() && Opcode == Instruction::Store &&
1345       LT.second.is128BitVector() && (!Alignment || *Alignment < Align(16))) {
1346     // Unaligned stores are extremely inefficient. We don't split all
1347     // unaligned 128-bit stores because the negative impact that has shown in
1348     // practice on inlined block copy code.
1349     // We make such stores expensive so that we will only vectorize if there
1350     // are 6 other instructions getting vectorized.
1351     const int AmortizationCost = 6;
1352 
1353     return LT.first * 2 * AmortizationCost;
1354   }
1355 
1356   if (useNeonVector(Ty) &&
1357       cast<VectorType>(Ty)->getElementType()->isIntegerTy(8)) {
1358     unsigned ProfitableNumElements;
1359     if (Opcode == Instruction::Store)
1360       // We use a custom trunc store lowering so v.4b should be profitable.
1361       ProfitableNumElements = 4;
1362     else
1363       // We scalarize the loads because there is not v.4b register and we
1364       // have to promote the elements to v.2.
1365       ProfitableNumElements = 8;
1366 
1367     if (cast<FixedVectorType>(Ty)->getNumElements() < ProfitableNumElements) {
1368       unsigned NumVecElts = cast<FixedVectorType>(Ty)->getNumElements();
1369       unsigned NumVectorizableInstsToAmortize = NumVecElts * 2;
1370       // We generate 2 instructions per vector element.
1371       return NumVectorizableInstsToAmortize * NumVecElts * 2;
1372     }
1373   }
1374 
1375   return LT.first;
1376 }
1377 
1378 InstructionCost AArch64TTIImpl::getInterleavedMemoryOpCost(
1379     unsigned Opcode, Type *VecTy, unsigned Factor, ArrayRef<unsigned> Indices,
1380     Align Alignment, unsigned AddressSpace, TTI::TargetCostKind CostKind,
1381     bool UseMaskForCond, bool UseMaskForGaps) {
1382   assert(Factor >= 2 && "Invalid interleave factor");
1383   auto *VecVTy = cast<FixedVectorType>(VecTy);
1384 
1385   if (!UseMaskForCond && !UseMaskForGaps &&
1386       Factor <= TLI->getMaxSupportedInterleaveFactor()) {
1387     unsigned NumElts = VecVTy->getNumElements();
1388     auto *SubVecTy =
1389         FixedVectorType::get(VecTy->getScalarType(), NumElts / Factor);
1390 
1391     // ldN/stN only support legal vector types of size 64 or 128 in bits.
1392     // Accesses having vector types that are a multiple of 128 bits can be
1393     // matched to more than one ldN/stN instruction.
1394     if (NumElts % Factor == 0 &&
1395         TLI->isLegalInterleavedAccessType(SubVecTy, DL))
1396       return Factor * TLI->getNumInterleavedAccesses(SubVecTy, DL);
1397   }
1398 
1399   return BaseT::getInterleavedMemoryOpCost(Opcode, VecTy, Factor, Indices,
1400                                            Alignment, AddressSpace, CostKind,
1401                                            UseMaskForCond, UseMaskForGaps);
1402 }
1403 
1404 InstructionCost
1405 AArch64TTIImpl::getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys) {
1406   InstructionCost Cost = 0;
1407   TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
1408   for (auto *I : Tys) {
1409     if (!I->isVectorTy())
1410       continue;
1411     if (I->getScalarSizeInBits() * cast<FixedVectorType>(I)->getNumElements() ==
1412         128)
1413       Cost += getMemoryOpCost(Instruction::Store, I, Align(128), 0, CostKind) +
1414               getMemoryOpCost(Instruction::Load, I, Align(128), 0, CostKind);
1415   }
1416   return Cost;
1417 }
1418 
1419 unsigned AArch64TTIImpl::getMaxInterleaveFactor(unsigned VF) {
1420   return ST->getMaxInterleaveFactor();
1421 }
1422 
1423 // For Falkor, we want to avoid having too many strided loads in a loop since
1424 // that can exhaust the HW prefetcher resources.  We adjust the unroller
1425 // MaxCount preference below to attempt to ensure unrolling doesn't create too
1426 // many strided loads.
1427 static void
1428 getFalkorUnrollingPreferences(Loop *L, ScalarEvolution &SE,
1429                               TargetTransformInfo::UnrollingPreferences &UP) {
1430   enum { MaxStridedLoads = 7 };
1431   auto countStridedLoads = [](Loop *L, ScalarEvolution &SE) {
1432     int StridedLoads = 0;
1433     // FIXME? We could make this more precise by looking at the CFG and
1434     // e.g. not counting loads in each side of an if-then-else diamond.
1435     for (const auto BB : L->blocks()) {
1436       for (auto &I : *BB) {
1437         LoadInst *LMemI = dyn_cast<LoadInst>(&I);
1438         if (!LMemI)
1439           continue;
1440 
1441         Value *PtrValue = LMemI->getPointerOperand();
1442         if (L->isLoopInvariant(PtrValue))
1443           continue;
1444 
1445         const SCEV *LSCEV = SE.getSCEV(PtrValue);
1446         const SCEVAddRecExpr *LSCEVAddRec = dyn_cast<SCEVAddRecExpr>(LSCEV);
1447         if (!LSCEVAddRec || !LSCEVAddRec->isAffine())
1448           continue;
1449 
1450         // FIXME? We could take pairing of unrolled load copies into account
1451         // by looking at the AddRec, but we would probably have to limit this
1452         // to loops with no stores or other memory optimization barriers.
1453         ++StridedLoads;
1454         // We've seen enough strided loads that seeing more won't make a
1455         // difference.
1456         if (StridedLoads > MaxStridedLoads / 2)
1457           return StridedLoads;
1458       }
1459     }
1460     return StridedLoads;
1461   };
1462 
1463   int StridedLoads = countStridedLoads(L, SE);
1464   LLVM_DEBUG(dbgs() << "falkor-hwpf: detected " << StridedLoads
1465                     << " strided loads\n");
1466   // Pick the largest power of 2 unroll count that won't result in too many
1467   // strided loads.
1468   if (StridedLoads) {
1469     UP.MaxCount = 1 << Log2_32(MaxStridedLoads / StridedLoads);
1470     LLVM_DEBUG(dbgs() << "falkor-hwpf: setting unroll MaxCount to "
1471                       << UP.MaxCount << '\n');
1472   }
1473 }
1474 
1475 void AArch64TTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
1476                                              TTI::UnrollingPreferences &UP) {
1477   // Enable partial unrolling and runtime unrolling.
1478   BaseT::getUnrollingPreferences(L, SE, UP);
1479 
1480   // For inner loop, it is more likely to be a hot one, and the runtime check
1481   // can be promoted out from LICM pass, so the overhead is less, let's try
1482   // a larger threshold to unroll more loops.
1483   if (L->getLoopDepth() > 1)
1484     UP.PartialThreshold *= 2;
1485 
1486   // Disable partial & runtime unrolling on -Os.
1487   UP.PartialOptSizeThreshold = 0;
1488 
1489   if (ST->getProcFamily() == AArch64Subtarget::Falkor &&
1490       EnableFalkorHWPFUnrollFix)
1491     getFalkorUnrollingPreferences(L, SE, UP);
1492 
1493   // Scan the loop: don't unroll loops with calls as this could prevent
1494   // inlining. Don't unroll vector loops either, as they don't benefit much from
1495   // unrolling.
1496   for (auto *BB : L->getBlocks()) {
1497     for (auto &I : *BB) {
1498       // Don't unroll vectorised loop.
1499       if (I.getType()->isVectorTy())
1500         return;
1501 
1502       if (isa<CallInst>(I) || isa<InvokeInst>(I)) {
1503         if (const Function *F = cast<CallBase>(I).getCalledFunction()) {
1504           if (!isLoweredToCall(F))
1505             continue;
1506         }
1507         return;
1508       }
1509     }
1510   }
1511 
1512   // Enable runtime unrolling for in-order models
1513   // If mcpu is omitted, getProcFamily() returns AArch64Subtarget::Others, so by
1514   // checking for that case, we can ensure that the default behaviour is
1515   // unchanged
1516   if (ST->getProcFamily() != AArch64Subtarget::Others &&
1517       !ST->getSchedModel().isOutOfOrder()) {
1518     UP.Runtime = true;
1519     UP.Partial = true;
1520     UP.UpperBound = true;
1521     UP.UnrollRemainder = true;
1522     UP.DefaultUnrollRuntimeCount = 4;
1523 
1524     UP.UnrollAndJam = true;
1525     UP.UnrollAndJamInnerLoopThreshold = 60;
1526   }
1527 }
1528 
1529 void AArch64TTIImpl::getPeelingPreferences(Loop *L, ScalarEvolution &SE,
1530                                            TTI::PeelingPreferences &PP) {
1531   BaseT::getPeelingPreferences(L, SE, PP);
1532 }
1533 
1534 Value *AArch64TTIImpl::getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
1535                                                          Type *ExpectedType) {
1536   switch (Inst->getIntrinsicID()) {
1537   default:
1538     return nullptr;
1539   case Intrinsic::aarch64_neon_st2:
1540   case Intrinsic::aarch64_neon_st3:
1541   case Intrinsic::aarch64_neon_st4: {
1542     // Create a struct type
1543     StructType *ST = dyn_cast<StructType>(ExpectedType);
1544     if (!ST)
1545       return nullptr;
1546     unsigned NumElts = Inst->getNumArgOperands() - 1;
1547     if (ST->getNumElements() != NumElts)
1548       return nullptr;
1549     for (unsigned i = 0, e = NumElts; i != e; ++i) {
1550       if (Inst->getArgOperand(i)->getType() != ST->getElementType(i))
1551         return nullptr;
1552     }
1553     Value *Res = UndefValue::get(ExpectedType);
1554     IRBuilder<> Builder(Inst);
1555     for (unsigned i = 0, e = NumElts; i != e; ++i) {
1556       Value *L = Inst->getArgOperand(i);
1557       Res = Builder.CreateInsertValue(Res, L, i);
1558     }
1559     return Res;
1560   }
1561   case Intrinsic::aarch64_neon_ld2:
1562   case Intrinsic::aarch64_neon_ld3:
1563   case Intrinsic::aarch64_neon_ld4:
1564     if (Inst->getType() == ExpectedType)
1565       return Inst;
1566     return nullptr;
1567   }
1568 }
1569 
1570 bool AArch64TTIImpl::getTgtMemIntrinsic(IntrinsicInst *Inst,
1571                                         MemIntrinsicInfo &Info) {
1572   switch (Inst->getIntrinsicID()) {
1573   default:
1574     break;
1575   case Intrinsic::aarch64_neon_ld2:
1576   case Intrinsic::aarch64_neon_ld3:
1577   case Intrinsic::aarch64_neon_ld4:
1578     Info.ReadMem = true;
1579     Info.WriteMem = false;
1580     Info.PtrVal = Inst->getArgOperand(0);
1581     break;
1582   case Intrinsic::aarch64_neon_st2:
1583   case Intrinsic::aarch64_neon_st3:
1584   case Intrinsic::aarch64_neon_st4:
1585     Info.ReadMem = false;
1586     Info.WriteMem = true;
1587     Info.PtrVal = Inst->getArgOperand(Inst->getNumArgOperands() - 1);
1588     break;
1589   }
1590 
1591   switch (Inst->getIntrinsicID()) {
1592   default:
1593     return false;
1594   case Intrinsic::aarch64_neon_ld2:
1595   case Intrinsic::aarch64_neon_st2:
1596     Info.MatchingId = VECTOR_LDST_TWO_ELEMENTS;
1597     break;
1598   case Intrinsic::aarch64_neon_ld3:
1599   case Intrinsic::aarch64_neon_st3:
1600     Info.MatchingId = VECTOR_LDST_THREE_ELEMENTS;
1601     break;
1602   case Intrinsic::aarch64_neon_ld4:
1603   case Intrinsic::aarch64_neon_st4:
1604     Info.MatchingId = VECTOR_LDST_FOUR_ELEMENTS;
1605     break;
1606   }
1607   return true;
1608 }
1609 
1610 /// See if \p I should be considered for address type promotion. We check if \p
1611 /// I is a sext with right type and used in memory accesses. If it used in a
1612 /// "complex" getelementptr, we allow it to be promoted without finding other
1613 /// sext instructions that sign extended the same initial value. A getelementptr
1614 /// is considered as "complex" if it has more than 2 operands.
1615 bool AArch64TTIImpl::shouldConsiderAddressTypePromotion(
1616     const Instruction &I, bool &AllowPromotionWithoutCommonHeader) {
1617   bool Considerable = false;
1618   AllowPromotionWithoutCommonHeader = false;
1619   if (!isa<SExtInst>(&I))
1620     return false;
1621   Type *ConsideredSExtType =
1622       Type::getInt64Ty(I.getParent()->getParent()->getContext());
1623   if (I.getType() != ConsideredSExtType)
1624     return false;
1625   // See if the sext is the one with the right type and used in at least one
1626   // GetElementPtrInst.
1627   for (const User *U : I.users()) {
1628     if (const GetElementPtrInst *GEPInst = dyn_cast<GetElementPtrInst>(U)) {
1629       Considerable = true;
1630       // A getelementptr is considered as "complex" if it has more than 2
1631       // operands. We will promote a SExt used in such complex GEP as we
1632       // expect some computation to be merged if they are done on 64 bits.
1633       if (GEPInst->getNumOperands() > 2) {
1634         AllowPromotionWithoutCommonHeader = true;
1635         break;
1636       }
1637     }
1638   }
1639   return Considerable;
1640 }
1641 
1642 bool AArch64TTIImpl::isLegalToVectorizeReduction(RecurrenceDescriptor RdxDesc,
1643                                                  ElementCount VF) const {
1644   if (!VF.isScalable())
1645     return true;
1646 
1647   Type *Ty = RdxDesc.getRecurrenceType();
1648   if (Ty->isBFloatTy() || !isLegalElementTypeForSVE(Ty))
1649     return false;
1650 
1651   switch (RdxDesc.getRecurrenceKind()) {
1652   case RecurKind::Add:
1653   case RecurKind::FAdd:
1654   case RecurKind::And:
1655   case RecurKind::Or:
1656   case RecurKind::Xor:
1657   case RecurKind::SMin:
1658   case RecurKind::SMax:
1659   case RecurKind::UMin:
1660   case RecurKind::UMax:
1661   case RecurKind::FMin:
1662   case RecurKind::FMax:
1663     return true;
1664   default:
1665     return false;
1666   }
1667 }
1668 
1669 InstructionCost
1670 AArch64TTIImpl::getMinMaxReductionCost(VectorType *Ty, VectorType *CondTy,
1671                                        bool IsPairwise, bool IsUnsigned,
1672                                        TTI::TargetCostKind CostKind) {
1673   if (!isa<ScalableVectorType>(Ty))
1674     return BaseT::getMinMaxReductionCost(Ty, CondTy, IsPairwise, IsUnsigned,
1675                                          CostKind);
1676   assert((isa<ScalableVectorType>(Ty) && isa<ScalableVectorType>(CondTy)) &&
1677          "Both vector needs to be scalable");
1678 
1679   std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
1680   InstructionCost LegalizationCost = 0;
1681   if (LT.first > 1) {
1682     Type *LegalVTy = EVT(LT.second).getTypeForEVT(Ty->getContext());
1683     unsigned CmpOpcode =
1684         Ty->isFPOrFPVectorTy() ? Instruction::FCmp : Instruction::ICmp;
1685     LegalizationCost =
1686         getCmpSelInstrCost(CmpOpcode, LegalVTy, LegalVTy,
1687                            CmpInst::BAD_ICMP_PREDICATE, CostKind) +
1688         getCmpSelInstrCost(Instruction::Select, LegalVTy, LegalVTy,
1689                            CmpInst::BAD_ICMP_PREDICATE, CostKind);
1690     LegalizationCost *= LT.first - 1;
1691   }
1692 
1693   return LegalizationCost + /*Cost of horizontal reduction*/ 2;
1694 }
1695 
1696 InstructionCost AArch64TTIImpl::getArithmeticReductionCostSVE(
1697     unsigned Opcode, VectorType *ValTy, bool IsPairwise,
1698     TTI::TargetCostKind CostKind) {
1699   assert(!IsPairwise && "Cannot be pair wise to continue");
1700 
1701   std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
1702   InstructionCost LegalizationCost = 0;
1703   if (LT.first > 1) {
1704     Type *LegalVTy = EVT(LT.second).getTypeForEVT(ValTy->getContext());
1705     LegalizationCost = getArithmeticInstrCost(Opcode, LegalVTy, CostKind);
1706     LegalizationCost *= LT.first - 1;
1707   }
1708 
1709   int ISD = TLI->InstructionOpcodeToISD(Opcode);
1710   assert(ISD && "Invalid opcode");
1711   // Add the final reduction cost for the legal horizontal reduction
1712   switch (ISD) {
1713   case ISD::ADD:
1714   case ISD::AND:
1715   case ISD::OR:
1716   case ISD::XOR:
1717   case ISD::FADD:
1718     return LegalizationCost + 2;
1719   default:
1720     return InstructionCost::getInvalid();
1721   }
1722 }
1723 
1724 InstructionCost
1725 AArch64TTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy,
1726                                            bool IsPairwiseForm,
1727                                            TTI::TargetCostKind CostKind) {
1728 
1729   if (isa<ScalableVectorType>(ValTy))
1730     return getArithmeticReductionCostSVE(Opcode, ValTy, IsPairwiseForm,
1731                                          CostKind);
1732   if (IsPairwiseForm)
1733     return BaseT::getArithmeticReductionCost(Opcode, ValTy, IsPairwiseForm,
1734                                              CostKind);
1735 
1736   std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, ValTy);
1737   MVT MTy = LT.second;
1738   int ISD = TLI->InstructionOpcodeToISD(Opcode);
1739   assert(ISD && "Invalid opcode");
1740 
1741   // Horizontal adds can use the 'addv' instruction. We model the cost of these
1742   // instructions as normal vector adds. This is the only arithmetic vector
1743   // reduction operation for which we have an instruction.
1744   static const CostTblEntry CostTblNoPairwise[]{
1745       {ISD::ADD, MVT::v8i8,  1},
1746       {ISD::ADD, MVT::v16i8, 1},
1747       {ISD::ADD, MVT::v4i16, 1},
1748       {ISD::ADD, MVT::v8i16, 1},
1749       {ISD::ADD, MVT::v4i32, 1},
1750   };
1751 
1752   if (const auto *Entry = CostTableLookup(CostTblNoPairwise, ISD, MTy))
1753     return LT.first * Entry->Cost;
1754 
1755   return BaseT::getArithmeticReductionCost(Opcode, ValTy, IsPairwiseForm,
1756                                            CostKind);
1757 }
1758 
1759 InstructionCost AArch64TTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
1760                                                VectorType *Tp,
1761                                                ArrayRef<int> Mask, int Index,
1762                                                VectorType *SubTp) {
1763   Kind = improveShuffleKindFromMask(Kind, Mask);
1764   if (Kind == TTI::SK_Broadcast || Kind == TTI::SK_Transpose ||
1765       Kind == TTI::SK_Select || Kind == TTI::SK_PermuteSingleSrc ||
1766       Kind == TTI::SK_Reverse) {
1767     static const CostTblEntry ShuffleTbl[] = {
1768       // Broadcast shuffle kinds can be performed with 'dup'.
1769       { TTI::SK_Broadcast, MVT::v8i8,  1 },
1770       { TTI::SK_Broadcast, MVT::v16i8, 1 },
1771       { TTI::SK_Broadcast, MVT::v4i16, 1 },
1772       { TTI::SK_Broadcast, MVT::v8i16, 1 },
1773       { TTI::SK_Broadcast, MVT::v2i32, 1 },
1774       { TTI::SK_Broadcast, MVT::v4i32, 1 },
1775       { TTI::SK_Broadcast, MVT::v2i64, 1 },
1776       { TTI::SK_Broadcast, MVT::v2f32, 1 },
1777       { TTI::SK_Broadcast, MVT::v4f32, 1 },
1778       { TTI::SK_Broadcast, MVT::v2f64, 1 },
1779       // Transpose shuffle kinds can be performed with 'trn1/trn2' and
1780       // 'zip1/zip2' instructions.
1781       { TTI::SK_Transpose, MVT::v8i8,  1 },
1782       { TTI::SK_Transpose, MVT::v16i8, 1 },
1783       { TTI::SK_Transpose, MVT::v4i16, 1 },
1784       { TTI::SK_Transpose, MVT::v8i16, 1 },
1785       { TTI::SK_Transpose, MVT::v2i32, 1 },
1786       { TTI::SK_Transpose, MVT::v4i32, 1 },
1787       { TTI::SK_Transpose, MVT::v2i64, 1 },
1788       { TTI::SK_Transpose, MVT::v2f32, 1 },
1789       { TTI::SK_Transpose, MVT::v4f32, 1 },
1790       { TTI::SK_Transpose, MVT::v2f64, 1 },
1791       // Select shuffle kinds.
1792       // TODO: handle vXi8/vXi16.
1793       { TTI::SK_Select, MVT::v2i32, 1 }, // mov.
1794       { TTI::SK_Select, MVT::v4i32, 2 }, // rev+trn (or similar).
1795       { TTI::SK_Select, MVT::v2i64, 1 }, // mov.
1796       { TTI::SK_Select, MVT::v2f32, 1 }, // mov.
1797       { TTI::SK_Select, MVT::v4f32, 2 }, // rev+trn (or similar).
1798       { TTI::SK_Select, MVT::v2f64, 1 }, // mov.
1799       // PermuteSingleSrc shuffle kinds.
1800       // TODO: handle vXi8/vXi16.
1801       { TTI::SK_PermuteSingleSrc, MVT::v2i32, 1 }, // mov.
1802       { TTI::SK_PermuteSingleSrc, MVT::v4i32, 3 }, // perfectshuffle worst case.
1803       { TTI::SK_PermuteSingleSrc, MVT::v2i64, 1 }, // mov.
1804       { TTI::SK_PermuteSingleSrc, MVT::v2f32, 1 }, // mov.
1805       { TTI::SK_PermuteSingleSrc, MVT::v4f32, 3 }, // perfectshuffle worst case.
1806       { TTI::SK_PermuteSingleSrc, MVT::v2f64, 1 }, // mov.
1807       // Reverse can be lowered with `rev`.
1808       { TTI::SK_Reverse, MVT::v2i32, 1 }, // mov.
1809       { TTI::SK_Reverse, MVT::v4i32, 2 }, // REV64; EXT
1810       { TTI::SK_Reverse, MVT::v2i64, 1 }, // mov.
1811       { TTI::SK_Reverse, MVT::v2f32, 1 }, // mov.
1812       { TTI::SK_Reverse, MVT::v4f32, 2 }, // REV64; EXT
1813       { TTI::SK_Reverse, MVT::v2f64, 1 }, // mov.
1814       // Broadcast shuffle kinds for scalable vectors
1815       { TTI::SK_Broadcast, MVT::nxv16i8,  1 },
1816       { TTI::SK_Broadcast, MVT::nxv8i16,  1 },
1817       { TTI::SK_Broadcast, MVT::nxv4i32,  1 },
1818       { TTI::SK_Broadcast, MVT::nxv2i64,  1 },
1819       { TTI::SK_Broadcast, MVT::nxv2f16,  1 },
1820       { TTI::SK_Broadcast, MVT::nxv4f16,  1 },
1821       { TTI::SK_Broadcast, MVT::nxv8f16,  1 },
1822       { TTI::SK_Broadcast, MVT::nxv2bf16, 1 },
1823       { TTI::SK_Broadcast, MVT::nxv4bf16, 1 },
1824       { TTI::SK_Broadcast, MVT::nxv8bf16, 1 },
1825       { TTI::SK_Broadcast, MVT::nxv2f32,  1 },
1826       { TTI::SK_Broadcast, MVT::nxv4f32,  1 },
1827       { TTI::SK_Broadcast, MVT::nxv2f64,  1 },
1828       { TTI::SK_Broadcast, MVT::nxv16i1,  1 },
1829       { TTI::SK_Broadcast, MVT::nxv8i1,   1 },
1830       { TTI::SK_Broadcast, MVT::nxv4i1,   1 },
1831       { TTI::SK_Broadcast, MVT::nxv2i1,   1 },
1832       // Handle the cases for vector.reverse with scalable vectors
1833       { TTI::SK_Reverse, MVT::nxv16i8,  1 },
1834       { TTI::SK_Reverse, MVT::nxv8i16,  1 },
1835       { TTI::SK_Reverse, MVT::nxv4i32,  1 },
1836       { TTI::SK_Reverse, MVT::nxv2i64,  1 },
1837       { TTI::SK_Reverse, MVT::nxv2f16,  1 },
1838       { TTI::SK_Reverse, MVT::nxv4f16,  1 },
1839       { TTI::SK_Reverse, MVT::nxv8f16,  1 },
1840       { TTI::SK_Reverse, MVT::nxv2bf16, 1 },
1841       { TTI::SK_Reverse, MVT::nxv4bf16, 1 },
1842       { TTI::SK_Reverse, MVT::nxv8bf16, 1 },
1843       { TTI::SK_Reverse, MVT::nxv2f32,  1 },
1844       { TTI::SK_Reverse, MVT::nxv4f32,  1 },
1845       { TTI::SK_Reverse, MVT::nxv2f64,  1 },
1846       { TTI::SK_Reverse, MVT::nxv16i1,  1 },
1847       { TTI::SK_Reverse, MVT::nxv8i1,   1 },
1848       { TTI::SK_Reverse, MVT::nxv4i1,   1 },
1849       { TTI::SK_Reverse, MVT::nxv2i1,   1 },
1850     };
1851     std::pair<InstructionCost, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
1852     if (const auto *Entry = CostTableLookup(ShuffleTbl, Kind, LT.second))
1853       return LT.first * Entry->Cost;
1854   }
1855 
1856   return BaseT::getShuffleCost(Kind, Tp, Mask, Index, SubTp);
1857 }
1858