Index: llvm/lib/Target/AArch64/AArch64InstrInfo.cpp =================================================================== --- llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -1351,8 +1351,9 @@ break; } case AArch64::BRKN_PPzP: { - auto *PredMask = MRI->getUniqueVRegDef(Pred->getOperand(1).getReg()); - if (Mask != PredMask) + // PTEST(PTRUE_B(31), BRKN(PG, A, B)) -> BRKNS(PG, A, B). + if ((MaskOpcode != AArch64::PTRUE_B) || + (Mask->getOperand(1).getImm() != 31)) return false; NewOp = AArch64::BRKNS_PPzP; Index: llvm/lib/Target/AArch64/SVEInstrFormats.td =================================================================== --- llvm/lib/Target/AArch64/SVEInstrFormats.td +++ llvm/lib/Target/AArch64/SVEInstrFormats.td @@ -7987,6 +7987,7 @@ let Constraints = "$Pdm = $_Pdm"; let Defs = !if(S, [NZCV], []); + let ElementSize = ElementSizeB; } multiclass sve_int_brkn opc, string asm, SDPatternOperator op> { Index: llvm/test/CodeGen/AArch64/sve-ptest-removal-brk.ll =================================================================== --- llvm/test/CodeGen/AArch64/sve-ptest-removal-brk.ll +++ llvm/test/CodeGen/AArch64/sve-ptest-removal-brk.ll @@ -30,7 +30,8 @@ define i32 @brkn( %pg, %a, %b) { ; CHECK-LABEL: brkn: ; CHECK: // %bb.0: -; CHECK-NEXT: brkns p2.b, p0/z, p1.b, p2.b +; CHECK-NEXT: brkn p2.b, p0/z, p1.b, p2.b +; CHECK-NEXT: ptest p0, p2.b ; CHECK-NEXT: cset w0, ne ; CHECK-NEXT: ret %1 = tail call @llvm.aarch64.sve.brkn.z.nxv16i1( %pg, %a, %b) @@ -39,6 +40,19 @@ ret i32 %conv } +define i32 @brkn_all_active( %pg, %a, %b) { +; CHECK-LABEL: brkn_all_active: +; CHECK: // %bb.0: +; CHECK-NEXT: brkns p2.b, p0/z, p1.b, p2.b +; CHECK-NEXT: cset w0, ne +; CHECK-NEXT: ret + %1 = tail call @llvm.aarch64.sve.brkn.z.nxv16i1( %pg, %a, %b) + %2 = call @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) + %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1( %2, %1) + %conv = zext i1 %3 to i32 + ret i32 %conv +} + ; Test that ptest instruction is not removed when using a non-flag setting brk define i32 @brkpb_neg( %pg, %a, %b) { @@ -84,3 +98,4 @@ declare @llvm.aarch64.sve.brkb.z.nxv16i1(, ) declare @llvm.aarch64.sve.brkn.z.nxv16i1(, , ) declare i1 @llvm.aarch64.sve.ptest.any.nxv16i1(, ) +declare @llvm.aarch64.sve.ptrue.nxv16i1(i32)