@@ -111,13 +111,6 @@ class ARMDAGToDAGISel : public SelectionDAGISel {
111
111
bool SelectAddrModeImm12 (SDValue N, SDValue &Base, SDValue &OffImm);
112
112
bool SelectLdStSOReg (SDValue N, SDValue &Base, SDValue &Offset, SDValue &Opc);
113
113
114
- bool SelectCMOVPred (SDValue N, SDValue &Pred, SDValue &Reg) {
115
- const ConstantSDNode *CN = cast<ConstantSDNode>(N);
116
- Pred = CurDAG->getTargetConstant (CN->getZExtValue (), SDLoc (N), MVT::i32);
117
- Reg = CurDAG->getRegister (ARM::CPSR, MVT::i32);
118
- return true ;
119
- }
120
-
121
114
bool SelectAddrMode2OffsetReg (SDNode *Op, SDValue N,
122
115
SDValue &Offset, SDValue &Opc);
123
116
bool SelectAddrMode2OffsetImm (SDNode *Op, SDValue N,
@@ -4123,17 +4116,15 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4123
4116
SDValue Chain = N->getOperand (0 );
4124
4117
SDValue N1 = N->getOperand (1 );
4125
4118
SDValue N2 = N->getOperand (2 );
4126
- SDValue N3 = N->getOperand (3 );
4127
- SDValue InGlue = N->getOperand (4 );
4119
+ SDValue Flags = N->getOperand (3 );
4128
4120
assert (N1.getOpcode () == ISD::BasicBlock);
4129
4121
assert (N2.getOpcode () == ISD::Constant);
4130
- assert (N3.getOpcode () == ISD::Register);
4131
4122
4132
4123
unsigned CC = (unsigned )N2->getAsZExtVal ();
4133
4124
4134
- if (InGlue .getOpcode () == ARMISD::CMPZ) {
4135
- if (InGlue .getOperand (0 ).getOpcode () == ISD::INTRINSIC_W_CHAIN) {
4136
- SDValue Int = InGlue .getOperand (0 );
4125
+ if (Flags .getOpcode () == ARMISD::CMPZ) {
4126
+ if (Flags .getOperand (0 ).getOpcode () == ISD::INTRINSIC_W_CHAIN) {
4127
+ SDValue Int = Flags .getOperand (0 );
4137
4128
uint64_t ID = Int->getConstantOperandVal (1 );
4138
4129
4139
4130
// Handle low-overhead loops.
@@ -4155,15 +4146,15 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4155
4146
4156
4147
ReplaceUses (N, LoopEnd);
4157
4148
CurDAG->RemoveDeadNode (N);
4158
- CurDAG->RemoveDeadNode (InGlue .getNode ());
4149
+ CurDAG->RemoveDeadNode (Flags .getNode ());
4159
4150
CurDAG->RemoveDeadNode (Int.getNode ());
4160
4151
return ;
4161
4152
}
4162
4153
}
4163
4154
4164
4155
bool SwitchEQNEToPLMI;
4165
- SelectCMPZ (InGlue .getNode (), SwitchEQNEToPLMI);
4166
- InGlue = N->getOperand (4 );
4156
+ SelectCMPZ (Flags .getNode (), SwitchEQNEToPLMI);
4157
+ Flags = N->getOperand (3 );
4167
4158
4168
4159
if (SwitchEQNEToPLMI) {
4169
4160
switch ((ARMCC::CondCodes)CC) {
@@ -4179,25 +4170,18 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4179
4170
}
4180
4171
4181
4172
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);
4173
+ Chain = CurDAG->getCopyToReg (Chain, dl, ARM::CPSR, Flags, SDValue ());
4174
+ SDValue Ops[] = {N1, Tmp2, CurDAG->getRegister (ARM::CPSR, MVT::i32), Chain,
4175
+ Chain.getValue (1 )};
4176
+ CurDAG->SelectNodeTo (N, Opc, MVT::Other, Ops);
4193
4177
return ;
4194
4178
}
4195
4179
4196
4180
case ARMISD::CMPZ: {
4197
4181
// select (CMPZ X, #-C) -> (CMPZ (ADDS X, #C), #0)
4198
4182
// 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.
4183
+ // The CMPZ #0 is useless and will be peepholed away but we need to keep
4184
+ // it for its flags output.
4201
4185
SDValue X = N->getOperand (0 );
4202
4186
auto *C = dyn_cast<ConstantSDNode>(N->getOperand (1 ).getNode ());
4203
4187
if (C && C->getSExtValue () < 0 && Subtarget->isThumb ()) {
@@ -4224,19 +4208,19 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4224
4208
}
4225
4209
if (Add) {
4226
4210
SDValue Ops2[] = {SDValue (Add, 0 ), CurDAG->getConstant (0 , dl, MVT::i32)};
4227
- CurDAG->MorphNodeTo (N, ARMISD::CMPZ, CurDAG ->getVTList (MVT::Glue ), Ops2);
4211
+ CurDAG->MorphNodeTo (N, ARMISD::CMPZ, N ->getVTList (), Ops2);
4228
4212
}
4229
4213
}
4230
4214
// Other cases are autogenerated.
4231
4215
break ;
4232
4216
}
4233
4217
4234
4218
case ARMISD::CMOV: {
4235
- SDValue InGlue = N->getOperand (4 );
4219
+ SDValue Flags = N->getOperand (3 );
4236
4220
4237
- if (InGlue .getOpcode () == ARMISD::CMPZ) {
4221
+ if (Flags .getOpcode () == ARMISD::CMPZ) {
4238
4222
bool SwitchEQNEToPLMI;
4239
- SelectCMPZ (InGlue .getNode (), SwitchEQNEToPLMI);
4223
+ SelectCMPZ (Flags .getNode (), SwitchEQNEToPLMI);
4240
4224
4241
4225
if (SwitchEQNEToPLMI) {
4242
4226
SDValue ARMcc = N->getOperand (2 );
@@ -4253,10 +4237,9 @@ void ARMDAGToDAGISel::Select(SDNode *N) {
4253
4237
}
4254
4238
SDValue NewARMcc = CurDAG->getConstant ((unsigned )CC, dl, MVT::i32);
4255
4239
SDValue Ops[] = {N->getOperand (0 ), N->getOperand (1 ), NewARMcc,
4256
- N->getOperand (3 ), N-> getOperand ( 4 ) };
4240
+ N->getOperand (3 )};
4257
4241
CurDAG->MorphNodeTo (N, ARMISD::CMOV, N->getVTList (), Ops);
4258
4242
}
4259
-
4260
4243
}
4261
4244
// Other cases are autogenerated.
4262
4245
break ;
0 commit comments