mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Add a new pass FunctionTargetTransformInfo. This pass serves as a
shim between the TargetTransformInfo immutable pass and the Subtarget via the TargetMachine and Function. Migrate a single call from BasicTargetTransformInfo as an example and provide shims where TargetMachine begins taking a Function to determine the subtarget. No functional change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218004 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6693d0de3e
commit
757c90dd00
49
include/llvm/Analysis/FunctionTargetTransformInfo.h
Normal file
49
include/llvm/Analysis/FunctionTargetTransformInfo.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
//===- llvm/Analysis/FunctionTargetTransformInfo.h --------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This pass wraps a TargetTransformInfo in a FunctionPass so that it can
|
||||||
|
// forward along the current Function so that we can make target specific
|
||||||
|
// decisions based on the particular subtarget specified for each Function.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_ANALYSIS_FUNCTIONTARGETTRANSFORMINFO_H
|
||||||
|
#define LLVM_ANALYSIS_FUNCTIONTARGETTRANSFORMINFO_H
|
||||||
|
|
||||||
|
#include "llvm/Pass.h"
|
||||||
|
#include "TargetTransformInfo.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
class FunctionTargetTransformInfo final : public FunctionPass {
|
||||||
|
private:
|
||||||
|
const Function *Fn;
|
||||||
|
const TargetTransformInfo *TTI;
|
||||||
|
|
||||||
|
FunctionTargetTransformInfo(const FunctionTargetTransformInfo &)
|
||||||
|
LLVM_DELETED_FUNCTION;
|
||||||
|
void operator=(const FunctionTargetTransformInfo &) LLVM_DELETED_FUNCTION;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static char ID;
|
||||||
|
FunctionTargetTransformInfo();
|
||||||
|
|
||||||
|
// Implementation boilerplate.
|
||||||
|
void getAnalysisUsage(AnalysisUsage &AU) const override;
|
||||||
|
void releaseMemory() override;
|
||||||
|
bool runOnFunction(Function &F) override;
|
||||||
|
|
||||||
|
// Shimmed functions from TargetTransformInfo.
|
||||||
|
void
|
||||||
|
getUnrollingPreferences(Loop *L,
|
||||||
|
TargetTransformInfo::UnrollingPreferences &UP) const {
|
||||||
|
TTI->getUnrollingPreferences(Fn, L, UP);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif
|
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
|
||||||
|
class Function;
|
||||||
class GlobalValue;
|
class GlobalValue;
|
||||||
class Loop;
|
class Loop;
|
||||||
class Type;
|
class Type;
|
||||||
@ -227,7 +228,8 @@ public:
|
|||||||
/// \brief Get target-customized preferences for the generic loop unrolling
|
/// \brief Get target-customized preferences for the generic loop unrolling
|
||||||
/// transformation. The caller will initialize UP with the current
|
/// transformation. The caller will initialize UP with the current
|
||||||
/// target-independent defaults.
|
/// target-independent defaults.
|
||||||
virtual void getUnrollingPreferences(Loop *L, UnrollingPreferences &UP) const;
|
virtual void getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
|
UnrollingPreferences &UP) const;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
|
@ -261,6 +261,7 @@ void initializeTailDuplicatePassPass(PassRegistry&);
|
|||||||
void initializeTargetPassConfigPass(PassRegistry&);
|
void initializeTargetPassConfigPass(PassRegistry&);
|
||||||
void initializeDataLayoutPassPass(PassRegistry &);
|
void initializeDataLayoutPassPass(PassRegistry &);
|
||||||
void initializeTargetTransformInfoAnalysisGroup(PassRegistry&);
|
void initializeTargetTransformInfoAnalysisGroup(PassRegistry&);
|
||||||
|
void initializeFunctionTargetTransformInfoPass(PassRegistry &);
|
||||||
void initializeNoTTIPass(PassRegistry&);
|
void initializeNoTTIPass(PassRegistry&);
|
||||||
void initializeTargetLibraryInfoPass(PassRegistry&);
|
void initializeTargetLibraryInfoPass(PassRegistry&);
|
||||||
void initializeAssumptionTrackerPass(PassRegistry &);
|
void initializeAssumptionTrackerPass(PassRegistry &);
|
||||||
|
@ -99,6 +99,9 @@ public:
|
|||||||
virtual const TargetSubtargetInfo *getSubtargetImpl() const {
|
virtual const TargetSubtargetInfo *getSubtargetImpl() const {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
virtual const TargetSubtargetInfo *getSubtargetImpl(const Function *) const {
|
||||||
|
return getSubtargetImpl();
|
||||||
|
}
|
||||||
|
|
||||||
/// getSubtarget - This method returns a pointer to the specified type of
|
/// getSubtarget - This method returns a pointer to the specified type of
|
||||||
/// TargetSubtargetInfo. In debug builds, it verifies that the object being
|
/// TargetSubtargetInfo. In debug builds, it verifies that the object being
|
||||||
@ -106,6 +109,9 @@ public:
|
|||||||
template<typename STC> const STC &getSubtarget() const {
|
template<typename STC> const STC &getSubtarget() const {
|
||||||
return *static_cast<const STC*>(getSubtargetImpl());
|
return *static_cast<const STC*>(getSubtargetImpl());
|
||||||
}
|
}
|
||||||
|
template <typename STC> const STC &getSubtarget(const Function *) const {
|
||||||
|
return *static_cast<const STC*>(getSubtargetImpl());
|
||||||
|
}
|
||||||
|
|
||||||
/// \brief Reset the target options based on the function's attributes.
|
/// \brief Reset the target options based on the function's attributes.
|
||||||
void resetTargetOptions(const MachineFunction *MF) const;
|
void resetTargetOptions(const MachineFunction *MF) const;
|
||||||
|
50
lib/Analysis/FunctionTargetTransformInfo.cpp
Normal file
50
lib/Analysis/FunctionTargetTransformInfo.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
//===- llvm/Analysis/FunctionTargetTransformInfo.h --------------*- C++ -*-===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This pass wraps a TargetTransformInfo in a FunctionPass so that it can
|
||||||
|
// forward along the current Function so that we can make target specific
|
||||||
|
// decisions based on the particular subtarget specified for each Function.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "llvm/InitializePasses.h"
|
||||||
|
#include "llvm/Analysis/FunctionTargetTransformInfo.h"
|
||||||
|
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
#define DEBUG_TYPE "function-tti"
|
||||||
|
static const char ftti_name[] = "Function TargetTransformInfo";
|
||||||
|
INITIALIZE_PASS_BEGIN(FunctionTargetTransformInfo, "function_tti", ftti_name, false, true)
|
||||||
|
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
||||||
|
INITIALIZE_PASS_END(FunctionTargetTransformInfo, "function_tti", ftti_name, false, true)
|
||||||
|
char FunctionTargetTransformInfo::ID = 0;
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
FunctionPass *createFunctionTargetTransformInfoPass() {
|
||||||
|
return new FunctionTargetTransformInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FunctionTargetTransformInfo::FunctionTargetTransformInfo()
|
||||||
|
: FunctionPass(ID), Fn(nullptr), TTI(nullptr) {
|
||||||
|
initializeFunctionTargetTransformInfoPass(*PassRegistry::getPassRegistry());
|
||||||
|
}
|
||||||
|
|
||||||
|
void FunctionTargetTransformInfo::getAnalysisUsage(AnalysisUsage &AU) const {
|
||||||
|
AU.setPreservesAll();
|
||||||
|
AU.addRequired<TargetTransformInfo>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FunctionTargetTransformInfo::releaseMemory() {}
|
||||||
|
|
||||||
|
bool FunctionTargetTransformInfo::runOnFunction(Function &F) {
|
||||||
|
Fn = &F;
|
||||||
|
TTI = &getAnalysis<TargetTransformInfo>();
|
||||||
|
return false;
|
||||||
|
}
|
@ -87,9 +87,10 @@ bool TargetTransformInfo::isLoweredToCall(const Function *F) const {
|
|||||||
return PrevTTI->isLoweredToCall(F);
|
return PrevTTI->isLoweredToCall(F);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetTransformInfo::getUnrollingPreferences(Loop *L,
|
void
|
||||||
UnrollingPreferences &UP) const {
|
TargetTransformInfo::getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
PrevTTI->getUnrollingPreferences(L, UP);
|
UnrollingPreferences &UP) const {
|
||||||
|
PrevTTI->getUnrollingPreferences(F, L, UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
|
bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
|
||||||
@ -487,8 +488,8 @@ struct NoTTI final : ImmutablePass, TargetTransformInfo {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void getUnrollingPreferences(Loop *, UnrollingPreferences &) const override {
|
void getUnrollingPreferences(const Function *, Loop *,
|
||||||
}
|
UnrollingPreferences &) const override {}
|
||||||
|
|
||||||
bool isLegalAddImmediate(int64_t Imm) const override {
|
bool isLegalAddImmediate(int64_t Imm) const override {
|
||||||
return false;
|
return false;
|
||||||
|
@ -92,7 +92,7 @@ public:
|
|||||||
unsigned getJumpBufSize() const override;
|
unsigned getJumpBufSize() const override;
|
||||||
bool shouldBuildLookupTables() const override;
|
bool shouldBuildLookupTables() const override;
|
||||||
bool haveFastSqrt(Type *Ty) const override;
|
bool haveFastSqrt(Type *Ty) const override;
|
||||||
void getUnrollingPreferences(Loop *L,
|
void getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
UnrollingPreferences &UP) const override;
|
UnrollingPreferences &UP) const override;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
@ -199,7 +199,7 @@ bool BasicTTI::haveFastSqrt(Type *Ty) const {
|
|||||||
return TLI->isTypeLegal(VT) && TLI->isOperationLegalOrCustom(ISD::FSQRT, VT);
|
return TLI->isTypeLegal(VT) && TLI->isOperationLegalOrCustom(ISD::FSQRT, VT);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BasicTTI::getUnrollingPreferences(Loop *L,
|
void BasicTTI::getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
UnrollingPreferences &UP) const {
|
UnrollingPreferences &UP) const {
|
||||||
// This unrolling functionality is target independent, but to provide some
|
// This unrolling functionality is target independent, but to provide some
|
||||||
// motivation for its intended use, for x86:
|
// motivation for its intended use, for x86:
|
||||||
@ -225,7 +225,7 @@ void BasicTTI::getUnrollingPreferences(Loop *L,
|
|||||||
// until someone finds a case where it matters in practice.
|
// until someone finds a case where it matters in practice.
|
||||||
|
|
||||||
unsigned MaxOps;
|
unsigned MaxOps;
|
||||||
const TargetSubtargetInfo *ST = &TM->getSubtarget<TargetSubtargetInfo>();
|
const TargetSubtargetInfo *ST = &TM->getSubtarget<TargetSubtargetInfo>(F);
|
||||||
if (PartialUnrollingThreshold.getNumOccurrences() > 0)
|
if (PartialUnrollingThreshold.getNumOccurrences() > 0)
|
||||||
MaxOps = PartialUnrollingThreshold;
|
MaxOps = PartialUnrollingThreshold;
|
||||||
else if (ST->getSchedModel().LoopMicroOpBufferSize > 0)
|
else if (ST->getSchedModel().LoopMicroOpBufferSize > 0)
|
||||||
|
@ -38,6 +38,7 @@ void initializePPCTTIPass(PassRegistry &);
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
class PPCTTI final : public ImmutablePass, public TargetTransformInfo {
|
class PPCTTI final : public ImmutablePass, public TargetTransformInfo {
|
||||||
|
const TargetMachine *TM;
|
||||||
const PPCSubtarget *ST;
|
const PPCSubtarget *ST;
|
||||||
const PPCTargetLowering *TLI;
|
const PPCTargetLowering *TLI;
|
||||||
|
|
||||||
@ -47,7 +48,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
PPCTTI(const PPCTargetMachine *TM)
|
PPCTTI(const PPCTargetMachine *TM)
|
||||||
: ImmutablePass(ID), ST(TM->getSubtargetImpl()),
|
: ImmutablePass(ID), TM(TM), ST(TM->getSubtargetImpl()),
|
||||||
TLI(TM->getSubtargetImpl()->getTargetLowering()) {
|
TLI(TM->getSubtargetImpl()->getTargetLowering()) {
|
||||||
initializePPCTTIPass(*PassRegistry::getPassRegistry());
|
initializePPCTTIPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
@ -80,8 +81,8 @@ public:
|
|||||||
Type *Ty) const override;
|
Type *Ty) const override;
|
||||||
|
|
||||||
PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override;
|
PopcntSupportKind getPopcntSupport(unsigned TyWidth) const override;
|
||||||
void getUnrollingPreferences(
|
void getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
Loop *L, UnrollingPreferences &UP) const override;
|
UnrollingPreferences &UP) const override;
|
||||||
|
|
||||||
/// @}
|
/// @}
|
||||||
|
|
||||||
@ -269,8 +270,9 @@ unsigned PPCTTI::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
|
|||||||
return PPCTTI::getIntImmCost(Imm, Ty);
|
return PPCTTI::getIntImmCost(Imm, Ty);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PPCTTI::getUnrollingPreferences(Loop *L, UnrollingPreferences &UP) const {
|
void PPCTTI::getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
if (ST->getDarwinDirective() == PPC::DIR_A2) {
|
UnrollingPreferences &UP) const {
|
||||||
|
if (TM->getSubtarget<PPCSubtarget>(F).getDarwinDirective() == PPC::DIR_A2) {
|
||||||
// The A2 is in-order with a deep pipeline, and concatenation unrolling
|
// The A2 is in-order with a deep pipeline, and concatenation unrolling
|
||||||
// helps expose latency-hiding opportunities to the instruction scheduler.
|
// helps expose latency-hiding opportunities to the instruction scheduler.
|
||||||
UP.Partial = UP.Runtime = true;
|
UP.Partial = UP.Runtime = true;
|
||||||
|
@ -74,7 +74,7 @@ public:
|
|||||||
|
|
||||||
bool hasBranchDivergence() const override;
|
bool hasBranchDivergence() const override;
|
||||||
|
|
||||||
void getUnrollingPreferences(Loop *L,
|
void getUnrollingPreferences(const Function *F, Loop *L,
|
||||||
UnrollingPreferences &UP) const override;
|
UnrollingPreferences &UP) const override;
|
||||||
|
|
||||||
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const override;
|
PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const override;
|
||||||
@ -99,7 +99,7 @@ llvm::createAMDGPUTargetTransformInfoPass(const AMDGPUTargetMachine *TM) {
|
|||||||
|
|
||||||
bool AMDGPUTTI::hasBranchDivergence() const { return true; }
|
bool AMDGPUTTI::hasBranchDivergence() const { return true; }
|
||||||
|
|
||||||
void AMDGPUTTI::getUnrollingPreferences(Loop *L,
|
void AMDGPUTTI::getUnrollingPreferences(const Function *, Loop *L,
|
||||||
UnrollingPreferences &UP) const {
|
UnrollingPreferences &UP) const {
|
||||||
UP.Threshold = 300; // Twice the default.
|
UP.Threshold = 300; // Twice the default.
|
||||||
UP.Count = UINT_MAX;
|
UP.Count = UINT_MAX;
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include "llvm/Transforms/Scalar.h"
|
#include "llvm/Transforms/Scalar.h"
|
||||||
#include "llvm/Analysis/AssumptionTracker.h"
|
#include "llvm/Analysis/AssumptionTracker.h"
|
||||||
#include "llvm/Analysis/CodeMetrics.h"
|
#include "llvm/Analysis/CodeMetrics.h"
|
||||||
|
#include "llvm/Analysis/FunctionTargetTransformInfo.h"
|
||||||
#include "llvm/Analysis/LoopPass.h"
|
#include "llvm/Analysis/LoopPass.h"
|
||||||
#include "llvm/Analysis/ScalarEvolution.h"
|
#include "llvm/Analysis/ScalarEvolution.h"
|
||||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||||
@ -113,6 +114,7 @@ namespace {
|
|||||||
AU.addRequired<ScalarEvolution>();
|
AU.addRequired<ScalarEvolution>();
|
||||||
AU.addPreserved<ScalarEvolution>();
|
AU.addPreserved<ScalarEvolution>();
|
||||||
AU.addRequired<TargetTransformInfo>();
|
AU.addRequired<TargetTransformInfo>();
|
||||||
|
AU.addRequired<FunctionTargetTransformInfo>();
|
||||||
// FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.
|
// FIXME: Loop unroll requires LCSSA. And LCSSA requires dom info.
|
||||||
// If loop unroll does not preserve dom info then LCSSA pass on next
|
// If loop unroll does not preserve dom info then LCSSA pass on next
|
||||||
// loop will receive invalid dom info.
|
// loop will receive invalid dom info.
|
||||||
@ -122,7 +124,7 @@ namespace {
|
|||||||
|
|
||||||
// Fill in the UnrollingPreferences parameter with values from the
|
// Fill in the UnrollingPreferences parameter with values from the
|
||||||
// TargetTransformationInfo.
|
// TargetTransformationInfo.
|
||||||
void getUnrollingPreferences(Loop *L, const TargetTransformInfo &TTI,
|
void getUnrollingPreferences(Loop *L, const FunctionTargetTransformInfo &FTTI,
|
||||||
TargetTransformInfo::UnrollingPreferences &UP) {
|
TargetTransformInfo::UnrollingPreferences &UP) {
|
||||||
UP.Threshold = CurrentThreshold;
|
UP.Threshold = CurrentThreshold;
|
||||||
UP.OptSizeThreshold = OptSizeUnrollThreshold;
|
UP.OptSizeThreshold = OptSizeUnrollThreshold;
|
||||||
@ -132,7 +134,7 @@ namespace {
|
|||||||
UP.MaxCount = UINT_MAX;
|
UP.MaxCount = UINT_MAX;
|
||||||
UP.Partial = CurrentAllowPartial;
|
UP.Partial = CurrentAllowPartial;
|
||||||
UP.Runtime = CurrentRuntime;
|
UP.Runtime = CurrentRuntime;
|
||||||
TTI.getUnrollingPreferences(L, UP);
|
FTTI.getUnrollingPreferences(L, UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select and return an unroll count based on parameters from
|
// Select and return an unroll count based on parameters from
|
||||||
@ -185,6 +187,7 @@ char LoopUnroll::ID = 0;
|
|||||||
INITIALIZE_PASS_BEGIN(LoopUnroll, "loop-unroll", "Unroll loops", false, false)
|
INITIALIZE_PASS_BEGIN(LoopUnroll, "loop-unroll", "Unroll loops", false, false)
|
||||||
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(AssumptionTracker)
|
INITIALIZE_PASS_DEPENDENCY(AssumptionTracker)
|
||||||
|
INITIALIZE_PASS_DEPENDENCY(FunctionTargetTransformInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
INITIALIZE_PASS_DEPENDENCY(LoopInfo)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
|
||||||
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
INITIALIZE_PASS_DEPENDENCY(LCSSA)
|
||||||
@ -358,6 +361,8 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||||||
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
LoopInfo *LI = &getAnalysis<LoopInfo>();
|
||||||
ScalarEvolution *SE = &getAnalysis<ScalarEvolution>();
|
ScalarEvolution *SE = &getAnalysis<ScalarEvolution>();
|
||||||
const TargetTransformInfo &TTI = getAnalysis<TargetTransformInfo>();
|
const TargetTransformInfo &TTI = getAnalysis<TargetTransformInfo>();
|
||||||
|
const FunctionTargetTransformInfo &FTTI =
|
||||||
|
getAnalysis<FunctionTargetTransformInfo>();
|
||||||
AssumptionTracker *AT = &getAnalysis<AssumptionTracker>();
|
AssumptionTracker *AT = &getAnalysis<AssumptionTracker>();
|
||||||
|
|
||||||
BasicBlock *Header = L->getHeader();
|
BasicBlock *Header = L->getHeader();
|
||||||
@ -372,7 +377,7 @@ bool LoopUnroll::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||||||
bool HasPragma = PragmaFullUnroll || PragmaCount > 0;
|
bool HasPragma = PragmaFullUnroll || PragmaCount > 0;
|
||||||
|
|
||||||
TargetTransformInfo::UnrollingPreferences UP;
|
TargetTransformInfo::UnrollingPreferences UP;
|
||||||
getUnrollingPreferences(L, TTI, UP);
|
getUnrollingPreferences(L, FTTI, UP);
|
||||||
|
|
||||||
// Find trip count and trip multiple if count is not available
|
// Find trip count and trip multiple if count is not available
|
||||||
unsigned TripCount = 0;
|
unsigned TripCount = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user