@@ -4123,17 +4123,15 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4123
4123
SDValue Chain = N->getOperand (0 );
4124
4124
SDValue N1 = N->getOperand (1 );
4125
4125
SDValue N2 = N->getOperand (2 );
4126
- SDValue N3 = N->getOperand (3 );
4127
- SDValue InGlue = N->getOperand (4 );
4126
+ SDValue Flags = N->getOperand (3 );
4128
4127
assert (N1.getOpcode () == ISD::BasicBlock);
4129
4128
assert (N2.getOpcode () == ISD::Constant);
4130
- assert (N3.getOpcode () == ISD::Register);
4131
4129
4132
4130
unsigned CC = (unsigned )N2->getAsZExtVal ();
4133
4131
4134
- if (InGlue .getOpcode () == ARMISD::CMPZ) {
4135
- if (InGlue .getOperand (0 ).getOpcode () == ISD::INTRINSIC_W_CHAIN) {
4136
- SDValue Int = InGlue .getOperand (0 );
4132
+ if (Flags .getOpcode () == ARMISD::CMPZ) {
4133
+ if (Flags .getOperand (0 ).getOpcode () == ISD::INTRINSIC_W_CHAIN) {
4134
+ SDValue Int = Flags .getOperand (0 );
4137
4135
uint64_t ID = Int->getConstantOperandVal (1 );
4138
4136
4139
4137
// Handle low-overhead loops.
@@ -4155,15 +4153,15 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4155
4153
4156
4154
ReplaceUses (N, LoopEnd);
4157
4155
CurDAG->RemoveDeadNode (N);
4158
- CurDAG->RemoveDeadNode (InGlue .getNode ());
4156
+ CurDAG->RemoveDeadNode (Flags .getNode ());
4159
4157
CurDAG->RemoveDeadNode (Int.getNode ());
4160
4158
return ;
4161
4159
}
4162
4160
}
4163
4161
4164
4162
bool SwitchEQNEToPLMI;
4165
- SelectCMPZ (InGlue .getNode (), SwitchEQNEToPLMI);
4166
- InGlue = N->getOperand (4 );
4163
+ SelectCMPZ (Flags .getNode (), SwitchEQNEToPLMI);
4164
+ Flags = N->getOperand (3 );
4167
4165
4168
4166
if (SwitchEQNEToPLMI) {
4169
4167
switch ((ARMCC::CondCodes)CC) {
@@ -4178,26 +4176,22 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4178
4176
}
4179
4177
}
4180
4178
4179
+ SDValue InChain =
4180
+ CurDAG->getCopyToReg (Chain, dl, ARM::CPSR, Flags, SDValue ());
4181
+ SDValue InGlue = InChain.getValue (1 );
4182
+
4181
4183
SDValue Tmp2 = CurDAG->getTargetConstant (CC, dl, MVT::i32);
4182
- SDValue Ops[] = { N1, Tmp2, N3, Chain, InGlue };
4183
- SDNode *ResNode = CurDAG->getMachineNode (Opc, dl, MVT::Other,
4184
- MVT::Glue, Ops);
4185
- Chain = SDValue (ResNode, 0 );
4186
- if (N->getNumValues () == 2 ) {
4187
- InGlue = SDValue (ResNode, 1 );
4188
- ReplaceUses (SDValue (N, 1 ), InGlue);
4189
- }
4190
- ReplaceUses (SDValue (N, 0 ),
4191
- SDValue (Chain.getNode (), Chain.getResNo ()));
4192
- CurDAG->RemoveDeadNode (N);
4184
+ SDValue Ops[] = {N1, Tmp2, CurDAG->getRegister (ARM::CPSR, MVT::i32),
4185
+ InChain, InGlue};
4186
+ CurDAG->SelectNodeTo (N, Opc, MVT::Other, Ops);
4193
4187
return ;
4194
4188
}
4195
4189
4196
4190
case ARMISD::CMPZ: {
4197
4191
// select (CMPZ X, #-C) -> (CMPZ (ADDS X, #C), #0)
4198
4192
// This allows us to avoid materializing the expensive negative constant.
4199
- // The CMPZ #0 is useless and will be peepholed away but we need to keep it
4200
- // for its glue output.
4193
+ // The CMPZ #0 is useless and will be peepholed away but we need to keep
4194
+ // it for its flags output.
4201
4195
SDValue X = N->getOperand (0 );
4202
4196
auto *C = dyn_cast<ConstantSDNode>(N->getOperand (1 ).getNode ());
4203
4197
if (C && C->getSExtValue () < 0 && Subtarget->isThumb ()) {
@@ -4224,19 +4218,19 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4224
4218
}
4225
4219
if (Add) {
4226
4220
SDValue Ops2[] = {SDValue (Add, 0 ), CurDAG->getConstant (0 , dl, MVT::i32)};
4227
- CurDAG->MorphNodeTo (N, ARMISD::CMPZ, CurDAG ->getVTList (MVT::Glue ), Ops2);
4221
+ CurDAG->MorphNodeTo (N, ARMISD::CMPZ, N ->getVTList (), Ops2);
4228
4222
}
4229
4223
}
4230
4224
// Other cases are autogenerated.
4231
4225
break ;
4232
4226
}
4233
4227
4234
4228
case ARMISD::CMOV: {
4235
- SDValue InGlue = N->getOperand (4 );
4229
+ SDValue Flags = N->getOperand (3 );
4236
4230
4237
- if (InGlue .getOpcode () == ARMISD::CMPZ) {
4231
+ if (Flags .getOpcode () == ARMISD::CMPZ) {
4238
4232
bool SwitchEQNEToPLMI;
4239
- SelectCMPZ (InGlue .getNode (), SwitchEQNEToPLMI);
4233
+ SelectCMPZ (Flags .getNode (), SwitchEQNEToPLMI);
4240
4234
4241
4235
if (SwitchEQNEToPLMI) {
4242
4236
SDValue ARMcc = N->getOperand (2 );
@@ -4253,10 +4247,9 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4253
4247
}
4254
4248
SDValue NewARMcc = CurDAG->getConstant ((unsigned )CC, dl, MVT::i32);
4255
4249
SDValue Ops[] = {N->getOperand (0 ), N->getOperand (1 ), NewARMcc,
4256
- N->getOperand (3 ), N-> getOperand ( 4 ) };
4250
+ N->getOperand (3 )};
4257
4251
CurDAG->MorphNodeTo (N, ARMISD::CMOV, N->getVTList (), Ops);
4258
4252
}
4259
-
4260
4253
}
4261
4254
// Other cases are autogenerated.
4262
4255
break ;
0 commit comments