@@ -808,16 +808,14 @@ void applyScalarizeVectorUnmerge(MachineInstr &MI, MachineRegisterInfo &MRI,
808808
809809bool matchBuildVectorToDup (MachineInstr &MI, MachineRegisterInfo &MRI) {
810810 assert (MI.getOpcode () == TargetOpcode::G_BUILD_VECTOR);
811- auto Splat = getAArch64VectorSplat (MI, MRI);
812- if (!Splat)
813- return false ;
814- if (Splat->isReg ())
815- return true ;
811+
816812 // Later, during selection, we'll try to match imported patterns using
817813 // immAllOnesV and immAllZerosV. These require G_BUILD_VECTOR. Don't lower
818814 // G_BUILD_VECTORs which could match those patterns.
819- int64_t Cst = Splat->getCst ();
820- return (Cst != 0 && Cst != -1 );
815+ if (isBuildVectorAllZeros (MI, MRI) || isBuildVectorAllOnes (MI, MRI))
816+ return false ;
817+
818+ return getAArch64VectorSplat (MI, MRI).has_value ();
821819}
822820
823821void applyBuildVectorToDup (MachineInstr &MI, MachineRegisterInfo &MRI,
@@ -933,58 +931,40 @@ void applySwapICmpOperands(MachineInstr &MI, GISelChangeObserver &Observer) {
933931
934932// / \returns a function which builds a vector floating point compare instruction
935933// / for a condition code \p CC.
936- // / \param [in] IsZero - True if the comparison is against 0.
937934// / \param [in] NoNans - True if the target has NoNansFPMath.
938935std::function<Register(MachineIRBuilder &)>
939- getVectorFCMP (AArch64CC::CondCode CC, Register LHS, Register RHS, bool IsZero ,
940- bool NoNans, MachineRegisterInfo &MRI) {
936+ getVectorFCMP (AArch64CC::CondCode CC, Register LHS, Register RHS, bool NoNans ,
937+ MachineRegisterInfo &MRI) {
941938 LLT DstTy = MRI.getType (LHS);
942939 assert (DstTy.isVector () && " Expected vector types only?" );
943940 assert (DstTy == MRI.getType (RHS) && " Src and Dst types must match!" );
944941 switch (CC) {
945942 default :
946943 llvm_unreachable (" Unexpected condition code!" );
947944 case AArch64CC::NE:
948- return [LHS, RHS, IsZero, DstTy](MachineIRBuilder &MIB) {
949- auto FCmp = IsZero
950- ? MIB.buildInstr (AArch64::G_FCMEQZ, {DstTy}, {LHS})
951- : MIB.buildInstr (AArch64::G_FCMEQ, {DstTy}, {LHS, RHS});
945+ return [LHS, RHS, DstTy](MachineIRBuilder &MIB) {
946+ auto FCmp = MIB.buildInstr (AArch64::G_FCMEQ, {DstTy}, {LHS, RHS});
952947 return MIB.buildNot (DstTy, FCmp).getReg (0 );
953948 };
954949 case AArch64CC::EQ:
955- return [LHS, RHS, IsZero, DstTy](MachineIRBuilder &MIB) {
956- return IsZero
957- ? MIB.buildInstr (AArch64::G_FCMEQZ, {DstTy}, {LHS}).getReg (0 )
958- : MIB.buildInstr (AArch64::G_FCMEQ, {DstTy}, {LHS, RHS})
959- .getReg (0 );
950+ return [LHS, RHS, DstTy](MachineIRBuilder &MIB) {
951+ return MIB.buildInstr (AArch64::G_FCMEQ, {DstTy}, {LHS, RHS}).getReg (0 );
960952 };
961953 case AArch64CC::GE:
962- return [LHS, RHS, IsZero, DstTy](MachineIRBuilder &MIB) {
963- return IsZero
964- ? MIB.buildInstr (AArch64::G_FCMGEZ, {DstTy}, {LHS}).getReg (0 )
965- : MIB.buildInstr (AArch64::G_FCMGE, {DstTy}, {LHS, RHS})
966- .getReg (0 );
954+ return [LHS, RHS, DstTy](MachineIRBuilder &MIB) {
955+ return MIB.buildInstr (AArch64::G_FCMGE, {DstTy}, {LHS, RHS}).getReg (0 );
967956 };
968957 case AArch64CC::GT:
969- return [LHS, RHS, IsZero, DstTy](MachineIRBuilder &MIB) {
970- return IsZero
971- ? MIB.buildInstr (AArch64::G_FCMGTZ, {DstTy}, {LHS}).getReg (0 )
972- : MIB.buildInstr (AArch64::G_FCMGT, {DstTy}, {LHS, RHS})
973- .getReg (0 );
958+ return [LHS, RHS, DstTy](MachineIRBuilder &MIB) {
959+ return MIB.buildInstr (AArch64::G_FCMGT, {DstTy}, {LHS, RHS}).getReg (0 );
974960 };
975961 case AArch64CC::LS:
976- return [LHS, RHS, IsZero, DstTy](MachineIRBuilder &MIB) {
977- return IsZero
978- ? MIB.buildInstr (AArch64::G_FCMLEZ, {DstTy}, {LHS}).getReg (0 )
979- : MIB.buildInstr (AArch64::G_FCMGE, {DstTy}, {RHS, LHS})
980- .getReg (0 );
962+ return [LHS, RHS, DstTy](MachineIRBuilder &MIB) {
963+ return MIB.buildInstr (AArch64::G_FCMGE, {DstTy}, {RHS, LHS}).getReg (0 );
981964 };
982965 case AArch64CC::MI:
983- return [LHS, RHS, IsZero, DstTy](MachineIRBuilder &MIB) {
984- return IsZero
985- ? MIB.buildInstr (AArch64::G_FCMLTZ, {DstTy}, {LHS}).getReg (0 )
986- : MIB.buildInstr (AArch64::G_FCMGT, {DstTy}, {RHS, LHS})
987- .getReg (0 );
966+ return [LHS, RHS, DstTy](MachineIRBuilder &MIB) {
967+ return MIB.buildInstr (AArch64::G_FCMGT, {DstTy}, {RHS, LHS}).getReg (0 );
988968 };
989969 }
990970}
@@ -1024,23 +1004,17 @@ void applyLowerVectorFCMP(MachineInstr &MI, MachineRegisterInfo &MRI,
10241004
10251005 LLT DstTy = MRI.getType (Dst);
10261006
1027- auto Splat = getAArch64VectorSplat (*MRI.getVRegDef (RHS), MRI);
1028-
1029- // Compares against 0 have special target-specific pseudos.
1030- bool IsZero = Splat && Splat->isCst () && Splat->getCst () == 0 ;
1031-
10321007 bool Invert = false ;
10331008 AArch64CC::CondCode CC, CC2 = AArch64CC::AL;
10341009 if ((Pred == CmpInst::Predicate::FCMP_ORD ||
10351010 Pred == CmpInst::Predicate::FCMP_UNO) &&
1036- IsZero ) {
1011+ isBuildVectorAllZeros (*MRI. getVRegDef (RHS), MRI) ) {
10371012 // The special case "fcmp ord %a, 0" is the canonical check that LHS isn't
10381013 // NaN, so equivalent to a == a and doesn't need the two comparisons an
10391014 // "ord" normally would.
10401015 // Similarly, "fcmp uno %a, 0" is the canonical check that LHS is NaN and is
10411016 // thus equivalent to a != a.
10421017 RHS = LHS;
1043- IsZero = false ;
10441018 CC = Pred == CmpInst::Predicate::FCMP_ORD ? AArch64CC::EQ : AArch64CC::NE;
10451019 } else
10461020 changeVectorFCMPPredToAArch64CC (Pred, CC, CC2, Invert);
@@ -1051,12 +1025,12 @@ void applyLowerVectorFCMP(MachineInstr &MI, MachineRegisterInfo &MRI,
10511025 const bool NoNans =
10521026 ST.getTargetLowering ()->getTargetMachine ().Options .NoNaNsFPMath ;
10531027
1054- auto Cmp = getVectorFCMP (CC, LHS, RHS, IsZero, NoNans, MRI);
1028+ auto Cmp = getVectorFCMP (CC, LHS, RHS, NoNans, MRI);
10551029 Register CmpRes;
10561030 if (CC2 == AArch64CC::AL)
10571031 CmpRes = Cmp (MIB);
10581032 else {
1059- auto Cmp2 = getVectorFCMP (CC2, LHS, RHS, IsZero, NoNans, MRI);
1033+ auto Cmp2 = getVectorFCMP (CC2, LHS, RHS, NoNans, MRI);
10601034 auto Cmp2Dst = Cmp2 (MIB);
10611035 auto Cmp1Dst = Cmp (MIB);
10621036 CmpRes = MIB.buildOr (DstTy, Cmp1Dst, Cmp2Dst).getReg (0 );
0 commit comments