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.getParent()->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 getUnrollingPreferences(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 = {TTI::OK_AnyValue, TTI::OP_None}, 65 TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None}, 66 ArrayRef<const Value *> Args = ArrayRef<const Value *>(), 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 /// @} 74 75 bool areInlineCompatible(const Function *Caller, 76 const Function *Callee) const; 77 78 bool supportsTailCalls() const; 79 }; 80 81 } // end namespace llvm 82 83 #endif 84