@@ -445,6 +445,9 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
445445 addRegisterClass(MVT::nxv8i1, &AArch64::PPRRegClass);
446446 addRegisterClass(MVT::nxv16i1, &AArch64::PPRRegClass);
447447
448+ // Add sve predicate as counter type
449+ addRegisterClass(MVT::aarch64svcount, &AArch64::PPRRegClass);
450+
448451 // Add legal sve data types
449452 addRegisterClass(MVT::nxv16i8, &AArch64::ZPRRegClass);
450453 addRegisterClass(MVT::nxv8i16, &AArch64::ZPRRegClass);
@@ -473,15 +476,6 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
473476 }
474477 }
475478
476- if (Subtarget->hasSVE2p1() || Subtarget->hasSME2()) {
477- addRegisterClass(MVT::aarch64svcount, &AArch64::PPRRegClass);
478- setOperationPromotedToType(ISD::LOAD, MVT::aarch64svcount, MVT::nxv16i1);
479- setOperationPromotedToType(ISD::STORE, MVT::aarch64svcount, MVT::nxv16i1);
480-
481- setOperationAction(ISD::SELECT, MVT::aarch64svcount, Custom);
482- setOperationAction(ISD::SELECT_CC, MVT::aarch64svcount, Expand);
483- }
484-
485479 // Compute derived properties from the register classes
486480 computeRegisterProperties(Subtarget->getRegisterInfo());
487481
@@ -1609,6 +1603,14 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
16091603 MVT::nxv4i16, MVT::nxv4i32, MVT::nxv8i8, MVT::nxv8i16 })
16101604 setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Legal);
16111605
1606+ // Promote predicate as counter load/stores to standard predicates.
1607+ setOperationPromotedToType(ISD::LOAD, MVT::aarch64svcount, MVT::nxv16i1);
1608+ setOperationPromotedToType(ISD::STORE, MVT::aarch64svcount, MVT::nxv16i1);
1609+
1610+ // Predicate as counter legalization actions.
1611+ setOperationAction(ISD::SELECT, MVT::aarch64svcount, Custom);
1612+ setOperationAction(ISD::SELECT_CC, MVT::aarch64svcount, Expand);
1613+
16121614 for (auto VT :
16131615 {MVT::nxv16i1, MVT::nxv8i1, MVT::nxv4i1, MVT::nxv2i1, MVT::nxv1i1}) {
16141616 setOperationAction(ISD::CONCAT_VECTORS, VT, Custom);
0 commit comments