mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-01 15:21:00 +00:00
[Alignment][NFC] Migrate SelectionDAGTargetInfo::EmitTargetCodeForMemcpy to Align
This patch is part of a series to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Differential Revision: https://reviews.llvm.org/D82849
This commit is contained in:
parent
b2f3277e56
commit
ced6ab5db1
@ -51,7 +51,7 @@ public:
|
||||
virtual SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Op1,
|
||||
SDValue Op2, SDValue Op3,
|
||||
unsigned Align, bool isVolatile,
|
||||
Align Alignment, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const {
|
||||
|
@ -6411,8 +6411,8 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
// code. If the target chooses to do this, this is the next best.
|
||||
if (TSI) {
|
||||
SDValue Result = TSI->EmitTargetCodeForMemcpy(
|
||||
*this, dl, Chain, Dst, Src, Size, Alignment.value(), isVol,
|
||||
AlwaysInline, DstPtrInfo, SrcPtrInfo);
|
||||
*this, dl, Chain, Dst, Src, Size, Alignment, isVol, AlwaysInline,
|
||||
DstPtrInfo, SrcPtrInfo);
|
||||
if (Result.getNode())
|
||||
return Result;
|
||||
}
|
||||
|
@ -126,24 +126,24 @@ SDValue ARMSelectionDAGInfo::EmitSpecializedLibcall(
|
||||
|
||||
SDValue ARMSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
const ARMSubtarget &Subtarget =
|
||||
DAG.getMachineFunction().getSubtarget<ARMSubtarget>();
|
||||
// Do repeated 4-byte loads and stores. To be improved.
|
||||
// This requires 4-byte alignment.
|
||||
if ((Align & 3) != 0)
|
||||
if (Alignment < Align(4))
|
||||
return SDValue();
|
||||
// This requires the copy size to be a constant, preferably
|
||||
// within a subtarget-specific limit.
|
||||
ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
|
||||
if (!ConstantSize)
|
||||
return EmitSpecializedLibcall(DAG, dl, Chain, Dst, Src, Size, Align,
|
||||
RTLIB::MEMCPY);
|
||||
return EmitSpecializedLibcall(DAG, dl, Chain, Dst, Src, Size,
|
||||
Alignment.value(), RTLIB::MEMCPY);
|
||||
uint64_t SizeVal = ConstantSize->getZExtValue();
|
||||
if (!AlwaysInline && SizeVal > Subtarget.getMaxInlineSizeThreshold())
|
||||
return EmitSpecializedLibcall(DAG, dl, Chain, Dst, Src, Size, Align,
|
||||
RTLIB::MEMCPY);
|
||||
return EmitSpecializedLibcall(DAG, dl, Chain, Dst, Src, Size,
|
||||
Alignment.value(), RTLIB::MEMCPY);
|
||||
|
||||
unsigned BytesLeft = SizeVal & 3;
|
||||
unsigned NumMemOps = SizeVal >> 2;
|
||||
|
@ -39,8 +39,8 @@ class ARMSelectionDAGInfo : public SelectionDAGTargetInfo {
|
||||
public:
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
SDValue Size, Align Alignment,
|
||||
bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
|
||||
|
@ -19,7 +19,7 @@ using namespace llvm;
|
||||
|
||||
SDValue BPFSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
// Requires the copy size to be a constant.
|
||||
ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
|
||||
@ -27,7 +27,7 @@ SDValue BPFSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
return SDValue();
|
||||
|
||||
unsigned CopyLen = ConstantSize->getZExtValue();
|
||||
unsigned StoresNumEstimate = alignTo(CopyLen, Align) >> Log2_32(Align);
|
||||
unsigned StoresNumEstimate = alignTo(CopyLen, Alignment) >> Log2(Alignment);
|
||||
// Impose the same copy length limit as MaxStoresPerMemcpy.
|
||||
if (StoresNumEstimate > getCommonMaxStoresPerMemFunc())
|
||||
return SDValue();
|
||||
@ -36,7 +36,7 @@ SDValue BPFSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
|
||||
Dst = DAG.getNode(BPFISD::MEMCPY, dl, VTs, Chain, Dst, Src,
|
||||
DAG.getConstant(CopyLen, dl, MVT::i64),
|
||||
DAG.getConstant(Align, dl, MVT::i64));
|
||||
DAG.getConstant(Alignment.value(), dl, MVT::i64));
|
||||
|
||||
return Dst.getValue(0);
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ class BPFSelectionDAGInfo : public SelectionDAGTargetInfo {
|
||||
public:
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
SDValue Size, Align Alignment,
|
||||
bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
|
||||
|
@ -18,10 +18,10 @@ using namespace llvm;
|
||||
|
||||
SDValue HexagonSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size);
|
||||
if (AlwaysInline || (Align & 0x3) != 0 || !ConstantSize)
|
||||
if (AlwaysInline || Alignment < Align(4) || !ConstantSize)
|
||||
return SDValue();
|
||||
|
||||
uint64_t SizeVal = ConstantSize->getZExtValue();
|
||||
|
@ -23,8 +23,8 @@ public:
|
||||
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
SDValue Size, Align Alignment,
|
||||
bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
};
|
||||
|
@ -20,7 +20,7 @@ namespace llvm {
|
||||
|
||||
SDValue LanaiSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG & /*DAG*/, const SDLoc & /*dl*/, SDValue /*Chain*/,
|
||||
SDValue /*Dst*/, SDValue /*Src*/, SDValue Size, unsigned /*Align*/,
|
||||
SDValue /*Dst*/, SDValue /*Src*/, SDValue Size, Align /*Alignment*/,
|
||||
bool /*isVolatile*/, bool /*AlwaysInline*/,
|
||||
MachinePointerInfo /*DstPtrInfo*/,
|
||||
MachinePointerInfo /*SrcPtrInfo*/) const {
|
||||
|
@ -24,8 +24,8 @@ public:
|
||||
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
SDValue Size, Align Alignment,
|
||||
bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
};
|
||||
|
@ -47,7 +47,7 @@ static SDValue emitMemMem(SelectionDAG &DAG, const SDLoc &DL, unsigned Sequence,
|
||||
|
||||
SDValue SystemZSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool IsVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool IsVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
if (IsVolatile)
|
||||
return SDValue();
|
||||
|
@ -25,8 +25,8 @@ public:
|
||||
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &DL,
|
||||
SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool IsVolatile,
|
||||
bool AlwaysInline,
|
||||
SDValue Size, Align Alignment,
|
||||
bool IsVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
|
||||
|
@ -20,7 +20,7 @@ WebAssemblySelectionDAGInfo::~WebAssemblySelectionDAGInfo() = default; // anchor
|
||||
|
||||
SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool IsVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool IsVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
if (!DAG.getMachineFunction()
|
||||
.getSubtarget<WebAssemblySubtarget>()
|
||||
@ -38,7 +38,7 @@ SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemmove(
|
||||
SDValue Op3, Align Alignment, bool IsVolatile,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
return EmitTargetCodeForMemcpy(DAG, DL, Chain, Op1, Op2, Op3,
|
||||
Alignment.value(), IsVolatile, false,
|
||||
Alignment, IsVolatile, false,
|
||||
DstPtrInfo, SrcPtrInfo);
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,7 @@ public:
|
||||
~WebAssemblySelectionDAGInfo() override;
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Op1, SDValue Op2,
|
||||
SDValue Op3, unsigned Align, bool isVolatile,
|
||||
SDValue Op3, Align Alignment, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
|
@ -290,7 +290,7 @@ static SDValue emitConstantSizeRepmov(
|
||||
|
||||
SDValue X86SelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
// If to a segment-relative address space, use the default lowering.
|
||||
if (DstPtrInfo.getAddrSpace() >= 256 || SrcPtrInfo.getAddrSpace() >= 256)
|
||||
@ -308,10 +308,10 @@ SDValue X86SelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
|
||||
/// Handle constant sizes,
|
||||
if (ConstantSDNode *ConstantSize = dyn_cast<ConstantSDNode>(Size))
|
||||
return emitConstantSizeRepmov(DAG, Subtarget, dl, Chain, Dst, Src,
|
||||
ConstantSize->getZExtValue(),
|
||||
Size.getValueType(), Align, isVolatile,
|
||||
AlwaysInline, DstPtrInfo, SrcPtrInfo);
|
||||
return emitConstantSizeRepmov(
|
||||
DAG, Subtarget, dl, Chain, Dst, Src, ConstantSize->getZExtValue(),
|
||||
Size.getValueType(), Alignment.value(), isVolatile, AlwaysInline,
|
||||
DstPtrInfo, SrcPtrInfo);
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
@ -34,8 +34,8 @@ public:
|
||||
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
SDValue Size, Align Alignment,
|
||||
bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
};
|
||||
|
@ -17,11 +17,11 @@ using namespace llvm;
|
||||
|
||||
SDValue XCoreSelectionDAGInfo::EmitTargetCodeForMemcpy(
|
||||
SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
|
||||
SDValue Size, unsigned Align, bool isVolatile, bool AlwaysInline,
|
||||
SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
|
||||
unsigned SizeBitWidth = Size.getValueSizeInBits();
|
||||
// Call __memcpy_4 if the src, dst and size are all 4 byte aligned.
|
||||
if (!AlwaysInline && (Align & 3) == 0 &&
|
||||
if (!AlwaysInline && Alignment >= Align(4) &&
|
||||
DAG.MaskedValueIsZero(Size, APInt(SizeBitWidth, 3))) {
|
||||
const TargetLowering &TLI = *DAG.getSubtarget().getTargetLowering();
|
||||
TargetLowering::ArgListTy Args;
|
||||
|
@ -21,7 +21,7 @@ class XCoreSelectionDAGInfo : public SelectionDAGTargetInfo {
|
||||
public:
|
||||
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl,
|
||||
SDValue Chain, SDValue Op1, SDValue Op2,
|
||||
SDValue Op3, unsigned Align, bool isVolatile,
|
||||
SDValue Op3, Align Alignment, bool isVolatile,
|
||||
bool AlwaysInline,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) const override;
|
||||
|
Loading…
Reference in New Issue
Block a user