LLVM 23.0.0git
HexagonISelLowering.h
Go to the documentation of this file.
1//===-- HexagonISelLowering.h - Hexagon DAG Lowering Interface --*- C++ -*-===//
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// This file defines the interfaces that Hexagon uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_HEXAGON_HEXAGONISELLOWERING_H
15#define LLVM_LIB_TARGET_HEXAGON_HEXAGONISELLOWERING_H
16
17#include "Hexagon.h"
19#include "llvm/ADT/StringRef.h"
25#include "llvm/IR/CallingConv.h"
26#include "llvm/IR/InlineAsm.h"
27#include <cstdint>
28#include <utility>
29
30namespace llvm {
31
33
35 int VarArgsFrameOffset; // Frame offset to start of varargs area.
36 const HexagonTargetMachine &HTM;
37 const HexagonSubtarget &Subtarget;
38
39public:
40 explicit HexagonTargetLowering(const TargetMachine &TM,
41 const HexagonSubtarget &ST);
42
43 /// IsEligibleForTailCallOptimization - Check whether the call is eligible
44 /// for tail call optimization. Targets which want to do tail call
45 /// optimization should implement this function.
47 CallingConv::ID CalleeCC, bool isVarArg, bool isCalleeStructRet,
48 bool isCallerStructRet, const SmallVectorImpl<ISD::OutputArg> &Outs,
49 const SmallVectorImpl<SDValue> &OutVals,
50 const SmallVectorImpl<ISD::InputArg> &Ins, SelectionDAG& DAG) const;
51
53 const CallBase &I, MachineFunction &MF,
54 unsigned Intrinsic) const override;
55
56 bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
57 bool isTruncateFree(EVT VT1, EVT VT2) const override;
58
59 bool isCheapToSpeculateCttz(Type *) const override { return true; }
60 bool isCheapToSpeculateCtlz(Type *) const override { return true; }
61 bool isCtlzFast() const override { return true; }
62
63 bool hasBitTest(SDValue X, SDValue Y) const override;
64
65 bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override;
66
67 bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override;
68
69 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
70
71 /// Return true if an FMA operation is faster than a pair of mul and add
72 /// instructions. fmuladd intrinsics will be expanded to FMAs when this
73 /// method returns true (and FMAs are legal), otherwise fmuladd is
74 /// expanded to mul + add.
76 EVT) const override;
77
78 // Should we expand the build vector with shuffles?
80 unsigned DefinedValues) const override;
81 bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
82 unsigned Index) const override;
83
84 bool isTargetCanonicalConstantNode(SDValue Op) const override;
85
86 bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
87 LegalizeTypeAction getPreferredVectorAction(MVT VT) const override;
89
90 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
92 SelectionDAG &DAG) const override;
94 SelectionDAG &DAG) const override;
95
96 std::pair<MVT, unsigned>
98 EVT VT) const;
99
118
125 SDValue
126 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
128 const SDLoc &dl, SelectionDAG &DAG,
129 SmallVectorImpl<SDValue> &InVals) const override;
134 SelectionDAG &DAG) const;
136 SelectionDAG &DAG) const;
138 SelectionDAG &DAG) const;
140 GlobalAddressSDNode *GA, SDValue InGlue, EVT PtrVT,
141 unsigned ReturnReg, unsigned char OperandGlues) const;
143
145 SmallVectorImpl<SDValue> &InVals) const override;
147 CallingConv::ID CallConv, bool isVarArg,
149 const SDLoc &dl, SelectionDAG &DAG,
151 const SmallVectorImpl<SDValue> &OutVals,
152 SDValue Callee) const;
153
159
160 bool CanLowerReturn(CallingConv::ID CallConv,
161 MachineFunction &MF, bool isVarArg,
163 LLVMContext &Context, const Type *RetTy) const override;
164
165 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
167 const SmallVectorImpl<SDValue> &OutVals,
168 const SDLoc &dl, SelectionDAG &DAG) const override;
169
170 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
171
172 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
173
174 Register getRegisterByName(const char* RegName, LLT VT,
175 const MachineFunction &MF) const override;
176
178 CallingConv::ID CC, EVT VT,
179 EVT &IntermediateVT,
180 unsigned &NumIntermediates,
181 MVT &RegisterVT) const override;
182
184 EVT VT) const override;
185 /// If a physical register, this returns the register that receives the
186 /// exception address on entry to an EH pad.
188 getExceptionPointerRegister(const Constant *PersonalityFn) const override {
189 return Hexagon::R0;
190 }
191
192 /// If a physical register, this returns the register that receives the
193 /// exception typeid on entry to a landing pad.
195 getExceptionSelectorRegister(const Constant *PersonalityFn) const override {
196 return Hexagon::R1;
197 }
198
203
205 EVT VT) const override {
206 if (!VT.isVector())
207 return MVT::i1;
208 else
209 return EVT::getVectorVT(C, MVT::i1, VT.getVectorNumElements());
210 }
211
215 SelectionDAG &DAG) const override;
216
217 ConstraintType getConstraintType(StringRef Constraint) const override;
218
219 std::pair<unsigned, const TargetRegisterClass *>
221 StringRef Constraint, MVT VT) const override;
222
223 // Intrinsics
226 /// isLegalAddressingMode - Return true if the addressing mode represented
227 /// by AM is legal for this target, for a load/store of the specified type.
228 /// The type may be VoidTy, in which case only return true if the addressing
229 /// mode is legal for a load/store of any legal type.
230 /// TODO: Handle pre/postinc as well.
231 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
232 Type *Ty, unsigned AS,
233 Instruction *I = nullptr) const override;
234 /// Return true if folding a constant offset with the given GlobalAddress
235 /// is legal. It is frequently not legal in PIC relocation models.
236 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
237
238 bool isFPImmLegal(const APFloat &Imm, EVT VT,
239 bool ForCodeSize) const override;
240
241 /// isLegalICmpImmediate - Return true if the specified immediate is legal
242 /// icmp immediate, that is the target has icmp instructions which can
243 /// compare a register against the immediate without having to materialize
244 /// the immediate into a register.
245 bool isLegalICmpImmediate(int64_t Imm) const override;
246
247 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
248 const AttributeList &FuncAttributes) const override;
249
250 bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT,
251 unsigned AddrSpace, Align Alignment,
253 unsigned *Fast) const override;
254
255 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace,
256 Align Alignment,
258 unsigned *Fast) const override;
259
260 /// Returns relocation base for the given PIC jumptable.
262 const override;
263
264 /// Returns true if it is beneficial to convert a load of a constant
265 /// to just the constant itself.
267 Type *Ty) const override;
268
269 bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT,
270 std::optional<unsigned> ByteOffset) const override;
271
273 SDNode *Node) const override;
274
275 // Handling of atomic RMW instructions.
276 Value *emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy, Value *Addr,
277 AtomicOrdering Ord) const override;
278 Value *emitStoreConditional(IRBuilderBase &Builder, Value *Val, Value *Addr,
279 AtomicOrdering Ord) const override;
283 shouldExpandAtomicCmpXchgInIR(const AtomicCmpXchgInst *AI) const override;
284
286 shouldExpandAtomicRMWInIR(const AtomicRMWInst *AI) const override {
288 }
289
292 MachineBasicBlock *BB) const override;
293
294 bool supportKCFIBundles() const override { return true; }
295
298 const TargetInstrInfo *TII) const override;
299
300 bool hasInlineStackProbe(const MachineFunction &MF) const override;
301 unsigned getStackProbeSize(const MachineFunction &MF, Align StackAlign) const;
302
303private:
304 void initializeHVXLowering();
305 unsigned getPreferredHvxVectorAction(MVT VecTy) const;
306 unsigned getCustomHvxOperationAction(SDNode &Op) const;
307
308 bool validateConstPtrAlignment(SDValue Ptr, Align NeedAlign, const SDLoc &dl,
309 SelectionDAG &DAG) const;
310 SDValue replaceMemWithUndef(SDValue Op, SelectionDAG &DAG) const;
311
312 std::pair<SDValue,int> getBaseAndOffset(SDValue Addr) const;
313
314 bool getBuildVectorConstInts(ArrayRef<SDValue> Values, MVT VecTy,
315 SelectionDAG &DAG,
316 MutableArrayRef<ConstantInt*> Consts) const;
317 SDValue buildVector32(ArrayRef<SDValue> Elem, const SDLoc &dl, MVT VecTy,
318 SelectionDAG &DAG) const;
319 SDValue buildVector64(ArrayRef<SDValue> Elem, const SDLoc &dl, MVT VecTy,
320 SelectionDAG &DAG) const;
321 SDValue extractVector(SDValue VecV, SDValue IdxV, const SDLoc &dl,
322 MVT ValTy, MVT ResTy, SelectionDAG &DAG) const;
323 SDValue extractVectorPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
324 MVT ValTy, MVT ResTy, SelectionDAG &DAG) const;
325 SDValue insertVector(SDValue VecV, SDValue ValV, SDValue IdxV,
326 const SDLoc &dl, MVT ValTy, SelectionDAG &DAG) const;
327 SDValue insertVectorPred(SDValue VecV, SDValue ValV, SDValue IdxV,
328 const SDLoc &dl, MVT ValTy, SelectionDAG &DAG) const;
329 SDValue expandPredicate(SDValue Vec32, const SDLoc &dl,
330 SelectionDAG &DAG) const;
331 SDValue contractPredicate(SDValue Vec64, const SDLoc &dl,
332 SelectionDAG &DAG) const;
334 SDValue getVectorShiftByInt(SDValue Op, SelectionDAG &DAG) const;
335 SDValue appendUndef(SDValue Val, MVT ResTy, SelectionDAG &DAG) const;
336 SDValue getCombine(SDValue Hi, SDValue Lo, const SDLoc &dl, MVT ResTy,
337 SelectionDAG &DAG) const;
338
339 bool isUndef(SDValue Op) const {
340 if (Op.isMachineOpcode())
341 return Op.getMachineOpcode() == TargetOpcode::IMPLICIT_DEF;
342 return Op.getOpcode() == ISD::UNDEF;
343 }
344 SDValue getInstr(unsigned MachineOpc, const SDLoc &dl, MVT Ty,
345 ArrayRef<SDValue> Ops, SelectionDAG &DAG) const {
346 SDNode *N = DAG.getMachineNode(MachineOpc, dl, Ty, Ops);
347 return SDValue(N, 0);
348 }
349 SDValue getZero(const SDLoc &dl, MVT Ty, SelectionDAG &DAG) const;
350
351 using VectorPair = std::pair<SDValue, SDValue>;
352 using TypePair = std::pair<MVT, MVT>;
353
354 SDValue getInt(unsigned IntId, MVT ResTy, ArrayRef<SDValue> Ops,
355 const SDLoc &dl, SelectionDAG &DAG) const;
356
357 MVT ty(SDValue Op) const {
358 return Op.getValueType().getSimpleVT();
359 }
360 TypePair ty(const VectorPair &Ops) const {
361 return { Ops.first.getValueType().getSimpleVT(),
362 Ops.second.getValueType().getSimpleVT() };
363 }
364 MVT tyScalar(MVT Ty) const {
365 if (!Ty.isVector())
366 return Ty;
367 return MVT::getIntegerVT(Ty.getSizeInBits());
368 }
369 MVT tyVector(MVT Ty, MVT ElemTy) const {
370 if (Ty.isVectorOf(ElemTy))
371 return Ty;
372 unsigned TyWidth = Ty.getSizeInBits();
373 unsigned ElemWidth = ElemTy.getSizeInBits();
374 assert((TyWidth % ElemWidth) == 0);
375 return MVT::getVectorVT(ElemTy, TyWidth/ElemWidth);
376 }
377
378 MVT typeJoin(const TypePair &Tys) const;
379 TypePair typeSplit(MVT Ty) const;
380 MVT typeExtElem(MVT VecTy, unsigned Factor) const;
381 MVT typeTruncElem(MVT VecTy, unsigned Factor) const;
382 TypePair typeExtendToWider(MVT Ty0, MVT Ty1) const;
383 TypePair typeWidenToWider(MVT Ty0, MVT Ty1) const;
384 MVT typeLegalize(MVT Ty, SelectionDAG &DAG) const;
385 MVT typeWidenToHvx(MVT Ty) const;
386
387 SDValue opJoin(const VectorPair &Ops, const SDLoc &dl,
388 SelectionDAG &DAG) const;
389 VectorPair opSplit(SDValue Vec, const SDLoc &dl, SelectionDAG &DAG) const;
390 SDValue opCastElem(SDValue Vec, MVT ElemTy, SelectionDAG &DAG) const;
391
392 SDValue LoHalf(SDValue V, SelectionDAG &DAG) const {
393 MVT Ty = ty(V);
394 const SDLoc &dl(V);
395 if (!Ty.isVector()) {
396 assert(Ty.getSizeInBits() == 64);
397 return DAG.getTargetExtractSubreg(Hexagon::isub_lo, dl, MVT::i32, V);
398 }
399 MVT HalfTy = typeSplit(Ty).first;
400 SDValue Idx = getZero(dl, MVT::i32, DAG);
401 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, HalfTy, V, Idx);
402 }
403 SDValue HiHalf(SDValue V, SelectionDAG &DAG) const {
404 MVT Ty = ty(V);
405 const SDLoc &dl(V);
406 if (!Ty.isVector()) {
407 assert(Ty.getSizeInBits() == 64);
408 return DAG.getTargetExtractSubreg(Hexagon::isub_hi, dl, MVT::i32, V);
409 }
410 MVT HalfTy = typeSplit(Ty).first;
411 SDValue Idx = DAG.getConstant(HalfTy.getVectorNumElements(), dl, MVT::i32);
412 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, HalfTy, V, Idx);
413 }
414
415 bool allowsHvxMemoryAccess(MVT VecTy, MachineMemOperand::Flags Flags,
416 unsigned *Fast) const;
417 bool allowsHvxMisalignedMemoryAccesses(MVT VecTy,
419 unsigned *Fast) const;
420 void AdjustHvxInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const;
421
422 bool isHvxSingleTy(MVT Ty) const;
423 bool isHvxPairTy(MVT Ty) const;
424 bool isHvxBoolTy(MVT Ty) const;
425 SDValue convertToByteIndex(SDValue ElemIdx, MVT ElemTy,
426 SelectionDAG &DAG) const;
427 SDValue getIndexInWord32(SDValue Idx, MVT ElemTy, SelectionDAG &DAG) const;
428 SDValue getByteShuffle(const SDLoc &dl, SDValue Op0, SDValue Op1,
429 ArrayRef<int> Mask, SelectionDAG &DAG) const;
430
431 SDValue buildHvxVectorReg(ArrayRef<SDValue> Values, const SDLoc &dl,
432 MVT VecTy, SelectionDAG &DAG) const;
433 SDValue buildHvxVectorPred(ArrayRef<SDValue> Values, const SDLoc &dl,
434 MVT VecTy, SelectionDAG &DAG) const;
435 SDValue createHvxPrefixPred(SDValue PredV, const SDLoc &dl,
436 unsigned BitBytes, bool ZeroFill,
437 SelectionDAG &DAG) const;
438 SDValue extractHvxElementReg(SDValue VecV, SDValue IdxV, const SDLoc &dl,
439 MVT ResTy, SelectionDAG &DAG) const;
440 SDValue extractHvxElementPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
441 MVT ResTy, SelectionDAG &DAG) const;
442 SDValue insertHvxElementReg(SDValue VecV, SDValue IdxV, SDValue ValV,
443 const SDLoc &dl, SelectionDAG &DAG) const;
444 SDValue insertHvxElementPred(SDValue VecV, SDValue IdxV, SDValue ValV,
445 const SDLoc &dl, SelectionDAG &DAG) const;
446 SDValue extractHvxSubvectorReg(SDValue OrigOp, SDValue VecV, SDValue IdxV,
447 const SDLoc &dl, MVT ResTy, SelectionDAG &DAG)
448 const;
449 SDValue extractHvxSubvectorPred(SDValue VecV, SDValue IdxV, const SDLoc &dl,
450 MVT ResTy, SelectionDAG &DAG) const;
451 SDValue insertHvxSubvectorReg(SDValue VecV, SDValue SubV, SDValue IdxV,
452 const SDLoc &dl, SelectionDAG &DAG) const;
453 SDValue insertHvxSubvectorPred(SDValue VecV, SDValue SubV, SDValue IdxV,
454 const SDLoc &dl, SelectionDAG &DAG) const;
455 SDValue extendHvxVectorPred(SDValue VecV, const SDLoc &dl, MVT ResTy,
456 bool ZeroExt, SelectionDAG &DAG) const;
457 SDValue compressHvxPred(SDValue VecQ, const SDLoc &dl, MVT ResTy,
458 SelectionDAG &DAG) const;
459 SDValue resizeToWidth(SDValue VecV, MVT ResTy, bool Signed, const SDLoc &dl,
460 SelectionDAG &DAG) const;
461 SDValue extractSubvector(SDValue Vec, MVT SubTy, unsigned SubIdx,
462 SelectionDAG &DAG) const;
463 VectorPair emitHvxAddWithOverflow(SDValue A, SDValue B, const SDLoc &dl,
464 bool Signed, SelectionDAG &DAG) const;
465 VectorPair emitHvxShiftRightRnd(SDValue Val, unsigned Amt, bool Signed,
466 SelectionDAG &DAG) const;
467 SDValue emitHvxMulHsV60(SDValue A, SDValue B, const SDLoc &dl,
468 SelectionDAG &DAG) const;
469 SDValue emitHvxMulLoHiV60(SDValue A, bool SignedA, SDValue B, bool SignedB,
470 const SDLoc &dl, SelectionDAG &DAG) const;
471 SDValue emitHvxMulLoHiV62(SDValue A, bool SignedA, SDValue B, bool SignedB,
472 const SDLoc &dl, SelectionDAG &DAG) const;
473
474 SDValue LowerHvxBuildVector(SDValue Op, SelectionDAG &DAG) const;
475 SDValue LowerHvxSplatVector(SDValue Op, SelectionDAG &DAG) const;
476 SDValue LowerHvxConcatVectors(SDValue Op, SelectionDAG &DAG) const;
477 SDValue LowerHvxExtractElement(SDValue Op, SelectionDAG &DAG) const;
478 SDValue LowerHvxInsertElement(SDValue Op, SelectionDAG &DAG) const;
479 SDValue LowerHvxExtractSubvector(SDValue Op, SelectionDAG &DAG) const;
480 SDValue LowerHvxInsertSubvector(SDValue Op, SelectionDAG &DAG) const;
481 SDValue LowerHvxBitcast(SDValue Op, SelectionDAG &DAG) const;
482 SDValue LowerHvxAnyExt(SDValue Op, SelectionDAG &DAG) const;
483 SDValue LowerHvxSignExt(SDValue Op, SelectionDAG &DAG) const;
484 SDValue LowerHvxZeroExt(SDValue Op, SelectionDAG &DAG) const;
485 SDValue LowerHvxCttz(SDValue Op, SelectionDAG &DAG) const;
486 SDValue LowerHvxMulh(SDValue Op, SelectionDAG &DAG) const;
487 SDValue LowerHvxMulLoHi(SDValue Op, SelectionDAG &DAG) const;
488 SDValue LowerHvxExtend(SDValue Op, SelectionDAG &DAG) const;
489 SDValue LowerHvxSelect(SDValue Op, SelectionDAG &DAG) const;
490 SDValue LowerHvxShift(SDValue Op, SelectionDAG &DAG) const;
491 SDValue LowerHvxFunnelShift(SDValue Op, SelectionDAG &DAG) const;
492 SDValue LowerHvxIntrinsic(SDValue Op, SelectionDAG &DAG) const;
493 SDValue LowerHvxMaskedOp(SDValue Op, SelectionDAG &DAG) const;
494 SDValue LowerHvxFpExtend(SDValue Op, SelectionDAG &DAG) const;
495 SDValue LowerHvxFpToInt(SDValue Op, SelectionDAG &DAG) const;
496 SDValue LowerHvxIntToFp(SDValue Op, SelectionDAG &DAG) const;
497 SDValue LowerHvxPred32ToFp(SDValue Op, SelectionDAG &DAG) const;
498 SDValue LowerHvxPred64ToFp(SDValue Op, SelectionDAG &DAG) const;
499 SDValue LowerHvxPartialReduceMLA(SDValue Op, SelectionDAG &DAG) const;
500 SDValue ExpandHvxFpToInt(SDValue Op, SelectionDAG &DAG) const;
501 SDValue ExpandHvxIntToFp(SDValue Op, SelectionDAG &DAG) const;
502 SDValue LowerHvxStore(SDValue Op, SelectionDAG &DAG) const;
503 SDValue LowerHvxLoad(SDValue Op, SelectionDAG &DAG) const;
504
505 VectorPair SplitVectorOp(SDValue Op, SelectionDAG &DAG) const;
506
507 SDValue SplitHvxMemOp(SDValue Op, SelectionDAG &DAG) const;
508 SDValue WidenHvxLoad(SDValue Op, SelectionDAG &DAG) const;
509 SDValue WidenHvxStore(SDValue Op, SelectionDAG &DAG) const;
510 SDValue WidenHvxSetCC(SDValue Op, SelectionDAG &DAG) const;
511 SDValue LegalizeHvxResize(SDValue Op, SelectionDAG &DAG) const;
512 SDValue ExpandHvxResizeIntoSteps(SDValue Op, SelectionDAG &DAG) const;
513 SDValue EqualizeFpIntConversion(SDValue Op, SelectionDAG &DAG) const;
514
515 SDValue CreateTLWrapper(SDValue Op, SelectionDAG &DAG) const;
516 SDValue RemoveTLWrapper(SDValue Op, SelectionDAG &DAG) const;
517 SDValue WidenHvxTruncateToBool(SDValue Op, SelectionDAG &DAG) const;
518
519 std::pair<const TargetRegisterClass*, uint8_t>
520 findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT)
521 const override;
522
523 bool shouldSplitToHvx(MVT Ty, SelectionDAG &DAG) const;
524 bool shouldWidenToHvx(MVT Ty, SelectionDAG &DAG) const;
525 bool isHvxOperation(SDNode *N, SelectionDAG &DAG) const;
526 SDValue LowerHvxOperation(SDValue Op, SelectionDAG &DAG) const;
527 void LowerHvxOperationWrapper(SDNode *N, SmallVectorImpl<SDValue> &Results,
528 SelectionDAG &DAG) const;
529 void ReplaceHvxNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
530 SelectionDAG &DAG) const;
531
532 SDValue combineTruncateBeforeLegal(SDValue Op, DAGCombinerInfo &DCI) const;
533
534 SDValue combineConcatOfShuffles(SDValue Op, SelectionDAG &DAG) const;
535 SDValue combineConcatOfScalarPreds(SDValue Op, unsigned BitBytes,
536 SelectionDAG &DAG) const;
537 SDValue combineConcatVectorsBeforeLegal(SDValue Op, DAGCombinerInfo & DCI)
538 const;
539 SDValue expandVecReduceAdd(SDNode *N, SelectionDAG &DAG) const;
540 SDValue createExtendingPartialReduceMLA(
541 unsigned Opcode, EVT AccEltType, unsigned AccNumElements, EVT InputType,
542 const SDValue &A, const SDValue &B, unsigned &RemainingReductionRatio,
543 const SDLoc &DL, SelectionDAG &DAG) const;
544 SDValue splitVecReduceAdd(SDNode *N, SelectionDAG &DAG) const;
545 SDValue splitExtendingPartialReduceMLA(SDNode *N, SelectionDAG &DAG) const;
546 SDValue PerformHvxDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const;
547};
548
549} // end namespace llvm
550
551#endif // LLVM_LIB_TARGET_HEXAGON_HEXAGONISELLOWERING_H
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
#define I(x, y, z)
Definition MD5.cpp:57
static bool isUndef(const MachineInstr &MI)
Register const TargetRegisterInfo * TRI
static Value * extractVector(IRBuilderTy &IRB, Value *V, unsigned BeginIndex, unsigned EndIndex, const Twine &Name)
Definition SROA.cpp:2517
static Value * insertVector(IRBuilderTy &IRB, Value *Old, Value *V, unsigned BeginIndex, const Twine &Name)
Definition SROA.cpp:2539
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
An instruction that atomically checks whether a specified value is in a memory location,...
an instruction that atomically reads a memory location, combines it with another value,...
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This class represents a function call, abstracting a target machine's calling convention.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const override
Returns relocation base for the given PIC jumptable.
SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const
MachineInstr * EmitKCFICheck(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator &MBBI, const TargetInstrInfo *TII) const override
SDValue LowerZERO_EXTEND(SDValue Op, SelectionDAG &DAG) const
SDValue LowerGLOBAL_OFFSET_TABLE(SDValue Op, SelectionDAG &DAG) const
bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override
Return if the target supports combining a chain like:
bool isCtlzFast() const override
Return true if ctlz instruction is fast.
SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const
void AdjustInstrPostInstrSelection(MachineInstr &MI, SDNode *Node) const override
This method should be implemented by targets that mark instructions with the 'hasPostISelHook' flag.
bool isTargetCanonicalConstantNode(SDValue Op) const override
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
ConstraintType getConstraintType(StringRef Constraint) const override
Given a constraint, return the type of constraint it is for this target.
bool isTruncateFree(Type *Ty1, Type *Ty2) const override
Return true if it's free to truncate a value of type FromTy to type ToTy.
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
unsigned getStackProbeSize(const MachineFunction &MF, Align StackAlign) const
SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const
SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const
SDValue LowerUAddSubO(SDValue Op, SelectionDAG &DAG) const
SDValue LowerANY_EXTEND(SDValue Op, SelectionDAG &DAG) const
Value * emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy, Value *Addr, AtomicOrdering Ord) const override
Perform a load-linked operation on Addr, returning a "Value *" with the corresponding pointee type.
bool isLegalICmpImmediate(int64_t Imm) const override
isLegalICmpImmediate - Return true if the specified immediate is legal icmp immediate,...
bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset) const override
Return true if it is profitable to reduce a load to a smaller type.
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
isLegalAddressingMode - Return true if the addressing mode represented by AM is legal for this target...
SDValue LowerINLINEASM(SDValue Op, SelectionDAG &DAG) const
AtomicExpansionKind shouldExpandAtomicStoreInIR(StoreInst *SI) const override
Returns how the given (atomic) store should be expanded by the IR-level AtomicExpand pass into.
SDValue GetDynamicTLSAddr(SelectionDAG &DAG, SDValue Chain, GlobalAddressSDNode *GA, SDValue InGlue, EVT PtrVT, unsigned ReturnReg, unsigned char OperandGlues) const
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &dl, SelectionDAG &DAG) const override
This hook must be implemented to lower outgoing return values, described by the Outs array,...
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const
bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base, SDValue &Offset, ISD::MemIndexedMode &AM, SelectionDAG &DAG) const override
Returns true by value, base pointer and offset pointer and addressing mode by reference if this node ...
SDValue LowerUnalignedLoad(SDValue Op, SelectionDAG &DAG) const
SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const
SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
SDValue LowerEH_LABEL(SDValue Op, SelectionDAG &DAG) const
bool isCheapToSpeculateCtlz(Type *) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
isFPImmLegal - Returns true if the target can instruction select the specified FP immediate natively.
bool mayBeEmittedAsTailCall(const CallInst *CI) const override
Return true if the target may be able emit the call instruction as a tail call.
AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const override
Returns how the given (atomic) load should be expanded by the IR-level AtomicExpand pass.
bool supportKCFIBundles() const override
Return true if the target supports kcfi operand bundles.
bool isCheapToSpeculateCttz(Type *) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override
Return true if result of the specified node is used by a return node only.
SDValue LowerCallResult(SDValue Chain, SDValue InGlue, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals, const SmallVectorImpl< SDValue > &OutVals, SDValue Callee) const
LowerCallResult - Lower the result values of an ISD::CALL into the appropriate copies out of appropri...
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const
SDValue LowerToTLSInitialExecModel(GlobalAddressSDNode *GA, SelectionDAG &DAG) const
SDValue LowerToTLSGeneralDynamicModel(GlobalAddressSDNode *GA, SelectionDAG &DAG) const
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const override
Return true if the target supports a memory access of this type for the given address space and align...
SDValue LowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const
bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT, unsigned Index) const override
Return true if EXTRACT_SUBVECTOR is cheap for extracting this result type from this source type with ...
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *BB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
SDValue LowerROTL(SDValue Op, SelectionDAG &DAG) const
SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const
SDValue LowerLoad(SDValue Op, SelectionDAG &DAG) const
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
bool isShuffleMaskLegal(ArrayRef< int > Mask, EVT VT) const override
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
LegalizeAction getCustomOperationAction(SDNode &Op) const override
How to legalize this custom operation?
SDValue LowerToTLSLocalExecModel(GlobalAddressSDNode *GA, SelectionDAG &DAG) const
SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const
bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override
Return true if a truncation from FromTy to ToTy is permitted when deciding whether a call is in tail ...
SDValue LowerUAddSubOCarry(SDValue Op, SelectionDAG &DAG) const
SDValue LowerSIGN_EXTEND(SDValue Op, SelectionDAG &DAG) const
bool shouldExpandBuildVectorWithShuffles(EVT VT, unsigned DefinedValues) const override
bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const override
Returns true if it is beneficial to convert a load of a constant to just the constant itself.
SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const
SDValue LowerCall(TargetLowering::CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
LowerCall - Functions arguments are copied from virtual regs to (physical regs)/(stack frame),...
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const override
Determine if the target supports unaligned memory accesses.
SDValue LowerStore(SDValue Op, SelectionDAG &DAG) const
SDValue LowerPREFETCH(SDValue Op, SelectionDAG &DAG) const
bool hasInlineStackProbe(const MachineFunction &MF) const override
SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const
EVT getSetCCResultType(const DataLayout &, LLVMContext &C, EVT VT) const override
Return the ValueType of the result of SETCC operations.
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked when a node result type is illegal for the target, and the operation was reg...
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
Value * emitStoreConditional(IRBuilderBase &Builder, Value *Val, Value *Addr, AtomicOrdering Ord) const override
Perform a store-conditional operation to Addr.
bool hasBitTest(SDValue X, SDValue Y) const override
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
HexagonTargetLowering(const TargetMachine &TM, const HexagonSubtarget &ST)
SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
bool IsEligibleForTailCallOptimization(SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg, bool isCalleeStructRet, bool isCallerStructRet, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SmallVectorImpl< ISD::InputArg > &Ins, SelectionDAG &DAG) const
IsEligibleForTailCallOptimization - Check whether the call is eligible for tail call optimization.
SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const
void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const
SDValue LowerVECTOR_SHIFT(SDValue Op, SelectionDAG &DAG) const
SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const
SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const
AtomicExpansionKind shouldExpandAtomicRMWInIR(const AtomicRMWInst *AI) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &, EVT) const override
Return true if an FMA operation is faster than a pair of mul and add instructions.
SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const
Register getExceptionSelectorRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &FuncAttributes) const override
Returns the target specific optimal type for load and store operations as a result of memset,...
SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const
LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, LLVMContext &Context, const Type *RetTy) const override
This hook should be implemented to check whether the return values described by the Outs array can fi...
SDValue LowerGLOBALADDRESS(SDValue Op, SelectionDAG &DAG) const
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const override
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
AtomicExpansionKind shouldExpandAtomicCmpXchgInIR(const AtomicCmpXchgInst *AI) const override
Returns how the given atomic cmpxchg should be expanded by the IR-level AtomicExpand pass.
std::pair< MVT, unsigned > handleMaskRegisterForCallingConv(const HexagonSubtarget &Subtarget, EVT VT) const
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const
SDValue LowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
An instruction for reading from memory.
Machine Value Type.
static MVT getVectorVT(MVT VT, unsigned NumElements)
static MVT getIntegerVT(unsigned BitWidth)
Instructions::iterator instr_iterator
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
TargetInstrInfo - Interface to description of machine instruction set.
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
TargetLowering(const TargetLowering &)=delete
Primary interface to the complete machine description for the target machine.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ UNDEF
UNDEF - An undefined node.
Definition ISDOpcodes.h:233
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:614
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:573
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
AtomicOrdering
Atomic ordering for LLVM's memory model.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition ValueTypes.h:70
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition ValueTypes.h:359
This structure contains all information that is necessary for lowering calls.