1 | //==- WebAssemblyTargetTransformInfo.h - WebAssembly-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 | /// \file |
10 | /// This file a TargetTransformInfo::Concept conforming object specific |
11 | /// to the WebAssembly target machine. |
12 | /// |
13 | /// It uses the target's detailed information to provide more precise answers to |
14 | /// certain TTI queries, while letting the target independent and default TTI |
15 | /// implementations handle the rest. |
16 | /// |
17 | //===----------------------------------------------------------------------===// |
18 | |
19 | #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H |
20 | #define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLYTARGETTRANSFORMINFO_H |
21 | |
22 | #include "WebAssemblyTargetMachine.h" |
23 | #include "llvm/CodeGen/BasicTTIImpl.h" |
24 | #include <algorithm> |
25 | |
26 | namespace llvm { |
27 | |
28 | class WebAssemblyTTIImpl final : public BasicTTIImplBase<WebAssemblyTTIImpl> { |
29 | typedef BasicTTIImplBase<WebAssemblyTTIImpl> BaseT; |
30 | typedef TargetTransformInfo TTI; |
31 | friend BaseT; |
32 | |
33 | const WebAssemblySubtarget *ST; |
34 | const WebAssemblyTargetLowering *TLI; |
35 | |
36 | const WebAssemblySubtarget *getST() const { return ST; } |
37 | const WebAssemblyTargetLowering *getTLI() const { return TLI; } |
38 | |
39 | public: |
40 | WebAssemblyTTIImpl(const WebAssemblyTargetMachine *TM, const Function &F) |
41 | : BaseT(TM, F.getDataLayout()), ST(TM->getSubtargetImpl(F)), |
42 | TLI(ST->getTargetLowering()) {} |
43 | |
44 | /// \name Scalar TTI Implementations |
45 | /// @{ |
46 | |
47 | // TODO: Implement more Scalar TTI for WebAssembly |
48 | |
49 | TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) const; |
50 | |
51 | void (Loop *L, ScalarEvolution &SE, |
52 | TTI::UnrollingPreferences &UP, |
53 | OptimizationRemarkEmitter *ORE) const; |
54 | |
55 | /// @} |
56 | |
57 | /// \name Vector TTI Implementations |
58 | /// @{ |
59 | |
60 | unsigned getNumberOfRegisters(unsigned ClassID) const; |
61 | TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const; |
62 | InstructionCost getArithmeticInstrCost( |
63 | unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, |
64 | TTI::OperandValueInfo Op1Info = {.Kind: TTI::OK_AnyValue, .Properties: TTI::OP_None}, |
65 | TTI::OperandValueInfo Op2Info = {.Kind: TTI::OK_AnyValue, .Properties: TTI::OP_None}, |
66 | ArrayRef<const Value *> Args = std::nullopt, |
67 | const Instruction *CxtI = nullptr); |
68 | using BaseT::getVectorInstrCost; |
69 | InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, |
70 | TTI::TargetCostKind CostKind, |
71 | unsigned Index, Value *Op0, Value *Op1); |
72 | |
73 | TTI::ReductionShuffle |
74 | getPreferredExpandedReductionShuffle(const IntrinsicInst *II) const; |
75 | /// @} |
76 | |
77 | bool areInlineCompatible(const Function *Caller, |
78 | const Function *Callee) const; |
79 | |
80 | bool supportsTailCalls() const; |
81 | }; |
82 | |
83 | } // end namespace llvm |
84 | |
85 | #endif |
86 | |