xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-ptest-removal-rdffr.mir (revision 341d674b6f1863d027ed30c44a14cd32599eb42d)
1# RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -run-pass=peephole-opt -verify-machineinstrs %s -o - | FileCheck %s
2# Test that RDFFR followed by PTEST is replaced with RDFFRS.
3---
4# CHECK-LABEL: name:{{\s*}} substitute_rdffr_pp_with_rdffrs_pp
5name:                       substitute_rdffr_pp_with_rdffrs_pp
6tracksRegLiveness: true
7body: |
8  bb.0:
9    liveins: $ffr, $p0
10    %0:ppr_3b = COPY $p0
11
12    ; CHECK: RDFFRS_PPz
13    ; CHECK-NOT: PTEST
14    %1:ppr_3b = RDFFR_PPz %0:ppr_3b, implicit $ffr
15    PTEST_PP killed %0:ppr_3b, killed %1:ppr_3b, implicit-def $nzcv
16
17    ; Consume nzcv
18    %2:gpr32 = COPY $wzr
19    %3:gpr32 = CSINCWr killed %2, $wzr, 0, implicit $nzcv
20    $w0 = COPY %3
21    RET_ReallyLR implicit $w0
22...
23---
24# CHECK-LABEL: name:{{\s*}} fail_to_substitute_rdffr_pp_with_rdffrs_pp_differing_mask
25name:                       fail_to_substitute_rdffr_pp_with_rdffrs_pp_differing_mask
26tracksRegLiveness: true
27body: |
28  bb.0:
29    liveins: $ffr, $p0, $p1
30    %0:ppr_3b = COPY $p0
31    %1:ppr_3b = COPY $p1
32
33    ; CHECK: RDFFR_PPz
34    ; CHECK: PTEST
35    %2:ppr_3b = RDFFR_PPz %0:ppr_3b, implicit $ffr
36    PTEST_PP killed %1:ppr_3b, killed %2:ppr_3b, implicit-def $nzcv
37
38    ; Consume nzcv
39    %3:gpr32 = COPY $wzr
40    %4:gpr32 = CSINCWr killed %3, $wzr, 0, implicit $nzcv
41    $w0 = COPY %4
42    RET_ReallyLR implicit $w0
43...
44---
45# CHECK-LABEL: name:{{\s*}} fail_to_substitute_rdffr_pp_with_rdffrs_pp_nzcv_clobbered
46name:                       fail_to_substitute_rdffr_pp_with_rdffrs_pp_nzcv_clobbered
47tracksRegLiveness: true
48body: |
49  bb.0:
50    liveins: $ffr, $p0, $x0
51    %0:ppr_3b = COPY $p0
52
53    ; CHECK: RDFFR_PPz
54    ; CHECK-NEXT: ADDSXrr
55    ; CHECK-NEXT: PTEST_PP
56    %1:ppr_3b = RDFFR_PPz %0:ppr_3b, implicit $ffr
57    ; Clobber nzcv
58    $x0 = ADDSXrr $x0, $x0, implicit-def $nzcv
59    PTEST_PP killed %0:ppr_3b, killed %1:ppr_3b, implicit-def $nzcv
60
61    ; Consume nzcv
62    %2:gpr32 = COPY $wzr
63    %3:gpr32 = CSINCWr killed %2, $wzr, 0, implicit $nzcv
64    $w0 = COPY %3
65    RET_ReallyLR implicit $w0
66...
67---
68# CHECK-LABEL: name:{{\s*}} fail_to_substitute_rdffr_pp_with_rdffrs_pp_nzcv_flags_used_between
69name:                       fail_to_substitute_rdffr_pp_with_rdffrs_pp_nzcv_flags_used_between
70tracksRegLiveness: true
71body: |
72  bb.0:
73    liveins: $ffr, $p0, $x0
74    %0:ppr_3b = COPY $p0
75
76    $wzr = SUBSWri $w0, 0, 0, implicit-def $nzcv
77
78    ; CHECK: RDFFR_PPz
79    ; CHECK-NEXT: CSINCWr
80    ; CHECK-NEXT: PTEST_PP
81    %1:ppr_3b = RDFFR_PPz %0:ppr_3b, implicit $ffr
82    ; Consume nzcv
83    %2:gpr32 = CSINCWr $wzr, $wzr, 0, implicit $nzcv
84    PTEST_PP killed %0:ppr_3b, killed %1:ppr_3b, implicit-def $nzcv
85
86    ; Consume nzcv
87    %3:gpr32 = COPY $wzr
88    %4:gpr32 = CSINCWr killed %3, $wzr, 0, implicit $nzcv
89    $w0 = ORRWrs %4, %2, 1
90    RET_ReallyLR implicit $w0
91