mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-19 17:31:55 +00:00
Plumb useAA through TargetTransformInfo to remove Transforms->CodeGen header dependency
Thanks to echristo for the pointers on direction. llvm-svn: 328737
This commit is contained in:
parent
2ce7401505
commit
8ad9a97310
@ -533,6 +533,8 @@ public:
|
||||
/// then/else to before if.
|
||||
bool isProfitableToHoist(Instruction *I) const;
|
||||
|
||||
bool useAA() const;
|
||||
|
||||
/// \brief Return true if this type is legal.
|
||||
bool isTypeLegal(Type *Ty) const;
|
||||
|
||||
@ -1035,6 +1037,7 @@ public:
|
||||
virtual bool LSRWithInstrQueries() = 0;
|
||||
virtual bool isTruncateFree(Type *Ty1, Type *Ty2) = 0;
|
||||
virtual bool isProfitableToHoist(Instruction *I) = 0;
|
||||
virtual bool useAA() = 0;
|
||||
virtual bool isTypeLegal(Type *Ty) = 0;
|
||||
virtual unsigned getJumpBufAlignment() = 0;
|
||||
virtual unsigned getJumpBufSize() = 0;
|
||||
@ -1286,6 +1289,7 @@ public:
|
||||
bool isProfitableToHoist(Instruction *I) override {
|
||||
return Impl.isProfitableToHoist(I);
|
||||
}
|
||||
bool useAA() override { return Impl.useAA(); }
|
||||
bool isTypeLegal(Type *Ty) override { return Impl.isTypeLegal(Ty); }
|
||||
unsigned getJumpBufAlignment() override { return Impl.getJumpBufAlignment(); }
|
||||
unsigned getJumpBufSize() override { return Impl.getJumpBufSize(); }
|
||||
|
@ -279,6 +279,8 @@ public:
|
||||
|
||||
bool isProfitableToHoist(Instruction *I) { return true; }
|
||||
|
||||
bool useAA() { return false; }
|
||||
|
||||
bool isTypeLegal(Type *Ty) { return false; }
|
||||
|
||||
unsigned getJumpBufAlignment() { return 0; }
|
||||
|
@ -207,6 +207,8 @@ public:
|
||||
return getTLI()->isProfitableToHoist(I);
|
||||
}
|
||||
|
||||
bool useAA() const { return getST()->useAA(); }
|
||||
|
||||
bool isTypeLegal(Type *Ty) {
|
||||
EVT VT = getTLI()->getValueType(DL, Ty);
|
||||
return getTLI()->isTypeLegal(VT);
|
||||
|
@ -403,9 +403,7 @@ FunctionPass *createScalarizerPass();
|
||||
//
|
||||
// SeparateConstOffsetFromGEP - Split GEPs for better CSE
|
||||
//
|
||||
FunctionPass *
|
||||
createSeparateConstOffsetFromGEPPass(const TargetMachine *TM = nullptr,
|
||||
bool LowerGEP = false);
|
||||
FunctionPass *createSeparateConstOffsetFromGEPPass(bool LowerGEP = false);
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
|
@ -215,6 +215,8 @@ bool TargetTransformInfo::isProfitableToHoist(Instruction *I) const {
|
||||
return TTIImpl->isProfitableToHoist(I);
|
||||
}
|
||||
|
||||
bool TargetTransformInfo::useAA() const { return TTIImpl->useAA(); }
|
||||
|
||||
bool TargetTransformInfo::isTypeLegal(Type *Ty) const {
|
||||
return TTIImpl->isTypeLegal(Ty);
|
||||
}
|
||||
|
@ -4314,8 +4314,7 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
|
||||
if (SunkAddr->getType() != Addr->getType())
|
||||
SunkAddr = Builder.CreatePointerCast(SunkAddr, Addr->getType());
|
||||
} else if (AddrSinkUsingGEPs ||
|
||||
(!AddrSinkUsingGEPs.getNumOccurrences() && TM &&
|
||||
SubtargetInfo->useAA())) {
|
||||
(!AddrSinkUsingGEPs.getNumOccurrences() && TM && TTI->useAA())) {
|
||||
// By default, we use the GEP-based method when AA is used later. This
|
||||
// prevents new inttoptr/ptrtoint pairs from degrading AA capabilities.
|
||||
DEBUG(dbgs() << "CGP: SINKING nonlocal addrmode: " << AddrMode << " for "
|
||||
|
@ -389,7 +389,7 @@ void AArch64PassConfig::addIRPasses() {
|
||||
// Call SeparateConstOffsetFromGEP pass to extract constants within indices
|
||||
// and lower a GEP with multiple indices to either arithmetic operations or
|
||||
// multiple GEPs with single index.
|
||||
addPass(createSeparateConstOffsetFromGEPPass(TM, true));
|
||||
addPass(createSeparateConstOffsetFromGEPPass(true));
|
||||
// Call EarlyCSE pass to find and remove subexpressions in the lowered
|
||||
// result.
|
||||
addPass(createEarlyCSEPass());
|
||||
|
@ -343,7 +343,7 @@ void PPCPassConfig::addIRPasses() {
|
||||
// Call SeparateConstOffsetFromGEP pass to extract constants within indices
|
||||
// and lower a GEP with multiple indices to either arithmetic operations or
|
||||
// multiple GEPs with single index.
|
||||
addPass(createSeparateConstOffsetFromGEPPass(TM, true));
|
||||
addPass(createSeparateConstOffsetFromGEPPass(true));
|
||||
// Call EarlyCSE pass to find and remove subexpressions in the lowered
|
||||
// result.
|
||||
addPass(createEarlyCSEPass());
|
||||
|
@ -167,7 +167,6 @@
|
||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||
#include "llvm/Analysis/Utils/Local.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
@ -347,9 +346,8 @@ class SeparateConstOffsetFromGEP : public FunctionPass {
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
SeparateConstOffsetFromGEP(const TargetMachine *TM = nullptr,
|
||||
bool LowerGEP = false)
|
||||
: FunctionPass(ID), TM(TM), LowerGEP(LowerGEP) {
|
||||
SeparateConstOffsetFromGEP(bool LowerGEP = false)
|
||||
: FunctionPass(ID), LowerGEP(LowerGEP) {
|
||||
initializeSeparateConstOffsetFromGEPPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
@ -450,7 +448,6 @@ private:
|
||||
const DataLayout *DL = nullptr;
|
||||
DominatorTree *DT = nullptr;
|
||||
ScalarEvolution *SE;
|
||||
const TargetMachine *TM;
|
||||
|
||||
LoopInfo *LI;
|
||||
TargetLibraryInfo *TLI;
|
||||
@ -480,10 +477,8 @@ INITIALIZE_PASS_END(
|
||||
"Split GEPs to a variadic base and a constant offset for better CSE", false,
|
||||
false)
|
||||
|
||||
FunctionPass *
|
||||
llvm::createSeparateConstOffsetFromGEPPass(const TargetMachine *TM,
|
||||
bool LowerGEP) {
|
||||
return new SeparateConstOffsetFromGEP(TM, LowerGEP);
|
||||
FunctionPass *llvm::createSeparateConstOffsetFromGEPPass(bool LowerGEP) {
|
||||
return new SeparateConstOffsetFromGEP(LowerGEP);
|
||||
}
|
||||
|
||||
bool ConstantOffsetExtractor::CanTraceInto(bool SignExtended,
|
||||
@ -943,6 +938,10 @@ bool SeparateConstOffsetFromGEP::splitGEP(GetElementPtrInst *GEP) {
|
||||
|
||||
if (!NeedsExtraction)
|
||||
return Changed;
|
||||
|
||||
TargetTransformInfo &TTI =
|
||||
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(*GEP->getFunction());
|
||||
|
||||
// If LowerGEP is disabled, before really splitting the GEP, check whether the
|
||||
// backend supports the addressing mode we are about to produce. If no, this
|
||||
// splitting probably won't be beneficial.
|
||||
@ -951,9 +950,6 @@ bool SeparateConstOffsetFromGEP::splitGEP(GetElementPtrInst *GEP) {
|
||||
// of variable indices. Therefore, we don't check for addressing modes in that
|
||||
// case.
|
||||
if (!LowerGEP) {
|
||||
TargetTransformInfo &TTI =
|
||||
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
|
||||
*GEP->getParent()->getParent());
|
||||
unsigned AddrSpace = GEP->getPointerAddressSpace();
|
||||
if (!TTI.isLegalAddressingMode(GEP->getResultElementType(),
|
||||
/*BaseGV=*/nullptr, AccumulativeByteOffset,
|
||||
@ -1016,7 +1012,7 @@ bool SeparateConstOffsetFromGEP::splitGEP(GetElementPtrInst *GEP) {
|
||||
if (LowerGEP) {
|
||||
// As currently BasicAA does not analyze ptrtoint/inttoptr, do not lower to
|
||||
// arithmetic operations if the target uses alias analysis in codegen.
|
||||
if (TM && TM->getSubtargetImpl(*GEP->getParent()->getParent())->useAA())
|
||||
if (TTI.useAA())
|
||||
lowerToSingleIndexGEPs(GEP, AccumulativeByteOffset);
|
||||
else
|
||||
lowerToArithmetics(GEP, AccumulativeByteOffset);
|
||||
|
Loading…
x
Reference in New Issue
Block a user