mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
[SelectionDAG] Refactor lowering of atomic memory intrinsics.
Summary: This just refactors the lowering of the atomic memory intrinsics to more closely match the code patterns used in the lowering of the non-atomic memory intrinsics. Specifically, we encapsulate the lowering in SelectionDAG::getAtomicMem*() functions rather than embedding the code directly in the SelectionDAGBuilder code. llvm-svn: 330603
This commit is contained in:
parent
44ea8a8a00
commit
90b8483e64
@ -917,6 +917,23 @@ public:
|
||||
SDValue Size, unsigned Align, bool isVol, bool isTailCall,
|
||||
MachinePointerInfo DstPtrInfo);
|
||||
|
||||
SDValue getAtomicMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
unsigned DstAlign, SDValue Src, unsigned SrcAlign,
|
||||
SDValue Size, Type *SizeTy, unsigned ElemSz,
|
||||
bool isTailCall, MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo);
|
||||
|
||||
SDValue getAtomicMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
unsigned DstAlign, SDValue Src, unsigned SrcAlign,
|
||||
SDValue Size, Type *SizeTy, unsigned ElemSz,
|
||||
bool isTailCall, MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo);
|
||||
|
||||
SDValue getAtomicMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
unsigned DstAlign, SDValue Value, SDValue Size,
|
||||
Type *SizeTy, unsigned ElemSz, bool isTailCall,
|
||||
MachinePointerInfo DstPtrInfo);
|
||||
|
||||
/// Helper function to make it easier to build SetCC's if you just
|
||||
/// have an ISD::CondCode instead of an SDValue.
|
||||
///
|
||||
|
@ -5630,6 +5630,47 @@ SDValue SelectionDAG::getMemcpy(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getAtomicMemcpy(SDValue Chain, const SDLoc &dl,
|
||||
SDValue Dst, unsigned DstAlign,
|
||||
SDValue Src, unsigned SrcAlign,
|
||||
SDValue Size, Type *SizeTy,
|
||||
unsigned ElemSz, bool isTailCall,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) {
|
||||
// Emit a library call.
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Ty = getDataLayout().getIntPtrType(*getContext());
|
||||
Entry.Node = Dst;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Node = Src;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = SizeTy;
|
||||
Entry.Node = Size;
|
||||
Args.push_back(Entry);
|
||||
|
||||
RTLIB::Libcall LibraryCall =
|
||||
RTLIB::getMEMCPY_ELEMENT_UNORDERED_ATOMIC(ElemSz);
|
||||
if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(LibraryCall),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
std::move(Args))
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
SDValue Src, SDValue Size, unsigned Align,
|
||||
bool isVol, bool isTailCall,
|
||||
@ -5691,6 +5732,47 @@ SDValue SelectionDAG::getMemmove(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getAtomicMemmove(SDValue Chain, const SDLoc &dl,
|
||||
SDValue Dst, unsigned DstAlign,
|
||||
SDValue Src, unsigned SrcAlign,
|
||||
SDValue Size, Type *SizeTy,
|
||||
unsigned ElemSz, bool isTailCall,
|
||||
MachinePointerInfo DstPtrInfo,
|
||||
MachinePointerInfo SrcPtrInfo) {
|
||||
// Emit a library call.
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Ty = getDataLayout().getIntPtrType(*getContext());
|
||||
Entry.Node = Dst;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Node = Src;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = SizeTy;
|
||||
Entry.Node = Size;
|
||||
Args.push_back(Entry);
|
||||
|
||||
RTLIB::Libcall LibraryCall =
|
||||
RTLIB::getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(ElemSz);
|
||||
if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(LibraryCall),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
std::move(Args))
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
SDValue Src, SDValue Size, unsigned Align,
|
||||
bool isVol, bool isTailCall,
|
||||
@ -5753,6 +5835,46 @@ SDValue SelectionDAG::getMemset(SDValue Chain, const SDLoc &dl, SDValue Dst,
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getAtomicMemset(SDValue Chain, const SDLoc &dl,
|
||||
SDValue Dst, unsigned DstAlign,
|
||||
SDValue Value, SDValue Size, Type *SizeTy,
|
||||
unsigned ElemSz, bool isTailCall,
|
||||
MachinePointerInfo DstPtrInfo) {
|
||||
// Emit a library call.
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Ty = getDataLayout().getIntPtrType(*getContext());
|
||||
Entry.Node = Dst;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = Type::getInt8Ty(*getContext());
|
||||
Entry.Node = Value;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = SizeTy;
|
||||
Entry.Node = Size;
|
||||
Args.push_back(Entry);
|
||||
|
||||
RTLIB::Libcall LibraryCall =
|
||||
RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(ElemSz);
|
||||
if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(*this);
|
||||
CLI.setDebugLoc(dl)
|
||||
.setChain(Chain)
|
||||
.setLibCallee(TLI->getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*getContext()),
|
||||
getExternalSymbol(TLI->getLibcallName(LibraryCall),
|
||||
TLI->getPointerTy(getDataLayout())),
|
||||
std::move(Args))
|
||||
.setDiscardResult()
|
||||
.setTailCall(isTailCall);
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI->LowerCallTo(CLI);
|
||||
return CallResult.second;
|
||||
}
|
||||
|
||||
SDValue SelectionDAG::getAtomic(unsigned Opcode, const SDLoc &dl, EVT MemVT,
|
||||
SDVTList VTList, ArrayRef<SDValue> Ops,
|
||||
MachineMemOperand *MMO) {
|
||||
|
@ -5098,36 +5098,16 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
SDValue Src = getValue(MI.getRawSource());
|
||||
SDValue Length = getValue(MI.getLength());
|
||||
|
||||
// Emit a library call.
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
|
||||
Entry.Node = Dst;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Node = Src;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = MI.getLength()->getType();
|
||||
Entry.Node = Length;
|
||||
Args.push_back(Entry);
|
||||
|
||||
uint64_t ElementSizeConstant = MI.getElementSizeInBytes();
|
||||
RTLIB::Libcall LibraryCall =
|
||||
RTLIB::getMEMCPY_ELEMENT_UNORDERED_ATOMIC(ElementSizeConstant);
|
||||
if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
|
||||
TLI.getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(TLI.getLibcallName(LibraryCall),
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args));
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
DAG.setRoot(CallResult.second);
|
||||
unsigned DstAlign = MI.getDestAlignment();
|
||||
unsigned SrcAlign = MI.getSourceAlignment();
|
||||
Type *LengthTy = MI.getLength()->getType();
|
||||
unsigned ElemSz = MI.getElementSizeInBytes();
|
||||
bool isTC = I.isTailCall() && isInTailCallPosition(&I, DAG.getTarget());
|
||||
SDValue MC = DAG.getAtomicMemcpy(getRoot(), sdl, Dst, DstAlign, Src,
|
||||
SrcAlign, Length, LengthTy, ElemSz, isTC,
|
||||
MachinePointerInfo(MI.getRawDest()),
|
||||
MachinePointerInfo(MI.getRawSource()));
|
||||
updateDAGForMaybeTailCall(MC);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::memmove_element_unordered_atomic: {
|
||||
@ -5136,36 +5116,16 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
SDValue Src = getValue(MI.getRawSource());
|
||||
SDValue Length = getValue(MI.getLength());
|
||||
|
||||
// Emit a library call.
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
|
||||
Entry.Node = Dst;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Node = Src;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = MI.getLength()->getType();
|
||||
Entry.Node = Length;
|
||||
Args.push_back(Entry);
|
||||
|
||||
uint64_t ElementSizeConstant = MI.getElementSizeInBytes();
|
||||
RTLIB::Libcall LibraryCall =
|
||||
RTLIB::getMEMMOVE_ELEMENT_UNORDERED_ATOMIC(ElementSizeConstant);
|
||||
if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
|
||||
TLI.getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(TLI.getLibcallName(LibraryCall),
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args));
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
DAG.setRoot(CallResult.second);
|
||||
unsigned DstAlign = MI.getDestAlignment();
|
||||
unsigned SrcAlign = MI.getSourceAlignment();
|
||||
Type *LengthTy = MI.getLength()->getType();
|
||||
unsigned ElemSz = MI.getElementSizeInBytes();
|
||||
bool isTC = I.isTailCall() && isInTailCallPosition(&I, DAG.getTarget());
|
||||
SDValue MC = DAG.getAtomicMemmove(getRoot(), sdl, Dst, DstAlign, Src,
|
||||
SrcAlign, Length, LengthTy, ElemSz, isTC,
|
||||
MachinePointerInfo(MI.getRawDest()),
|
||||
MachinePointerInfo(MI.getRawSource()));
|
||||
updateDAGForMaybeTailCall(MC);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::memset_element_unordered_atomic: {
|
||||
@ -5174,37 +5134,14 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
SDValue Val = getValue(MI.getValue());
|
||||
SDValue Length = getValue(MI.getLength());
|
||||
|
||||
// Emit a library call.
|
||||
TargetLowering::ArgListTy Args;
|
||||
TargetLowering::ArgListEntry Entry;
|
||||
Entry.Ty = DAG.getDataLayout().getIntPtrType(*DAG.getContext());
|
||||
Entry.Node = Dst;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = Type::getInt8Ty(*DAG.getContext());
|
||||
Entry.Node = Val;
|
||||
Args.push_back(Entry);
|
||||
|
||||
Entry.Ty = MI.getLength()->getType();
|
||||
Entry.Node = Length;
|
||||
Args.push_back(Entry);
|
||||
|
||||
uint64_t ElementSizeConstant = MI.getElementSizeInBytes();
|
||||
RTLIB::Libcall LibraryCall =
|
||||
RTLIB::getMEMSET_ELEMENT_UNORDERED_ATOMIC(ElementSizeConstant);
|
||||
if (LibraryCall == RTLIB::UNKNOWN_LIBCALL)
|
||||
report_fatal_error("Unsupported element size");
|
||||
|
||||
TargetLowering::CallLoweringInfo CLI(DAG);
|
||||
CLI.setDebugLoc(sdl).setChain(getRoot()).setLibCallee(
|
||||
TLI.getLibcallCallingConv(LibraryCall),
|
||||
Type::getVoidTy(*DAG.getContext()),
|
||||
DAG.getExternalSymbol(TLI.getLibcallName(LibraryCall),
|
||||
TLI.getPointerTy(DAG.getDataLayout())),
|
||||
std::move(Args));
|
||||
|
||||
std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI);
|
||||
DAG.setRoot(CallResult.second);
|
||||
unsigned DstAlign = MI.getDestAlignment();
|
||||
Type *LengthTy = MI.getLength()->getType();
|
||||
unsigned ElemSz = MI.getElementSizeInBytes();
|
||||
bool isTC = I.isTailCall() && isInTailCallPosition(&I, DAG.getTarget());
|
||||
SDValue MC = DAG.getAtomicMemset(getRoot(), sdl, Dst, DstAlign, Val, Length,
|
||||
LengthTy, ElemSz, isTC,
|
||||
MachinePointerInfo(MI.getRawDest()));
|
||||
updateDAGForMaybeTailCall(MC);
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::dbg_addr:
|
||||
|
Loading…
Reference in New Issue
Block a user