1 | //===------ BPFTargetTransformInfo.h - BPF specific TTI ---------*- 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 uses the target's specific information to |
10 | // provide more precise answers to certain TTI queries, while letting the |
11 | // target independent and default TTI implementations handle the rest. |
12 | // |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #ifndef LLVM_LIB_TARGET_BPF_BPFTARGETTRANSFORMINFO_H |
16 | #define LLVM_LIB_TARGET_BPF_BPFTARGETTRANSFORMINFO_H |
17 | |
18 | #include "BPFTargetMachine.h" |
19 | #include "llvm/Analysis/TargetTransformInfo.h" |
20 | #include "llvm/CodeGen/BasicTTIImpl.h" |
21 | #include "llvm/Transforms/Utils/ScalarEvolutionExpander.h" |
22 | |
23 | namespace llvm { |
24 | class BPFTTIImpl : public BasicTTIImplBase<BPFTTIImpl> { |
25 | typedef BasicTTIImplBase<BPFTTIImpl> BaseT; |
26 | typedef TargetTransformInfo TTI; |
27 | friend BaseT; |
28 | |
29 | const BPFSubtarget *ST; |
30 | const BPFTargetLowering *TLI; |
31 | |
32 | const BPFSubtarget *getST() const { return ST; } |
33 | const BPFTargetLowering *getTLI() const { return TLI; } |
34 | |
35 | public: |
36 | explicit BPFTTIImpl(const BPFTargetMachine *TM, const Function &F) |
37 | : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)), |
38 | TLI(ST->getTargetLowering()) {} |
39 | |
40 | int getIntImmCost(const APInt &Imm, Type *Ty, TTI::TargetCostKind CostKind) { |
41 | if (Imm.getBitWidth() <= 64 && isInt<32>(x: Imm.getSExtValue())) |
42 | return TTI::TCC_Free; |
43 | |
44 | return TTI::TCC_Basic; |
45 | } |
46 | |
47 | InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy, |
48 | CmpInst::Predicate VecPred, |
49 | TTI::TargetCostKind CostKind, |
50 | const llvm::Instruction *I = nullptr) { |
51 | if (Opcode == Instruction::Select) |
52 | return SCEVCheapExpansionBudget.getValue(); |
53 | |
54 | return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, |
55 | I); |
56 | } |
57 | |
58 | InstructionCost getArithmeticInstrCost( |
59 | unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, |
60 | TTI::OperandValueInfo Op1Info = {.Kind: TTI::OK_AnyValue, .Properties: TTI::OP_None}, |
61 | TTI::OperandValueInfo Op2Info = {.Kind: TTI::OK_AnyValue, .Properties: TTI::OP_None}, |
62 | ArrayRef<const Value *> Args = std::nullopt, |
63 | const Instruction *CxtI = nullptr) { |
64 | int ISD = TLI->InstructionOpcodeToISD(Opcode); |
65 | if (ISD == ISD::ADD && CostKind == TTI::TCK_RecipThroughput) |
66 | return SCEVCheapExpansionBudget.getValue() + 1; |
67 | |
68 | return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info: Op1Info, |
69 | Opd2Info: Op2Info); |
70 | } |
71 | |
72 | TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize, |
73 | bool IsZeroCmp) const { |
74 | TTI::MemCmpExpansionOptions Options; |
75 | Options.LoadSizes = {8, 4, 2, 1}; |
76 | Options.MaxNumLoads = TLI->getMaxExpandSizeMemcmp(OptSize); |
77 | return Options; |
78 | } |
79 | |
80 | unsigned getMaxNumArgs() const { |
81 | return 5; |
82 | } |
83 | |
84 | }; |
85 | |
86 | } // end namespace llvm |
87 | |
88 | #endif // LLVM_LIB_TARGET_BPF_BPFTARGETTRANSFORMINFO_H |
89 | |