mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-25 10:27:04 +00:00
Preserve the order of READ_REGISTER and WRITE_REGISTER
At the present time, we don't have a way to represent general dependency relationships, so everything is represented using memory dependency. In order to preserve the data dependency of a READ_REGISTER on WRITE_REGISTER, we need to model WRITE_REGISTER as writing (which we had been doing) and model READ_REGISTER as reading (which we had not been doing). Fix this, and also the way that the chain operands were generated at the SDAG level. Patch by Nicholas Paul Johnson, thanks! Test case by me. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237584 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -4045,16 +4045,20 @@ SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, unsigned Intrinsic) {
|
||||
return nullptr;
|
||||
case Intrinsic::read_register: {
|
||||
Value *Reg = I.getArgOperand(0);
|
||||
SDValue Chain = getRoot();
|
||||
SDValue RegName =
|
||||
DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
|
||||
EVT VT = TLI.getValueType(I.getType());
|
||||
setValue(&I, DAG.getNode(ISD::READ_REGISTER, sdl, VT, RegName));
|
||||
Res = DAG.getNode(ISD::READ_REGISTER, sdl,
|
||||
DAG.getVTList(VT, MVT::Other), Chain, RegName);
|
||||
setValue(&I, Res);
|
||||
DAG.setRoot(Res.getValue(1));
|
||||
return nullptr;
|
||||
}
|
||||
case Intrinsic::write_register: {
|
||||
Value *Reg = I.getArgOperand(0);
|
||||
Value *RegValue = I.getArgOperand(1);
|
||||
SDValue Chain = getValue(RegValue).getOperand(0);
|
||||
SDValue Chain = getRoot();
|
||||
SDValue RegName =
|
||||
DAG.getMDNode(cast<MDNode>(cast<MetadataAsValue>(Reg)->getMetadata()));
|
||||
DAG.setRoot(DAG.getNode(ISD::WRITE_REGISTER, sdl, MVT::Other, Chain,
|
||||
|
||||
@@ -1926,12 +1926,12 @@ SDNode *SelectionDAGISel::Select_INLINEASM(SDNode *N) {
|
||||
SDNode
|
||||
*SelectionDAGISel::Select_READ_REGISTER(SDNode *Op) {
|
||||
SDLoc dl(Op);
|
||||
MDNodeSDNode *MD = dyn_cast<MDNodeSDNode>(Op->getOperand(0));
|
||||
MDNodeSDNode *MD = dyn_cast<MDNodeSDNode>(Op->getOperand(1));
|
||||
const MDString *RegStr = dyn_cast<MDString>(MD->getMD()->getOperand(0));
|
||||
unsigned Reg =
|
||||
TLI->getRegisterByName(RegStr->getString().data(), Op->getValueType(0));
|
||||
SDValue New = CurDAG->getCopyFromReg(
|
||||
CurDAG->getEntryNode(), dl, Reg, Op->getValueType(0));
|
||||
Op->getOperand(0), dl, Reg, Op->getValueType(0));
|
||||
New->setNodeId(-1);
|
||||
return New.getNode();
|
||||
}
|
||||
@@ -1944,7 +1944,7 @@ SDNode
|
||||
unsigned Reg = TLI->getRegisterByName(RegStr->getString().data(),
|
||||
Op->getOperand(2).getValueType());
|
||||
SDValue New = CurDAG->getCopyToReg(
|
||||
CurDAG->getEntryNode(), dl, Reg, Op->getOperand(2));
|
||||
Op->getOperand(0), dl, Reg, Op->getOperand(2));
|
||||
New->setNodeId(-1);
|
||||
return New.getNode();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user