forked from OSchip/llvm-project
AMDGPU: Move R600 specific code out of AMDGPUISelLowering.cpp
Reviewers: arsenm Subscribers: jvesely, arsenm, llvm-commits Differential Revision: http://reviews.llvm.org/D19736 llvm-svn: 268267
This commit is contained in:
parent
0ddf404cf4
commit
27233b727f
|
@ -815,45 +815,6 @@ SDValue AMDGPUTargetLowering::LowerGlobalAddress(AMDGPUMachineFunction* MFI,
|
||||||
return DAG.getConstant(Offset, SDLoc(Op),
|
return DAG.getConstant(Offset, SDLoc(Op),
|
||||||
getPointerTy(DL, AMDGPUAS::LOCAL_ADDRESS));
|
getPointerTy(DL, AMDGPUAS::LOCAL_ADDRESS));
|
||||||
}
|
}
|
||||||
case AMDGPUAS::CONSTANT_ADDRESS: {
|
|
||||||
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
|
||||||
Type *EltType = GV->getValueType();
|
|
||||||
unsigned Size = DL.getTypeAllocSize(EltType);
|
|
||||||
unsigned Alignment = DL.getPrefTypeAlignment(EltType);
|
|
||||||
|
|
||||||
MVT PrivPtrVT = getPointerTy(DL, AMDGPUAS::PRIVATE_ADDRESS);
|
|
||||||
MVT ConstPtrVT = getPointerTy(DL, AMDGPUAS::CONSTANT_ADDRESS);
|
|
||||||
|
|
||||||
int FI = FrameInfo->CreateStackObject(Size, Alignment, false);
|
|
||||||
SDValue InitPtr = DAG.getFrameIndex(FI, PrivPtrVT);
|
|
||||||
|
|
||||||
const GlobalVariable *Var = cast<GlobalVariable>(GV);
|
|
||||||
if (!Var->hasInitializer()) {
|
|
||||||
// This has no use, but bugpoint will hit it.
|
|
||||||
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op), ConstPtrVT);
|
|
||||||
}
|
|
||||||
|
|
||||||
const Constant *Init = Var->getInitializer();
|
|
||||||
SmallVector<SDNode*, 8> WorkList;
|
|
||||||
|
|
||||||
for (SDNode::use_iterator I = DAG.getEntryNode()->use_begin(),
|
|
||||||
E = DAG.getEntryNode()->use_end(); I != E; ++I) {
|
|
||||||
if (I->getOpcode() != AMDGPUISD::REGISTER_LOAD && I->getOpcode() != ISD::LOAD)
|
|
||||||
continue;
|
|
||||||
WorkList.push_back(*I);
|
|
||||||
}
|
|
||||||
SDValue Chain = LowerConstantInitializer(Init, GV, InitPtr, DAG.getEntryNode(), DAG);
|
|
||||||
for (SmallVector<SDNode*, 8>::iterator I = WorkList.begin(),
|
|
||||||
E = WorkList.end(); I != E; ++I) {
|
|
||||||
SmallVector<SDValue, 8> Ops;
|
|
||||||
Ops.push_back(Chain);
|
|
||||||
for (unsigned i = 1; i < (*I)->getNumOperands(); ++i) {
|
|
||||||
Ops.push_back((*I)->getOperand(i));
|
|
||||||
}
|
|
||||||
DAG.UpdateNodeOperands(*I, Ops);
|
|
||||||
}
|
|
||||||
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op), ConstPtrVT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Function &Fn = *DAG.getMachineFunction().getFunction();
|
const Function &Fn = *DAG.getMachineFunction().getFunction();
|
||||||
|
|
|
@ -904,6 +904,55 @@ SDValue R600TargetLowering::LowerINSERT_VECTOR_ELT(SDValue Op,
|
||||||
return vectorToVerticalVector(DAG, Insert);
|
return vectorToVerticalVector(DAG, Insert);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDValue R600TargetLowering::LowerGlobalAddress(AMDGPUMachineFunction *MFI,
|
||||||
|
SDValue Op,
|
||||||
|
SelectionDAG &DAG) const {
|
||||||
|
|
||||||
|
GlobalAddressSDNode *GSD = cast<GlobalAddressSDNode>(Op);
|
||||||
|
if (GSD->getAddressSpace() != AMDGPUAS::CONSTANT_ADDRESS)
|
||||||
|
return AMDGPUTargetLowering::LowerGlobalAddress(MFI, Op, DAG);
|
||||||
|
|
||||||
|
const DataLayout &DL = DAG.getDataLayout();
|
||||||
|
const GlobalValue *GV = GSD->getGlobal();
|
||||||
|
MachineFrameInfo *FrameInfo = DAG.getMachineFunction().getFrameInfo();
|
||||||
|
Type *EltType = GV->getValueType();
|
||||||
|
unsigned Size = DL.getTypeAllocSize(EltType);
|
||||||
|
unsigned Alignment = DL.getPrefTypeAlignment(EltType);
|
||||||
|
|
||||||
|
MVT PrivPtrVT = getPointerTy(DL, AMDGPUAS::PRIVATE_ADDRESS);
|
||||||
|
MVT ConstPtrVT = getPointerTy(DL, AMDGPUAS::CONSTANT_ADDRESS);
|
||||||
|
|
||||||
|
int FI = FrameInfo->CreateStackObject(Size, Alignment, false);
|
||||||
|
SDValue InitPtr = DAG.getFrameIndex(FI, PrivPtrVT);
|
||||||
|
|
||||||
|
const GlobalVariable *Var = cast<GlobalVariable>(GV);
|
||||||
|
if (!Var->hasInitializer()) {
|
||||||
|
// This has no use, but bugpoint will hit it.
|
||||||
|
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op), ConstPtrVT);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Constant *Init = Var->getInitializer();
|
||||||
|
SmallVector<SDNode*, 8> WorkList;
|
||||||
|
|
||||||
|
for (SDNode::use_iterator I = DAG.getEntryNode()->use_begin(),
|
||||||
|
E = DAG.getEntryNode()->use_end(); I != E; ++I) {
|
||||||
|
if (I->getOpcode() != AMDGPUISD::REGISTER_LOAD && I->getOpcode() != ISD::LOAD)
|
||||||
|
continue;
|
||||||
|
WorkList.push_back(*I);
|
||||||
|
}
|
||||||
|
SDValue Chain = LowerConstantInitializer(Init, GV, InitPtr, DAG.getEntryNode(), DAG);
|
||||||
|
for (SmallVector<SDNode*, 8>::iterator I = WorkList.begin(),
|
||||||
|
E = WorkList.end(); I != E; ++I) {
|
||||||
|
SmallVector<SDValue, 8> Ops;
|
||||||
|
Ops.push_back(Chain);
|
||||||
|
for (unsigned i = 1; i < (*I)->getNumOperands(); ++i) {
|
||||||
|
Ops.push_back((*I)->getOperand(i));
|
||||||
|
}
|
||||||
|
DAG.UpdateNodeOperands(*I, Ops);
|
||||||
|
}
|
||||||
|
return DAG.getZExtOrTrunc(InitPtr, SDLoc(Op), ConstPtrVT);
|
||||||
|
}
|
||||||
|
|
||||||
SDValue R600TargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
|
SDValue R600TargetLowering::LowerTrig(SDValue Op, SelectionDAG &DAG) const {
|
||||||
// On hw >= R700, COS/SIN input must be between -1. and 1.
|
// On hw >= R700, COS/SIN input must be between -1. and 1.
|
||||||
// Thus we lower them to TRIG ( FRACT ( x / 2Pi + 0.5) - 0.5)
|
// Thus we lower them to TRIG ( FRACT ( x / 2Pi + 0.5) - 0.5)
|
||||||
|
|
|
@ -63,6 +63,8 @@ private:
|
||||||
SDValue lowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
|
SDValue lowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
|
||||||
|
SelectionDAG &DAG) const;
|
||||||
SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
|
||||||
SDValue lowerPrivateTruncStore(StoreSDNode *Store, SelectionDAG &DAG) const;
|
SDValue lowerPrivateTruncStore(StoreSDNode *Store, SelectionDAG &DAG) const;
|
||||||
|
|
Loading…
Reference in New Issue