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