annotate lib/Target/Hexagon/HexagonTargetTransformInfo.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents afa8332a0e37
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===-- HexagonTargetTransformInfo.cpp - Hexagon specific TTI pass --------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 /// \file
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 /// This file implements a TargetTransformInfo analysis pass specific to the
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 /// Hexagon target machine. It uses the target's detailed information to provide
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 /// more precise answers to certain TTI queries, while letting the target
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 /// independent and default TTI implementations handle the rest.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 ///
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 //===----------------------------------------------------------------------===//
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "HexagonTargetTransformInfo.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
17 #include "llvm/IR/Instructions.h"
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 #include "llvm/Support/Debug.h"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 using namespace llvm;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 #define DEBUG_TYPE "hexagontti"
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 TargetTransformInfo::PopcntSupportKind
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 HexagonTTIImpl::getPopcntSupport(unsigned IntTyWidthInBit) const {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 // Return Fast Hardware support as every input < 64 bits will be promoted
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 // to 64 bits.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 return TargetTransformInfo::PSK_FastHardware;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 // The Hexagon target can unroll loops with run-time trip counts.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 void HexagonTTIImpl::getUnrollingPreferences(Loop *L,
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 TTI::UnrollingPreferences &UP) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 UP.Runtime = UP.Partial = true;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 unsigned HexagonTTIImpl::getNumberOfRegisters(bool vector) const {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 return vector ? 0 : 32;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
40
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
41 unsigned HexagonTTIImpl::getPrefetchDistance() const {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
42 return getST()->getL1PrefetchDistance();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
43 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
44
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
45 unsigned HexagonTTIImpl::getCacheLineSize() const {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
46 return getST()->getL1CacheLineSize();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
47 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
48
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
49 int HexagonTTIImpl::getUserCost(const User *U) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
50 auto isCastFoldedIntoLoad = [] (const CastInst *CI) -> bool {
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
51 if (!CI->isIntegerCast())
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
52 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
53 const LoadInst *LI = dyn_cast<const LoadInst>(CI->getOperand(0));
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
54 // Technically, this code could allow multiple uses of the load, and
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
55 // check if all the uses are the same extension operation, but this
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
56 // should be sufficient for most cases.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
57 if (!LI || !LI->hasOneUse())
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
58 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
59
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
60 // Only extensions from an integer type shorter than 32-bit to i32
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
61 // can be folded into the load.
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
62 unsigned SBW = CI->getSrcTy()->getIntegerBitWidth();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
63 unsigned DBW = CI->getDestTy()->getIntegerBitWidth();
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
64 return DBW == 32 && (SBW < DBW);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
65 };
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
66
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
67 if (const CastInst *CI = dyn_cast<const CastInst>(U))
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
68 if (isCastFoldedIntoLoad(CI))
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
69 return TargetTransformInfo::TCC_Free;
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
70 return BaseT::getUserCost(U);
1172e4bd9c6f update 4.0.0
mir3636
parents: 95
diff changeset
71 }