LLVM  4.0.0
HexagonTargetTransformInfo.cpp
Go to the documentation of this file.
1 //===-- HexagonTargetTransformInfo.cpp - Hexagon specific TTI pass --------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 /// \file
9 /// This file implements a TargetTransformInfo analysis pass specific to the
10 /// Hexagon target machine. It uses the target's detailed information to provide
11 /// more precise answers to certain TTI queries, while letting the target
12 /// independent and default TTI implementations handle the rest.
13 ///
14 //===----------------------------------------------------------------------===//
15 
17 #include "llvm/IR/Instructions.h"
18 #include "llvm/Support/Debug.h"
19 
20 using namespace llvm;
21 
22 #define DEBUG_TYPE "hexagontti"
23 
25 HexagonTTIImpl::getPopcntSupport(unsigned IntTyWidthInBit) const {
26  // Return Fast Hardware support as every input < 64 bits will be promoted
27  // to 64 bits.
29 }
30 
31 // The Hexagon target can unroll loops with run-time trip counts.
34  UP.Runtime = UP.Partial = true;
35 }
36 
37 unsigned HexagonTTIImpl::getNumberOfRegisters(bool vector) const {
38  return vector ? 0 : 32;
39 }
40 
42  return getST()->getL1PrefetchDistance();
43 }
44 
46  return getST()->getL1CacheLineSize();
47 }
48 
50  auto isCastFoldedIntoLoad = [] (const CastInst *CI) -> bool {
51  if (!CI->isIntegerCast())
52  return false;
53  const LoadInst *LI = dyn_cast<const LoadInst>(CI->getOperand(0));
54  // Technically, this code could allow multiple uses of the load, and
55  // check if all the uses are the same extension operation, but this
56  // should be sufficient for most cases.
57  if (!LI || !LI->hasOneUse())
58  return false;
59 
60  // Only extensions from an integer type shorter than 32-bit to i32
61  // can be folded into the load.
62  unsigned SBW = CI->getSrcTy()->getIntegerBitWidth();
63  unsigned DBW = CI->getDestTy()->getIntegerBitWidth();
64  return DBW == 32 && (SBW < DBW);
65  };
66 
67  if (const CastInst *CI = dyn_cast<const CastInst>(U))
68  if (isCastFoldedIntoLoad(CI))
70  return BaseT::getUserCost(U);
71 }
MachineLoop * L
bool Partial
Allow partial unrolling (unrolling of loops to expand the size of the loop body, not only to eliminat...
An instruction for reading from memory.
Definition: Instructions.h:164
This is the base class for all instructions that perform data casts.
Definition: InstrTypes.h:578
unsigned getL1CacheLineSize() const
PopcntSupportKind
Flags indicating the kind of support for population count.
This file implements a TargetTransformInfo analysis pass specific to the Hexagon target machine...
Expected to fold away in lowering.
unsigned getL1PrefetchDistance() const
unsigned getNumberOfRegisters(bool vector) const
bool Runtime
Allow runtime unrolling (unrolling of loops to expand the size of the loop body even when the number ...
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP)
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:368
Parameters that control the generic loop unrolling transformation.
bool hasOneUse() const
Return true if there is exactly one user of this value.
Definition: Value.h:383
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:287
TTI::PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const