mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-22 10:29:35 +00:00
Target override to allow CodeGenPrepare to sink address operands to intrinsics in the same way it current does for loads and stores
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152666 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b9153bacd0
commit
f210b68b41
@ -41,6 +41,7 @@ namespace llvm {
|
||||
class FastISel;
|
||||
class FunctionLoweringInfo;
|
||||
class ImmutableCallSite;
|
||||
class IntrinsicInst;
|
||||
class MachineBasicBlock;
|
||||
class MachineFunction;
|
||||
class MachineInstr;
|
||||
@ -1539,6 +1540,17 @@ public:
|
||||
AddrMode() : BaseGV(0), BaseOffs(0), HasBaseReg(false), Scale(0) {}
|
||||
};
|
||||
|
||||
/// GetAddrModeArguments - CodeGenPrepare sinks address calculations into the
|
||||
/// same BB as Load/Store instructions reading the address. This allows as
|
||||
/// much computation as possible to be done in the address mode for that
|
||||
/// operand. This hook lets targets also pass back when this should be done
|
||||
/// on intrinsics which load/store.
|
||||
virtual bool GetAddrModeArguments(IntrinsicInst *I,
|
||||
SmallVectorImpl<Value*> &Ops,
|
||||
Type *&AccessTy) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// isLegalAddressingMode - Return true if the addressing mode represented by
|
||||
/// AM is legal for this target, for a load/store of the specified type.
|
||||
/// The type may be VoidTy, in which case only return true if the addressing
|
||||
|
@ -579,6 +579,15 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (II && TLI) {
|
||||
SmallVector<Value*, 2> PtrOps;
|
||||
Type *AccessTy;
|
||||
if (TLI->GetAddrModeArguments(II, PtrOps, AccessTy))
|
||||
while (!PtrOps.empty())
|
||||
if (OptimizeMemoryInst(II, PtrOps.pop_back_val(), AccessTy))
|
||||
return true;
|
||||
}
|
||||
|
||||
// From here on out we're working with named functions.
|
||||
if (CI->getCalledFunction() == 0) return false;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user