@@ -81,12 +81,11 @@ static unsigned countOperands(SDNode *Node, unsigned NumExpUses,
81
81
82
82
// / EmitCopyFromReg - Generate machine code for an CopyFromReg node or an
83
83
// / implicit physical register output.
84
- void InstrEmitter::EmitCopyFromReg (SDNode *Node, unsigned ResNo, bool IsClone ,
85
- Register SrcReg, VRBaseMapType &VRBaseMap) {
84
+ void InstrEmitter::EmitCopyFromReg (SDValue Op, bool IsClone, Register SrcReg ,
85
+ VRBaseMapType &VRBaseMap) {
86
86
Register VRBase;
87
87
if (SrcReg.isVirtual ()) {
88
88
// Just use the input register directly!
89
- SDValue Op (Node, ResNo);
90
89
if (IsClone)
91
90
VRBaseMap.erase (Op);
92
91
bool isNew = VRBaseMap.insert (std::make_pair (Op, SrcReg)).second ;
@@ -99,17 +98,15 @@ void InstrEmitter::EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone,
99
98
// the CopyToReg'd destination register instead of creating a new vreg.
100
99
bool MatchReg = true ;
101
100
const TargetRegisterClass *UseRC = nullptr ;
102
- MVT VT = Node-> getSimpleValueType (ResNo );
101
+ MVT VT = Op. getSimpleValueType ();
103
102
104
103
// Stick to the preferred register classes for legal types.
105
104
if (TLI->isTypeLegal (VT))
106
- UseRC = TLI->getRegClassFor (VT, Node ->isDivergent ());
105
+ UseRC = TLI->getRegClassFor (VT, Op ->isDivergent ());
107
106
108
- for (SDNode *User : Node ->users ()) {
107
+ for (SDNode *User : Op ->users ()) {
109
108
bool Match = true ;
110
- if (User->getOpcode () == ISD::CopyToReg &&
111
- User->getOperand (2 ).getNode () == Node &&
112
- User->getOperand (2 ).getResNo () == ResNo) {
109
+ if (User->getOpcode () == ISD::CopyToReg && User->getOperand (2 ) == Op) {
113
110
Register DestReg = cast<RegisterSDNode>(User->getOperand (1 ))->getReg ();
114
111
if (DestReg.isVirtual ()) {
115
112
VRBase = DestReg;
@@ -118,10 +115,8 @@ void InstrEmitter::EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone,
118
115
Match = false ;
119
116
} else {
120
117
for (unsigned i = 0 , e = User->getNumOperands (); i != e; ++i) {
121
- SDValue Op = User->getOperand (i);
122
- if (Op.getNode () != Node || Op.getResNo () != ResNo)
118
+ if (User->getOperand (i) != Op)
123
119
continue ;
124
- MVT VT = Node->getSimpleValueType (Op.getResNo ());
125
120
if (VT == MVT::Other || VT == MVT::Glue)
126
121
continue ;
127
122
Match = false ;
@@ -170,11 +165,11 @@ void InstrEmitter::EmitCopyFromReg(SDNode *Node, unsigned ResNo, bool IsClone,
170
165
} else {
171
166
// Create the reg, emit the copy.
172
167
VRBase = MRI->createVirtualRegister (DstRC);
173
- BuildMI (*MBB, InsertPos, Node->getDebugLoc (), TII->get (TargetOpcode::COPY),
174
- VRBase).addReg (SrcReg);
168
+ BuildMI (*MBB, InsertPos, Op.getDebugLoc (), TII->get (TargetOpcode::COPY),
169
+ VRBase)
170
+ .addReg (SrcReg);
175
171
}
176
172
177
- SDValue Op (Node, ResNo);
178
173
if (IsClone)
179
174
VRBaseMap.erase (Op);
180
175
bool isNew = VRBaseMap.insert (std::make_pair (Op, VRBase)).second ;
@@ -1170,7 +1165,7 @@ EmitMachineNode(SDNode *Node, bool IsClone, bool IsCloned,
1170
1165
continue ;
1171
1166
// This implicitly defined physreg has a use.
1172
1167
UsedRegs.push_back (Reg);
1173
- EmitCopyFromReg (Node, i, IsClone, Reg, VRBaseMap);
1168
+ EmitCopyFromReg (SDValue ( Node, i) , IsClone, Reg, VRBaseMap);
1174
1169
}
1175
1170
}
1176
1171
@@ -1283,7 +1278,7 @@ EmitSpecialNode(SDNode *Node, bool IsClone, bool IsCloned,
1283
1278
}
1284
1279
case ISD::CopyFromReg: {
1285
1280
Register SrcReg = cast<RegisterSDNode>(Node->getOperand (1 ))->getReg ();
1286
- EmitCopyFromReg (Node, 0 , IsClone, SrcReg, VRBaseMap);
1281
+ EmitCopyFromReg (SDValue ( Node, 0 ) , IsClone, SrcReg, VRBaseMap);
1287
1282
break ;
1288
1283
}
1289
1284
case ISD::EH_LABEL:
0 commit comments