1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve %s -o - | FileCheck %s 3 4; Test that redundant ptest instruction is removed when using a flag setting brk 5 6define i32 @brkpa(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 7; CHECK-LABEL: brkpa: 8; CHECK: // %bb.0: 9; CHECK-NEXT: brkpas p0.b, p0/z, p1.b, p2.b 10; CHECK-NEXT: cset w0, ne 11; CHECK-NEXT: ret 12 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkpa.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 13 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1) 14 %conv = zext i1 %2 to i32 15 ret i32 %conv 16} 17 18define i32 @brkpb(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 19; CHECK-LABEL: brkpb: 20; CHECK: // %bb.0: 21; CHECK-NEXT: brkpbs p0.b, p0/z, p1.b, p2.b 22; CHECK-NEXT: cset w0, ne 23; CHECK-NEXT: ret 24 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkpb.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 25 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1) 26 %conv = zext i1 %2 to i32 27 ret i32 %conv 28} 29 30define i32 @brka(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) { 31; CHECK-LABEL: brka: 32; CHECK: // %bb.0: 33; CHECK-NEXT: brkas p0.b, p0/z, p1.b 34; CHECK-NEXT: cset w0, ne 35; CHECK-NEXT: ret 36 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brka.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) 37 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1) 38 %conv = zext i1 %2 to i32 39 ret i32 %conv 40} 41 42define i32 @brkb(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) { 43; CHECK-LABEL: brkb: 44; CHECK: // %bb.0: 45; CHECK-NEXT: brkbs p0.b, p0/z, p1.b 46; CHECK-NEXT: cset w0, ne 47; CHECK-NEXT: ret 48 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkb.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) 49 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1) 50 %conv = zext i1 %2 to i32 51 ret i32 %conv 52} 53 54define i32 @brkn_all_active(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 55; CHECK-LABEL: brkn_all_active: 56; CHECK: // %bb.0: 57; CHECK-NEXT: brkns p2.b, p0/z, p1.b, p2.b 58; CHECK-NEXT: cset w0, ne 59; CHECK-NEXT: ret 60 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkn.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 61 %2 = call <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32 31) 62 %3 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %2, <vscale x 16 x i1> %1) 63 %conv = zext i1 %3 to i32 64 ret i32 %conv 65} 66 67; Test that ptest instruction is not removed when using a non-flag setting brk 68 69define i32 @brkpa_neg(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 70; CHECK-LABEL: brkpa_neg: 71; CHECK: // %bb.0: 72; CHECK-NEXT: brkpa p0.b, p0/z, p1.b, p2.b 73; CHECK-NEXT: ptest p1, p0.b 74; CHECK-NEXT: cset w0, ne 75; CHECK-NEXT: ret 76 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkpa.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 77 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %1) 78 %conv = zext i1 %2 to i32 79 ret i32 %conv 80} 81 82define i32 @brkpb_neg(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 83; CHECK-LABEL: brkpb_neg: 84; CHECK: // %bb.0: 85; CHECK-NEXT: brkpb p0.b, p0/z, p1.b, p2.b 86; CHECK-NEXT: ptest p1, p0.b 87; CHECK-NEXT: cset w0, ne 88; CHECK-NEXT: ret 89 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkpb.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 90 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %1) 91 %conv = zext i1 %2 to i32 92 ret i32 %conv 93} 94 95define i32 @brka_neg(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) { 96; CHECK-LABEL: brka_neg: 97; CHECK: // %bb.0: 98; CHECK-NEXT: brka p0.b, p0/z, p1.b 99; CHECK-NEXT: ptest p1, p0.b 100; CHECK-NEXT: cset w0, ne 101; CHECK-NEXT: ret 102 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brka.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) 103 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %1) 104 %conv = zext i1 %2 to i32 105 ret i32 %conv 106} 107 108define i32 @brkb_neg(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) { 109; CHECK-LABEL: brkb_neg: 110; CHECK: // %bb.0: 111; CHECK-NEXT: brkb p0.b, p0/z, p1.b 112; CHECK-NEXT: ptest p1, p0.b 113; CHECK-NEXT: cset w0, ne 114; CHECK-NEXT: ret 115 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkb.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a) 116 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %1) 117 %conv = zext i1 %2 to i32 118 ret i32 %conv 119} 120 121define i32 @brkn_neg(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 122; CHECK-LABEL: brkn_neg: 123; CHECK: // %bb.0: 124; CHECK-NEXT: brkn p2.b, p0/z, p1.b, p2.b 125; CHECK-NEXT: ptest p1, p2.b 126; CHECK-NEXT: cset w0, ne 127; CHECK-NEXT: ret 128 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkn.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 129 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %a, <vscale x 16 x i1> %1) 130 %conv = zext i1 %2 to i32 131 ret i32 %conv 132} 133 134define i32 @brkn_neg2(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) { 135; CHECK-LABEL: brkn_neg2: 136; CHECK: // %bb.0: 137; CHECK-NEXT: brkn p2.b, p0/z, p1.b, p2.b 138; CHECK-NEXT: ptest p0, p2.b 139; CHECK-NEXT: cset w0, ne 140; CHECK-NEXT: ret 141 %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.brkn.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) 142 %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1) 143 %conv = zext i1 %2 to i32 144 ret i32 %conv 145} 146 147declare <vscale x 16 x i1> @llvm.aarch64.sve.brkpa.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>) 148declare <vscale x 16 x i1> @llvm.aarch64.sve.brkpb.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>) 149declare <vscale x 16 x i1> @llvm.aarch64.sve.brka.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>) 150declare <vscale x 16 x i1> @llvm.aarch64.sve.brkb.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>) 151declare <vscale x 16 x i1> @llvm.aarch64.sve.brkn.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>) 152declare i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>) 153declare <vscale x 16 x i1> @llvm.aarch64.sve.ptrue.nxv16i1(i32) 154