@@ -164,6 +164,9 @@ static cl::opt<bool> UseFEATCPACodegen(
164164/// Value type used for condition codes.
165165static const MVT MVT_CC = MVT::i32;
166166
167+ /// Value type used for NZCV flags.
168+ static constexpr MVT FlagsVT = MVT::i32;
169+
167170static const MCPhysReg GPRArgRegs[] = {AArch64::X0, AArch64::X1, AArch64::X2,
168171 AArch64::X3, AArch64::X4, AArch64::X5,
169172 AArch64::X6, AArch64::X7};
@@ -3451,7 +3454,7 @@ static SDValue emitStrictFPComparison(SDValue LHS, SDValue RHS, const SDLoc &DL,
34513454 }
34523455 unsigned Opcode =
34533456 IsSignaling ? AArch64ISD::STRICT_FCMPE : AArch64ISD::STRICT_FCMP;
3454- return DAG.getNode(Opcode, DL, {MVT::i32 , MVT::Other}, {Chain, LHS, RHS});
3457+ return DAG.getNode(Opcode, DL, {FlagsVT , MVT::Other}, {Chain, LHS, RHS});
34553458}
34563459
34573460static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
@@ -3465,7 +3468,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
34653468 LHS = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, LHS);
34663469 RHS = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, RHS);
34673470 }
3468- return DAG.getNode(AArch64ISD::FCMP, DL, MVT::i32 , LHS, RHS);
3471+ return DAG.getNode(AArch64ISD::FCMP, DL, FlagsVT , LHS, RHS);
34693472 }
34703473
34713474 // The CMP instruction is just an alias for SUBS, and representing it as
@@ -3490,7 +3493,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
34903493 // (a.k.a. ANDS) except that the flags are only guaranteed to work for one
34913494 // of the signed comparisons.
34923495 const SDValue ANDSNode =
3493- DAG.getNode(AArch64ISD::ANDS, DL, DAG.getVTList(VT, MVT_CC ),
3496+ DAG.getNode(AArch64ISD::ANDS, DL, DAG.getVTList(VT, FlagsVT ),
34943497 LHS.getOperand(0), LHS.getOperand(1));
34953498 // Replace all users of (and X, Y) with newly generated (ands X, Y)
34963499 DAG.ReplaceAllUsesWith(LHS, ANDSNode);
@@ -3501,7 +3504,7 @@ static SDValue emitComparison(SDValue LHS, SDValue RHS, ISD::CondCode CC,
35013504 }
35023505 }
35033506
3504- return DAG.getNode(Opcode, DL, DAG.getVTList(VT, MVT_CC ), LHS, RHS)
3507+ return DAG.getNode(Opcode, DL, DAG.getVTList(VT, FlagsVT ), LHS, RHS)
35053508 .getValue(1);
35063509}
35073510
@@ -3597,7 +3600,7 @@ static SDValue emitConditionalComparison(SDValue LHS, SDValue RHS,
35973600 AArch64CC::CondCode InvOutCC = AArch64CC::getInvertedCondCode(OutCC);
35983601 unsigned NZCV = AArch64CC::getNZCVToSatisfyCondCode(InvOutCC);
35993602 SDValue NZCVOp = DAG.getConstant(NZCV, DL, MVT::i32);
3600- return DAG.getNode(Opcode, DL, MVT_CC , LHS, RHS, NZCVOp, Condition, CCOp);
3603+ return DAG.getNode(Opcode, DL, FlagsVT , LHS, RHS, NZCVOp, Condition, CCOp);
36013604}
36023605
36033606/// Returns true if @p Val is a tree of AND/OR/SETCC operations that can be
@@ -4036,7 +4039,7 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
40364039 Value = DAG.getNode(ISD::TRUNCATE, DL, MVT::i32, Mul);
40374040
40384041 // Check that the result fits into a 32-bit integer.
4039- SDVTList VTs = DAG.getVTList(MVT::i64, MVT_CC );
4042+ SDVTList VTs = DAG.getVTList(MVT::i64, FlagsVT );
40404043 if (IsSigned) {
40414044 // cmp xreg, wreg, sxtw
40424045 SDValue SExtMul = DAG.getNode(ISD::SIGN_EXTEND, DL, MVT::i64, Value);
@@ -4059,12 +4062,12 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
40594062 DAG.getConstant(63, DL, MVT::i64));
40604063 // It is important that LowerBits is last, otherwise the arithmetic
40614064 // shift will not be folded into the compare (SUBS).
4062- SDVTList VTs = DAG.getVTList(MVT::i64, MVT::i32 );
4065+ SDVTList VTs = DAG.getVTList(MVT::i64, FlagsVT );
40634066 Overflow = DAG.getNode(AArch64ISD::SUBS, DL, VTs, UpperBits, LowerBits)
40644067 .getValue(1);
40654068 } else {
40664069 SDValue UpperBits = DAG.getNode(ISD::MULHU, DL, MVT::i64, LHS, RHS);
4067- SDVTList VTs = DAG.getVTList(MVT::i64, MVT::i32 );
4070+ SDVTList VTs = DAG.getVTList(MVT::i64, FlagsVT );
40684071 Overflow =
40694072 DAG.getNode(AArch64ISD::SUBS, DL, VTs,
40704073 DAG.getConstant(0, DL, MVT::i64),
@@ -4075,7 +4078,7 @@ getAArch64XALUOOp(AArch64CC::CondCode &CC, SDValue Op, SelectionDAG &DAG) {
40754078 } // switch (...)
40764079
40774080 if (Opc) {
4078- SDVTList VTs = DAG.getVTList(Op->getValueType(0), MVT::i32 );
4081+ SDVTList VTs = DAG.getVTList(Op->getValueType(0), FlagsVT );
40794082
40804083 // Emit the AArch64 operation with overflow check.
40814084 Value = DAG.getNode(Opc, DL, VTs, LHS, RHS);
@@ -4177,7 +4180,7 @@ static SDValue valueToCarryFlag(SDValue Value, SelectionDAG &DAG, bool Invert) {
41774180 SDValue Op0 = Invert ? DAG.getConstant(0, DL, VT) : Value;
41784181 SDValue Op1 = Invert ? Value : DAG.getConstant(1, DL, VT);
41794182 SDValue Cmp =
4180- DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, MVT::Glue ), Op0, Op1);
4183+ DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, FlagsVT ), Op0, Op1);
41814184 return Cmp.getValue(1);
41824185}
41834186
@@ -4222,7 +4225,7 @@ static SDValue lowerADDSUBO_CARRY(SDValue Op, SelectionDAG &DAG,
42224225 SDLoc DL(Op);
42234226 SDVTList VTs = DAG.getVTList(VT0, VT1);
42244227
4225- SDValue Sum = DAG.getNode(Opcode, DL, DAG.getVTList(VT0, MVT::Glue ), OpLHS,
4228+ SDValue Sum = DAG.getNode(Opcode, DL, DAG.getVTList(VT0, FlagsVT ), OpLHS,
42264229 OpRHS, OpCarryIn);
42274230
42284231 SDValue OutFlag =
@@ -7037,9 +7040,8 @@ SDValue AArch64TargetLowering::LowerABS(SDValue Op, SelectionDAG &DAG) const {
70377040 SDValue Neg = DAG.getNode(ISD::SUB, DL, VT, DAG.getConstant(0, DL, VT),
70387041 Op.getOperand(0));
70397042 // Generate SUBS & CSEL.
7040- SDValue Cmp =
7041- DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, MVT::i32),
7042- Op.getOperand(0), DAG.getConstant(0, DL, VT));
7043+ SDValue Cmp = DAG.getNode(AArch64ISD::SUBS, DL, DAG.getVTList(VT, FlagsVT),
7044+ Op.getOperand(0), DAG.getConstant(0, DL, VT));
70437045 return DAG.getNode(AArch64ISD::CSEL, DL, VT, Op.getOperand(0), Neg,
70447046 DAG.getConstant(AArch64CC::PL, DL, MVT::i32),
70457047 Cmp.getValue(1));
@@ -11108,7 +11110,7 @@ SDValue AArch64TargetLowering::LowerSETCCCARRY(SDValue Op,
1110811110 SDValue Carry = Op.getOperand(2);
1110911111 // SBCS uses a carry not a borrow so the carry flag should be inverted first.
1111011112 SDValue InvCarry = valueToCarryFlag(Carry, DAG, true);
11111- SDValue Cmp = DAG.getNode(AArch64ISD::SBCS, DL, DAG.getVTList(VT, MVT::Glue ),
11113+ SDValue Cmp = DAG.getNode(AArch64ISD::SBCS, DL, DAG.getVTList(VT, FlagsVT ),
1111211114 LHS, RHS, InvCarry);
1111311115
1111411116 EVT OpVT = Op.getValueType();
@@ -12441,10 +12443,10 @@ SDValue AArch64TargetLowering::LowerAsmOutputForConstraint(
1244112443
1244212444 // Get NZCV register. Only update chain when copyfrom is glued.
1244312445 if (Glue.getNode()) {
12444- Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, MVT::i32 , Glue);
12446+ Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, FlagsVT , Glue);
1244512447 Chain = Glue.getValue(1);
1244612448 } else
12447- Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, MVT::i32 );
12449+ Glue = DAG.getCopyFromReg(Chain, DL, AArch64::NZCV, FlagsVT );
1244812450 // Extract CC code.
1244912451 SDValue CC = getSETCC(Cond, Glue, DL, DAG);
1245012452
@@ -18593,7 +18595,7 @@ AArch64TargetLowering::BuildSREMPow2(SDNode *N, const APInt &Divisor,
1859318595 Created.push_back(And.getNode());
1859418596 } else {
1859518597 SDValue CCVal = DAG.getConstant(AArch64CC::MI, DL, MVT_CC);
18596- SDVTList VTs = DAG.getVTList(VT, MVT::i32 );
18598+ SDVTList VTs = DAG.getVTList(VT, FlagsVT );
1859718599
1859818600 SDValue Negs = DAG.getNode(AArch64ISD::SUBS, DL, VTs, Zero, N0);
1859918601 SDValue AndPos = DAG.getNode(ISD::AND, DL, VT, N0, Pow2MinusOne);
@@ -19482,10 +19484,10 @@ static SDValue performANDORCSELCombine(SDNode *N, SelectionDAG &DAG) {
1948219484 // can select to CCMN to avoid the extra mov
1948319485 SDValue AbsOp1 =
1948419486 DAG.getConstant(Op1->getAPIntValue().abs(), DL, Op1->getValueType(0));
19485- CCmp = DAG.getNode(AArch64ISD::CCMN, DL, MVT_CC , Cmp1.getOperand(0), AbsOp1 ,
19486- NZCVOp, Condition, Cmp0);
19487+ CCmp = DAG.getNode(AArch64ISD::CCMN, DL, FlagsVT , Cmp1.getOperand(0),
19488+ AbsOp1, NZCVOp, Condition, Cmp0);
1948719489 } else {
19488- CCmp = DAG.getNode(AArch64ISD::CCMP, DL, MVT_CC , Cmp1.getOperand(0),
19490+ CCmp = DAG.getNode(AArch64ISD::CCMP, DL, FlagsVT , Cmp1.getOperand(0),
1948919491 Cmp1.getOperand(1), NZCVOp, Condition, Cmp0);
1949019492 }
1949119493 return DAG.getNode(AArch64ISD::CSEL, DL, VT, CSel0.getOperand(0),
@@ -25134,8 +25136,9 @@ static SDValue reassociateCSELOperandsForCSE(SDNode *N, SelectionDAG &DAG) {
2513425136 if (!TReassocOp && !FReassocOp)
2513525137 return SDValue();
2513625138
25137- SDValue NewCmp = DAG.getNode(AArch64ISD::SUBS, SDLoc(SubsNode),
25138- DAG.getVTList(VT, MVT_CC), CmpOpOther, SubsOp);
25139+ SDValue NewCmp =
25140+ DAG.getNode(AArch64ISD::SUBS, SDLoc(SubsNode),
25141+ DAG.getVTList(VT, FlagsVT), CmpOpOther, SubsOp);
2513925142
2514025143 auto Reassociate = [&](SDValue ReassocOp, unsigned OpNum) {
2514125144 if (!ReassocOp)
@@ -27161,7 +27164,7 @@ SDValue AArch64TargetLowering::PerformDAGCombine(SDNode *N,
2716127164 : AArch64SysReg::RNDRRS);
2716227165 SDLoc DL(N);
2716327166 SDValue A = DAG.getNode(
27164- AArch64ISD::MRS, DL, DAG.getVTList(MVT::i64, MVT::i32 , MVT::Other),
27167+ AArch64ISD::MRS, DL, DAG.getVTList(MVT::i64, FlagsVT , MVT::Other),
2716527168 N->getOperand(0), DAG.getConstant(Register, DL, MVT::i32));
2716627169 SDValue B = DAG.getNode(
2716727170 AArch64ISD::CSINC, DL, MVT::i32, DAG.getConstant(0, DL, MVT::i32),
0 commit comments