diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h @@ -332,6 +332,7 @@ INSR, PTEST, + PTEST_ANY, PTRUE, BITREVERSE_MERGE_PASSTHRU, diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -2335,6 +2335,7 @@ MAKE_CASE(AArch64ISD::UUNPKLO) MAKE_CASE(AArch64ISD::INSR) MAKE_CASE(AArch64ISD::PTEST) + MAKE_CASE(AArch64ISD::PTEST_ANY) MAKE_CASE(AArch64ISD::PTRUE) MAKE_CASE(AArch64ISD::LD1_MERGE_ZERO) MAKE_CASE(AArch64ISD::LD1S_MERGE_ZERO) @@ -17405,7 +17406,9 @@ } // Set condition code (CC) flags. - SDValue Test = DAG.getNode(AArch64ISD::PTEST, DL, MVT::Other, Pg, Op); + SDValue Test = DAG.getNode( + Cond == AArch64CC::ANY_ACTIVE ? AArch64ISD::PTEST_ANY : AArch64ISD::PTEST, + DL, MVT::Other, Pg, Op); // Convert CC to integer based on requested condition. // NOTE: Cond is inverted to promote CSEL's removal when it feeds a compare. diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -1122,6 +1122,7 @@ default: break; case AArch64::PTEST_PP: + case AArch64::PTEST_PP_ANY: SrcReg = MI.getOperand(0).getReg(); SrcReg2 = MI.getOperand(1).getReg(); // Not sure about the mask and value for now... @@ -1321,13 +1322,21 @@ // For PTEST(PTRUE_ALL, PTEST_LIKE), the PTEST is redundant if the // PTEST_LIKE instruction uses the same all active mask and the element - // size matches. + // size matches. If the PTEST has a condition of any then it is always + // redundant. if (PredIsPTestLike) { auto PTestLikeMask = MRI->getUniqueVRegDef(Pred->getOperand(1).getReg()); - if (Mask != PTestLikeMask) + if (Mask != PTestLikeMask && PTest->getOpcode() != AArch64::PTEST_PP_ANY) return false; } + // Fallthough to simply remove the PTEST. + } else if ((Mask == Pred) && (PredIsPTestLike || PredIsWhileLike) && + PTest->getOpcode() == AArch64::PTEST_PP_ANY) { + // For PTEST(PG, PG), PTEST is redundant when PG is the result of an + // instruction that sets the flags as PTEST would. This is only valid when + // the condition is any. + // Fallthough to simply remove the PTEST. } else if (PredIsPTestLike) { // For PTEST(PG, PTEST_LIKE(PG, ...)), the PTEST is redundant since the @@ -1350,10 +1359,13 @@ // where the compare generates a canonical all active 32-bit predicate // (equivalent to 'ptrue p1.s, all'). The implicit PTEST sets the last // active flag, whereas the PTEST instruction with the same mask doesn't. + // For PTEST_ANY this doesn't apply as the flags in this case would be + // identical regardless of element size. auto PTestLikeMask = MRI->getUniqueVRegDef(Pred->getOperand(1).getReg()); uint64_t PredElementSize = getElementSizeForOpcode(PredOpcode); if ((Mask != PTestLikeMask) || - (PredElementSize != AArch64::ElementSizeB)) + (PredElementSize != AArch64::ElementSizeB && + PTest->getOpcode() != AArch64::PTEST_PP_ANY)) return false; // Fallthough to simply remove the PTEST. @@ -1473,7 +1485,8 @@ return true; } - if (CmpInstr.getOpcode() == AArch64::PTEST_PP) + if (CmpInstr.getOpcode() == AArch64::PTEST_PP || + CmpInstr.getOpcode() == AArch64::PTEST_PP_ANY) return optimizePTestInstr(&CmpInstr, SrcReg, SrcReg2, MRI); if (SrcReg2 != 0) diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td --- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td @@ -308,6 +308,7 @@ def SDT_AArch64PTest : SDTypeProfile<0, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>]>; def AArch64ptest : SDNode<"AArch64ISD::PTEST", SDT_AArch64PTest>; +def AArch64ptest_any : SDNode<"AArch64ISD::PTEST_ANY", SDT_AArch64PTest>; def SDT_AArch64DUP_PRED : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0, 3>, SDTCisVec<1>, SDTCVecEltisVT<1,i1>]>; def AArch64dup_mt : SDNode<"AArch64ISD::DUP_MERGE_PASSTHRU", SDT_AArch64DUP_PRED>; @@ -858,10 +859,10 @@ defm BRKB_PPmP : sve_int_break_m<0b101, "brkb", int_aarch64_sve_brkb>; defm BRKBS_PPzP : sve_int_break_z<0b110, "brkbs", null_frag>; - def PTEST_PP : sve_int_ptest<0b010000, "ptest", AArch64ptest>; - defm PFALSE : sve_int_pfalse<0b000000, "pfalse">; - defm PFIRST : sve_int_pfirst<0b00000, "pfirst", int_aarch64_sve_pfirst>; - defm PNEXT : sve_int_pnext<0b00110, "pnext", int_aarch64_sve_pnext>; + defm PTEST_PP : sve_int_ptest<0b010000, "ptest", AArch64ptest, AArch64ptest_any>; + defm PFALSE : sve_int_pfalse<0b000000, "pfalse">; + defm PFIRST : sve_int_pfirst<0b00000, "pfirst", int_aarch64_sve_pfirst>; + defm PNEXT : sve_int_pnext<0b00110, "pnext", int_aarch64_sve_pnext>; defm AND_PPzPP : sve_int_pred_log_v2<0b0000, "and", int_aarch64_sve_and_z, and>; defm BIC_PPzPP : sve_int_pred_log_v2<0b0001, "bic", int_aarch64_sve_bic_z, AArch64bic>; diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td --- a/llvm/lib/Target/AArch64/SVEInstrFormats.td +++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -687,6 +687,17 @@ let isCompare = 1; } +multiclass sve_int_ptest opc, string asm, SDPatternOperator op, + SDPatternOperator op_any> { + def NAME : sve_int_ptest; + + let hasNoSchedulingInfo = 1, isCompare = 1, Defs = [NZCV] in { + def _ANY : Pseudo<(outs), (ins PPRAny:$Pg, PPR8:$Pn), + [(op_any (nxv16i1 PPRAny:$Pg), (nxv16i1 PPR8:$Pn))]>, + PseudoInstExpansion<(!cast(NAME) PPRAny:$Pg, PPR8:$Pn)>; + } +} + class sve_int_pfirst_next sz8_64, bits<5> opc, string asm, PPRRegOp pprty> : I<(outs pprty:$Pdn), (ins PPRAny:$Pg, pprty:$_Pdn), diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpeq.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpeq.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpeq.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpeq.ll @@ -20,8 +20,7 @@ define i32 @cmpeq_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpeq_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpeq.nxv4i32( %pg, %a, %b) @@ -37,9 +36,7 @@ define i32 @cmpeq_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmpeq_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmpeq p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpeq.nxv16i8( %pg, %a, zeroinitializer) @@ -68,8 +65,7 @@ define i32 @cmpeq_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmpeq_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpeq p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -83,8 +79,7 @@ define i32 @cmpeq_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpeq_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpeq p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpeq p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpge.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpge.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpge.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpge.ll @@ -20,8 +20,7 @@ define i32 @cmpge_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpge_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpge p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpge.nxv4i32( %pg, %a, %b) @@ -37,9 +36,7 @@ define i32 @cmpge_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmpge_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmpge p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpge.nxv16i8( %pg, %a, zeroinitializer) @@ -68,8 +65,7 @@ define i32 @cmpge_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmpge_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpge p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpge p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -83,8 +79,7 @@ define i32 @cmpge_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpge_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpge p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpgt.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpgt.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpgt.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpgt.ll @@ -20,8 +20,7 @@ define i32 @cmpgt_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpgt_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpgt p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpgt p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpgt.nxv4i32( %pg, %a, %b) @@ -37,9 +36,7 @@ define i32 @cmpgt_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmpgt_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmpgt p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpgt.nxv16i8( %pg, %a, zeroinitializer) @@ -68,8 +65,7 @@ define i32 @cmpgt_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmpgt_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpgt p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpgt p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -83,8 +79,7 @@ define i32 @cmpgt_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpgt_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpgt p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpgt p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphi.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphi.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphi.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphi.ll @@ -20,8 +20,7 @@ define i32 @cmphi_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmphi_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmphi p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmphi p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmphi.nxv4i32( %pg, %a, %b) @@ -38,9 +37,7 @@ define i32 @cmphi_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmphi_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmphi p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmphi.nxv16i8( %pg, %a, zeroinitializer) @@ -69,8 +66,7 @@ define i32 @cmphi_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmphi_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmphi p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmphi p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -84,8 +80,7 @@ define i32 @cmphi_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmphi_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmphi p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmphi p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphs.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphs.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphs.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmphs.ll @@ -20,8 +20,7 @@ define i32 @cmphs_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmphs_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmphs p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmphs p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmphs.nxv4i32( %pg, %a, %b) @@ -37,9 +36,7 @@ define i32 @cmphs_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmphs_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmphs p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmphs.nxv16i8( %pg, %a, zeroinitializer) @@ -68,8 +65,7 @@ define i32 @cmphs_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmphs_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmphs p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmphs p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -83,8 +79,7 @@ define i32 @cmphs_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmphs_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmphs p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmphs p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmple.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmple.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmple.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmple.ll @@ -8,9 +8,7 @@ define i32 @cmple_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmple_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmple p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpge.nxv16i8( %pg, zeroinitializer, %a) @@ -39,8 +37,7 @@ define i32 @cmple_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmple_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmple p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmple p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -54,8 +51,7 @@ define i32 @cmple_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmple_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmple p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmple p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) @@ -152,8 +148,7 @@ define i1 @cmp32_ptest_any_px( %pg, %a, %b) { ; CHECK-LABEL: cmp32_ptest_any_px: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpge p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) @@ -225,7 +220,6 @@ ; CHECK-LABEL: cmp8_ptest_any_xx: ; CHECK: // %bb.0: ; CHECK-NEXT: cmpge p0.b, p0/z, z0.b, z1.b -; CHECK-NEXT: ptest p0, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpge.nxv16i8( %pg, %a, %b) @@ -274,7 +268,6 @@ ; CHECK-LABEL: cmp32_ptest_any_xx: ; CHECK: // %bb.0: ; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) @@ -329,9 +322,7 @@ define i1 @cmp8_ptest_any_ax( %pg, %a, %b) { ; CHECK-LABEL: cmp8_ptest_any_ax: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmpge p0.b, p0/z, z0.b, z1.b -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpge.nxv16i8( %pg, %a, %b) @@ -384,9 +375,7 @@ define i1 @cmp32_ptest_any_ax( %pg, %a, %b) { ; CHECK-LABEL: cmp32_ptest_any_ax: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.s ; CHECK-NEXT: cmpge p0.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplo.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplo.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplo.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplo.ll @@ -8,9 +8,7 @@ define i32 @cmplo_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmplo_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmplo p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmphi.nxv16i8( %pg, zeroinitializer, %a) @@ -39,8 +37,7 @@ define i32 @cmplo_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmplo_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmplo p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmplo p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -54,8 +51,7 @@ define i32 @cmplo_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmplo_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmplo p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmplo p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpls.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpls.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpls.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpls.ll @@ -8,9 +8,7 @@ define i32 @cmpls_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmpls_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmpls p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmphs.nxv16i8( %pg, zeroinitializer, %a) @@ -39,8 +37,7 @@ define i32 @cmpls_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmpls_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpls p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpls p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -54,8 +51,7 @@ define i32 @cmpls_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpls_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpls p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpls p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplt.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplt.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplt.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmplt.ll @@ -8,9 +8,7 @@ define i32 @cmplt_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmplt_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmplt p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpgt.nxv16i8( %pg, zeroinitializer, %a) @@ -39,8 +37,7 @@ define i32 @cmplt_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmplt_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmplt p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmplt p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -54,8 +51,7 @@ define i32 @cmplt_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmplt_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmplt p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmplt p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpne.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpne.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpne.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-cmpne.ll @@ -20,8 +20,7 @@ define i32 @cmpne_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpne_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpne p1.s, p0/z, z0.s, z1.s -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, z1.s ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpne.nxv4i32( %pg, %a, %b) @@ -37,9 +36,7 @@ define i32 @cmpne_imm_nxv16i8( %pg, %a) { ; CHECK-LABEL: cmpne_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: cmpne p0.b, p0/z, z0.b, #0 -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.cmpne.nxv16i8( %pg, %a, zeroinitializer) @@ -68,8 +65,7 @@ define i32 @cmpne_wide_nxv8i16( %pg, %a, %b) { ; CHECK-LABEL: cmpne_wide_nxv8i16: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpne p1.h, p0/z, z0.h, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpne p0.h, p0/z, z0.h, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv8i1( %pg) @@ -83,8 +79,7 @@ define i32 @cmpne_wide_nxv4i32( %pg, %a, %b) { ; CHECK-LABEL: cmpne_wide_nxv4i32: ; CHECK: // %bb.0: -; CHECK-NEXT: cmpne p1.s, p0/z, z0.s, z1.d -; CHECK-NEXT: ptest p0, p1.b +; CHECK-NEXT: cmpne p0.s, p0/z, z0.s, z1.d ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.convert.from.svbool.nxv4i1( %pg) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-match.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-match.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-match.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-match.ll @@ -20,9 +20,7 @@ define i32 @match_imm_nxv16i8( %pg, %a, %b) { ; CHECK-LABEL: match_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: match p0.b, p0/z, z0.b, z1.b -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.match.nxv16i8( %pg, %a, %b) @@ -51,9 +49,7 @@ define i32 @nmatch_imm_nxv16i8( %pg, %a, %b) { ; CHECK-LABEL: nmatch_imm_nxv16i8: ; CHECK: // %bb.0: -; CHECK-NEXT: ptrue p1.b ; CHECK-NEXT: nmatch p0.b, p0/z, z0.b, z1.b -; CHECK-NEXT: ptest p1, p0.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.nmatch.nxv16i8( %pg, %a, %b) diff --git a/llvm/test/CodeGen/AArch64/sve-ptest-removal-pfirst-pnext.ll b/llvm/test/CodeGen/AArch64/sve-ptest-removal-pfirst-pnext.ll --- a/llvm/test/CodeGen/AArch64/sve-ptest-removal-pfirst-pnext.ll +++ b/llvm/test/CodeGen/AArch64/sve-ptest-removal-pfirst-pnext.ll @@ -17,7 +17,6 @@ ; CHECK-LABEL: pnext_2: ; CHECK: // %bb.0: ; CHECK-NEXT: pnext p1.d, p0, p1.d -; CHECK-NEXT: ptest p0, p1.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.pnext.nxv2i1( %pg, %a) @@ -30,7 +29,6 @@ ; CHECK-LABEL: pnext_4: ; CHECK: // %bb.0: ; CHECK-NEXT: pnext p1.s, p0, p1.s -; CHECK-NEXT: ptest p0, p1.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.pnext.nxv4i1( %pg, %a) @@ -43,7 +41,6 @@ ; CHECK-LABEL: pnext_8: ; CHECK: // %bb.0: ; CHECK-NEXT: pnext p1.h, p0, p1.h -; CHECK-NEXT: ptest p0, p1.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.pnext.nxv8i1( %pg, %a) diff --git a/llvm/test/CodeGen/AArch64/sve-setcc.ll b/llvm/test/CodeGen/AArch64/sve-setcc.ll --- a/llvm/test/CodeGen/AArch64/sve-setcc.ll +++ b/llvm/test/CodeGen/AArch64/sve-setcc.ll @@ -6,7 +6,6 @@ ; CHECK-LABEL: sve_cmplt_setcc: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: cmplt p1.h, p0/z, z0.h, #0 -; CHECK-NEXT: ptest p0, p1.b ; CHECK-NEXT: b.eq .LBB0_2 ; CHECK-NEXT: // %bb.1: // %if.then ; CHECK-NEXT: st1h { z0.h }, p0, [x0] @@ -30,7 +29,6 @@ ; CHECK-LABEL: sve_cmplt_setcc_inverted: ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: cmplt p1.h, p0/z, z0.h, #0 -; CHECK-NEXT: ptest p0, p1.b ; CHECK-NEXT: b.ne .LBB1_2 ; CHECK-NEXT: // %bb.1: // %if.then ; CHECK-NEXT: st1h { z0.h }, p0, [x0]