mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-27 16:17:17 +00:00
Make TargetLowering::getPointerTy() taking DataLayout as an argument
Summary: This change is part of a series of commits dedicated to have a single DataLayout during compilation by using always the one owned by the module. Reviewers: echristo Subscribers: jholewinski, ted, yaron.keren, rafael, llvm-commits Differential Revision: http://reviews.llvm.org/D11028 From: Mehdi Amini <mehdi.amini@apple.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241775 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -758,10 +758,11 @@ static bool SinkCast(CastInst *CI) {
|
||||
///
|
||||
/// Return true if any changes are made.
|
||||
///
|
||||
static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI){
|
||||
static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI,
|
||||
const DataLayout &DL) {
|
||||
// If this is a noop copy,
|
||||
EVT SrcVT = TLI.getValueType(CI->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(CI->getType());
|
||||
EVT SrcVT = TLI.getValueType(DL, CI->getOperand(0)->getType());
|
||||
EVT DstVT = TLI.getValueType(DL, CI->getType());
|
||||
|
||||
// This is an fp<->int conversion?
|
||||
if (SrcVT.isInteger() != DstVT.isInteger())
|
||||
@@ -926,7 +927,7 @@ static bool isExtractBitsCandidateUse(Instruction *User) {
|
||||
static bool
|
||||
SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,
|
||||
DenseMap<BasicBlock *, BinaryOperator *> &InsertedShifts,
|
||||
const TargetLowering &TLI) {
|
||||
const TargetLowering &TLI, const DataLayout &DL) {
|
||||
BasicBlock *UserBB = User->getParent();
|
||||
DenseMap<BasicBlock *, CastInst *> InsertedTruncs;
|
||||
TruncInst *TruncI = dyn_cast<TruncInst>(User);
|
||||
@@ -952,7 +953,7 @@ SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,
|
||||
// approximation; some nodes' legality is determined by the
|
||||
// operand or other means. There's no good way to find out though.
|
||||
if (TLI.isOperationLegalOrCustom(
|
||||
ISDOpcode, TLI.getValueType(TruncUser->getType(), true)))
|
||||
ISDOpcode, TLI.getValueType(DL, TruncUser->getType(), true)))
|
||||
continue;
|
||||
|
||||
// Don't bother for PHI nodes.
|
||||
@@ -1010,13 +1011,14 @@ SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,
|
||||
/// instruction.
|
||||
/// Return true if any changes are made.
|
||||
static bool OptimizeExtractBits(BinaryOperator *ShiftI, ConstantInt *CI,
|
||||
const TargetLowering &TLI) {
|
||||
const TargetLowering &TLI,
|
||||
const DataLayout &DL) {
|
||||
BasicBlock *DefBB = ShiftI->getParent();
|
||||
|
||||
/// Only insert instructions in each block once.
|
||||
DenseMap<BasicBlock *, BinaryOperator *> InsertedShifts;
|
||||
|
||||
bool shiftIsLegal = TLI.isTypeLegal(TLI.getValueType(ShiftI->getType()));
|
||||
bool shiftIsLegal = TLI.isTypeLegal(TLI.getValueType(DL, ShiftI->getType()));
|
||||
|
||||
bool MadeChange = false;
|
||||
for (Value::user_iterator UI = ShiftI->user_begin(), E = ShiftI->user_end();
|
||||
@@ -1053,9 +1055,10 @@ static bool OptimizeExtractBits(BinaryOperator *ShiftI, ConstantInt *CI,
|
||||
if (isa<TruncInst>(User) && shiftIsLegal
|
||||
// If the type of the truncate is legal, no trucate will be
|
||||
// introduced in other basic blocks.
|
||||
&& (!TLI.isTypeLegal(TLI.getValueType(User->getType()))))
|
||||
&&
|
||||
(!TLI.isTypeLegal(TLI.getValueType(DL, User->getType()))))
|
||||
MadeChange =
|
||||
SinkShiftAndTruncate(ShiftI, User, CI, InsertedShifts, TLI);
|
||||
SinkShiftAndTruncate(ShiftI, User, CI, InsertedShifts, TLI, DL);
|
||||
|
||||
continue;
|
||||
}
|
||||
@@ -2265,7 +2268,8 @@ static bool MightBeFoldableInst(Instruction *I) {
|
||||
/// \note \p Val is assumed to be the product of some type promotion.
|
||||
/// Therefore if \p Val has an undefined state in \p TLI, this is assumed
|
||||
/// to be legal, as the non-promoted value would have had the same state.
|
||||
static bool isPromotedInstructionLegal(const TargetLowering &TLI, Value *Val) {
|
||||
static bool isPromotedInstructionLegal(const TargetLowering &TLI,
|
||||
const DataLayout &DL, Value *Val) {
|
||||
Instruction *PromotedInst = dyn_cast<Instruction>(Val);
|
||||
if (!PromotedInst)
|
||||
return false;
|
||||
@@ -2275,7 +2279,7 @@ static bool isPromotedInstructionLegal(const TargetLowering &TLI, Value *Val) {
|
||||
return true;
|
||||
// Otherwise, check if the promoted instruction is legal or not.
|
||||
return TLI.isOperationLegalOrCustom(
|
||||
ISDOpcode, TLI.getValueType(PromotedInst->getType()));
|
||||
ISDOpcode, TLI.getValueType(DL, PromotedInst->getType()));
|
||||
}
|
||||
|
||||
/// \brief Hepler class to perform type promotion.
|
||||
@@ -2649,7 +2653,7 @@ bool AddressingModeMatcher::IsPromotionProfitable(
|
||||
// The promotion is neutral but it may help folding the sign extension in
|
||||
// loads for instance.
|
||||
// Check that we did not create an illegal instruction.
|
||||
return isPromotedInstructionLegal(TLI, PromotedOperand);
|
||||
return isPromotedInstructionLegal(TLI, DL, PromotedOperand);
|
||||
}
|
||||
|
||||
/// MatchOperationAddr - Given an instruction or constant expr, see if we can
|
||||
@@ -2677,12 +2681,14 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
|
||||
case Instruction::PtrToInt:
|
||||
// PtrToInt is always a noop, as we know that the int type is pointer sized.
|
||||
return MatchAddr(AddrInst->getOperand(0), Depth);
|
||||
case Instruction::IntToPtr:
|
||||
case Instruction::IntToPtr: {
|
||||
auto AS = AddrInst->getType()->getPointerAddressSpace();
|
||||
auto PtrTy = MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
|
||||
// This inttoptr is a no-op if the integer type is pointer sized.
|
||||
if (TLI.getValueType(AddrInst->getOperand(0)->getType()) ==
|
||||
TLI.getPointerTy(AddrInst->getType()->getPointerAddressSpace()))
|
||||
if (TLI.getValueType(DL, AddrInst->getOperand(0)->getType()) == PtrTy)
|
||||
return MatchAddr(AddrInst->getOperand(0), Depth);
|
||||
return false;
|
||||
}
|
||||
case Instruction::BitCast:
|
||||
// BitCast is always a noop, and we can handle it as long as it is
|
||||
// int->int or pointer->pointer (we don't want int<->fp or something).
|
||||
@@ -3683,7 +3689,7 @@ bool CodeGenPrepare::ExtLdPromotion(TypePromotionTransaction &TPT,
|
||||
TotalCreatedInstsCost -= ExtCost;
|
||||
if (!StressExtLdPromotion &&
|
||||
(TotalCreatedInstsCost > 1 ||
|
||||
!isPromotedInstructionLegal(*TLI, PromotedVal))) {
|
||||
!isPromotedInstructionLegal(*TLI, *DL, PromotedVal))) {
|
||||
// The promotion is not profitable, rollback to the previous state.
|
||||
TPT.rollback(LastKnownGood);
|
||||
continue;
|
||||
@@ -3738,8 +3744,8 @@ bool CodeGenPrepare::MoveExtToFormExtLoad(Instruction *&I) {
|
||||
if (!HasPromoted && LI->getParent() == I->getParent())
|
||||
return false;
|
||||
|
||||
EVT VT = TLI->getValueType(I->getType());
|
||||
EVT LoadVT = TLI->getValueType(LI->getType());
|
||||
EVT VT = TLI->getValueType(*DL, I->getType());
|
||||
EVT LoadVT = TLI->getValueType(*DL, LI->getType());
|
||||
|
||||
// If the load has other users and the truncate is not free, this probably
|
||||
// isn't worthwhile.
|
||||
@@ -4016,6 +4022,9 @@ namespace {
|
||||
/// Assuming both extractelement and store can be combine, we get rid of the
|
||||
/// transition.
|
||||
class VectorPromoteHelper {
|
||||
/// DataLayout associated with the current module.
|
||||
const DataLayout &DL;
|
||||
|
||||
/// Used to perform some checks on the legality of vector operations.
|
||||
const TargetLowering &TLI;
|
||||
|
||||
@@ -4089,7 +4098,8 @@ class VectorPromoteHelper {
|
||||
unsigned Align = ST->getAlignment();
|
||||
// Check if this store is supported.
|
||||
if (!TLI.allowsMisalignedMemoryAccesses(
|
||||
TLI.getValueType(ST->getValueOperand()->getType()), AS, Align)) {
|
||||
TLI.getValueType(DL, ST->getValueOperand()->getType()), AS,
|
||||
Align)) {
|
||||
// If this is not supported, there is no way we can combine
|
||||
// the extract with the store.
|
||||
return false;
|
||||
@@ -4184,9 +4194,10 @@ class VectorPromoteHelper {
|
||||
}
|
||||
|
||||
public:
|
||||
VectorPromoteHelper(const TargetLowering &TLI, const TargetTransformInfo &TTI,
|
||||
Instruction *Transition, unsigned CombineCost)
|
||||
: TLI(TLI), TTI(TTI), Transition(Transition),
|
||||
VectorPromoteHelper(const DataLayout &DL, const TargetLowering &TLI,
|
||||
const TargetTransformInfo &TTI, Instruction *Transition,
|
||||
unsigned CombineCost)
|
||||
: DL(DL), TLI(TLI), TTI(TTI), Transition(Transition),
|
||||
StoreExtractCombineCost(CombineCost), CombineInst(nullptr) {
|
||||
assert(Transition && "Do not know how to promote null");
|
||||
}
|
||||
@@ -4222,7 +4233,7 @@ public:
|
||||
return false;
|
||||
return StressStoreExtract ||
|
||||
TLI.isOperationLegalOrCustom(
|
||||
ISDOpcode, TLI.getValueType(getTransitionType(), true));
|
||||
ISDOpcode, TLI.getValueType(DL, getTransitionType(), true));
|
||||
}
|
||||
|
||||
/// \brief Check whether or not \p Use can be combined
|
||||
@@ -4326,7 +4337,7 @@ bool CodeGenPrepare::OptimizeExtractElementInst(Instruction *Inst) {
|
||||
// we do not do that for now.
|
||||
BasicBlock *Parent = Inst->getParent();
|
||||
DEBUG(dbgs() << "Found an interesting transition: " << *Inst << '\n');
|
||||
VectorPromoteHelper VPH(*TLI, *TTI, Inst, CombineCost);
|
||||
VectorPromoteHelper VPH(*DL, *TLI, *TTI, Inst, CombineCost);
|
||||
// If the transition has more than one use, assume this is not going to be
|
||||
// beneficial.
|
||||
while (Inst->hasOneUse()) {
|
||||
@@ -4390,15 +4401,16 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
|
||||
if (isa<Constant>(CI->getOperand(0)))
|
||||
return false;
|
||||
|
||||
if (TLI && OptimizeNoopCopyExpression(CI, *TLI))
|
||||
if (TLI && OptimizeNoopCopyExpression(CI, *TLI, *DL))
|
||||
return true;
|
||||
|
||||
if (isa<ZExtInst>(I) || isa<SExtInst>(I)) {
|
||||
/// Sink a zext or sext into its user blocks if the target type doesn't
|
||||
/// fit in one register
|
||||
if (TLI && TLI->getTypeAction(CI->getContext(),
|
||||
TLI->getValueType(CI->getType())) ==
|
||||
TargetLowering::TypeExpandInteger) {
|
||||
if (TLI &&
|
||||
TLI->getTypeAction(CI->getContext(),
|
||||
TLI->getValueType(*DL, CI->getType())) ==
|
||||
TargetLowering::TypeExpandInteger) {
|
||||
return SinkCast(CI);
|
||||
} else {
|
||||
bool MadeChange = MoveExtToFormExtLoad(I);
|
||||
@@ -4435,7 +4447,7 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
|
||||
BinOp->getOpcode() == Instruction::LShr)) {
|
||||
ConstantInt *CI = dyn_cast<ConstantInt>(BinOp->getOperand(1));
|
||||
if (TLI && CI && TLI->hasExtractBitsInsn())
|
||||
return OptimizeExtractBits(BinOp, CI, *TLI);
|
||||
return OptimizeExtractBits(BinOp, CI, *TLI, *DL);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
Reference in New Issue
Block a user