xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-ptest-removal-log.ll (revision 1e02a29e4753ef70d7ce0ad90b7e4f29f1223006)
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 flag-setting bitwise logical instructions are used and redundant ptest
5; instruction is removed.
6
7define i1 @and(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
8; CHECK-LABEL: and:
9; CHECK:       // %bb.0:
10; CHECK-NEXT:    ands p0.b, p0/z, p1.b, p2.b
11; CHECK-NEXT:    cset w0, ne
12; CHECK-NEXT:    ret
13  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.and.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b)
14  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)
15  ret i1 %2
16}
17
18define i1 @bic(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
19; CHECK-LABEL: bic:
20; CHECK:       // %bb.0:
21; CHECK-NEXT:    bics 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.bic.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  ret i1 %2
27}
28
29define i1 @eor(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
30; CHECK-LABEL: eor:
31; CHECK:       // %bb.0:
32; CHECK-NEXT:    eors p0.b, p0/z, p1.b, p2.b
33; CHECK-NEXT:    cset w0, ne
34; CHECK-NEXT:    ret
35  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.eor.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b)
36  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)
37  ret i1 %2
38}
39
40define i1 @nand(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
41; CHECK-LABEL: nand:
42; CHECK:       // %bb.0:
43; CHECK-NEXT:    nands p0.b, p0/z, p1.b, p2.b
44; CHECK-NEXT:    cset w0, ne
45; CHECK-NEXT:    ret
46  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.nand.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b)
47  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)
48  ret i1 %2
49}
50
51define i1 @nor(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
52; CHECK-LABEL: nor:
53; CHECK:       // %bb.0:
54; CHECK-NEXT:    nors p0.b, p0/z, p1.b, p2.b
55; CHECK-NEXT:    cset w0, ne
56; CHECK-NEXT:    ret
57  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.nor.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b)
58  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)
59  ret i1 %2
60}
61
62define i1 @orn(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
63; CHECK-LABEL: orn:
64; CHECK:       // %bb.0:
65; CHECK-NEXT:    orns p0.b, p0/z, p1.b, p2.b
66; CHECK-NEXT:    cset w0, ne
67; CHECK-NEXT:    ret
68  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.orn.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b)
69  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)
70  ret i1 %2
71}
72
73define i1 @orr(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b) {
74; CHECK-LABEL: orr:
75; CHECK:       // %bb.0:
76; CHECK-NEXT:    orrs p0.b, p0/z, p1.b, p2.b
77; CHECK-NEXT:    cset w0, ne
78; CHECK-NEXT:    ret
79  %1 = tail call <vscale x 16 x i1> @llvm.aarch64.sve.orr.z.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %a, <vscale x 16 x i1> %b)
80  %2 = tail call i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1> %pg, <vscale x 16 x i1> %1)
81  ret i1 %2
82}
83
84declare <vscale x 16 x i1> @llvm.aarch64.sve.and.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
85declare <vscale x 16 x i1> @llvm.aarch64.sve.bic.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
86declare <vscale x 16 x i1> @llvm.aarch64.sve.eor.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
87declare <vscale x 16 x i1> @llvm.aarch64.sve.nand.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
88declare <vscale x 16 x i1> @llvm.aarch64.sve.nor.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
89declare <vscale x 16 x i1> @llvm.aarch64.sve.orn.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
90declare <vscale x 16 x i1> @llvm.aarch64.sve.orr.z.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>, <vscale x 16 x i1>)
91declare i1 @llvm.aarch64.sve.ptest.any.nxv16i1(<vscale x 16 x i1>, <vscale x 16 x i1>)
92