220 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -run-pass=prologepilog -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s3#4# Test that prologepilog works for each of the LDNT1/STNT1 instructions for stack-based objects.5#6--- |7 define void @testcase_positive_offset() uwtable {8 %dummy = alloca <vscale x 2 x i64>, align 89 %object = alloca <vscale x 2 x i64>, align 810 ; Reads from %object at offset 7 * readsize11 ret void12 }13 define void @testcase_negative_offset() uwtable {14 %dummy = alloca <vscale x 2 x i64>, align 815 %object = alloca <vscale x 2 x i64>, align 816 ; Reads from %object at offset -8 * readsize17 ret void18 }19 20 define void @testcase_positive_offset_out_of_range() uwtable {21 %dummy = alloca <vscale x 2 x i64>, align 822 %object = alloca <vscale x 2 x i64>, align 823 ; Reads from %object at offset 8 * readsize24 ret void25 }26 define void @testcase_negative_offset_out_of_range() uwtable {27 %dummy = alloca <vscale x 2 x i64>, align 828 %object = alloca <vscale x 2 x i64>, align 829 ; Reads from %object at offset -9 * readsize30 ret void31 }32...33---34name: testcase_positive_offset35tracksRegLiveness: true36stack:37 - { id: 0, name: dummy, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }38 - { id: 1, name: object, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }39body: |40 bb.0 (%ir-block.0):41 liveins: $p042 43 ; CHECK-LABEL: name: testcase_positive_offset44 ; CHECK: liveins: $p0, $fp45 ; CHECK-NEXT: {{ $}}46 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.2)47 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1648 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -1649 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -4, implicit $vg50 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x2251 ; CHECK-NEXT: renamable $z0 = LDNT1B_ZRI renamable $p0, $sp, 7 :: (load (s8) from %ir.object, align 2)52 ; CHECK-NEXT: renamable $z0 = LDNT1H_ZRI renamable $p0, $sp, 7 :: (load (s16) from %ir.object)53 ; CHECK-NEXT: renamable $z0 = LDNT1W_ZRI renamable $p0, $sp, 7 :: (load (s32) from %ir.object, align 8)54 ; CHECK-NEXT: renamable $z0 = LDNT1D_ZRI renamable $p0, $sp, 7 :: (load (s64) from %ir.object)55 ; CHECK-NEXT: STNT1B_ZRI renamable $z0, renamable $p0, $sp, 7 :: (store (s8) into %ir.object, align 8)56 ; CHECK-NEXT: STNT1H_ZRI renamable $z0, renamable $p0, $sp, 7 :: (store (s16) into %ir.object, align 8)57 ; CHECK-NEXT: STNT1W_ZRI renamable $z0, renamable $p0, $sp, 7 :: (store (s32) into %ir.object, align 8)58 ; CHECK-NEXT: STNT1D_ZRI renamable $z0, renamable $p0, $sp, 7 :: (store (s64) into %ir.object)59 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 4, implicit $vg60 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 1661 ; CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2)62 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 063 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w2964 ; CHECK-NEXT: RET_ReallyLR implicit $z065 renamable $z0 = LDNT1B_ZRI renamable $p0, %stack.1.object, 7 :: (load 1 from %ir.object, align 2)66 renamable $z0 = LDNT1H_ZRI renamable $p0, %stack.1.object, 7 :: (load 2 from %ir.object, align 2)67 renamable $z0 = LDNT1W_ZRI renamable $p0, %stack.1.object, 7 :: (load 4 from %ir.object, align 8)68 renamable $z0 = LDNT1D_ZRI renamable $p0, %stack.1.object, 7 :: (load 8 from %ir.object, align 8)69 STNT1B_ZRI renamable $z0, renamable $p0, %stack.1.object, 7 :: (store 1 into %ir.object, align 8)70 STNT1H_ZRI renamable $z0, renamable $p0, %stack.1.object, 7 :: (store 2 into %ir.object, align 8)71 STNT1W_ZRI renamable $z0, renamable $p0, %stack.1.object, 7 :: (store 4 into %ir.object, align 8)72 STNT1D_ZRI renamable $z0, renamable $p0, %stack.1.object, 7 :: (store 8 into %ir.object, align 8)73 RET_ReallyLR implicit $z074...75 76---77name: testcase_negative_offset78tracksRegLiveness: true79stack:80 - { id: 0, name: dummy, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }81 - { id: 1, name: object, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }82body: |83 bb.0 (%ir-block.0):84 liveins: $p085 86 ; CHECK-LABEL: name: testcase_negative_offset87 ; CHECK: liveins: $p0, $fp88 ; CHECK-NEXT: {{ $}}89 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.2)90 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 1691 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -1692 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -4, implicit $vg93 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x2294 ; CHECK-NEXT: renamable $z0 = LDNT1B_ZRI renamable $p0, $sp, -8 :: (load (s8) from %ir.object, align 2)95 ; CHECK-NEXT: renamable $z0 = LDNT1H_ZRI renamable $p0, $sp, -8 :: (load (s16) from %ir.object)96 ; CHECK-NEXT: renamable $z0 = LDNT1W_ZRI renamable $p0, $sp, -8 :: (load (s32) from %ir.object)97 ; CHECK-NEXT: renamable $z0 = LDNT1D_ZRI renamable $p0, $sp, -8 :: (load (s64) from %ir.object)98 ; CHECK-NEXT: STNT1B_ZRI renamable $z0, renamable $p0, $sp, -8 :: (store (s8) into %ir.object, align 8)99 ; CHECK-NEXT: STNT1H_ZRI renamable $z0, renamable $p0, $sp, -8 :: (store (s16) into %ir.object, align 8)100 ; CHECK-NEXT: STNT1W_ZRI renamable $z0, renamable $p0, $sp, -8 :: (store (s32) into %ir.object, align 8)101 ; CHECK-NEXT: STNT1D_ZRI renamable $z0, renamable $p0, $sp, -8 :: (store (s64) into %ir.object)102 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 4, implicit $vg103 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16104 ; CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2)105 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0106 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29107 ; CHECK-NEXT: RET_ReallyLR implicit $z0108 renamable $z0 = LDNT1B_ZRI renamable $p0, %stack.1.object, -8 :: (load 1 from %ir.object, align 2)109 renamable $z0 = LDNT1H_ZRI renamable $p0, %stack.1.object, -8 :: (load 2 from %ir.object, align 2)110 renamable $z0 = LDNT1W_ZRI renamable $p0, %stack.1.object, -8 :: (load 4 from %ir.object, align 4)111 renamable $z0 = LDNT1D_ZRI renamable $p0, %stack.1.object, -8 :: (load 8 from %ir.object, align 8)112 STNT1B_ZRI renamable $z0, renamable $p0, %stack.1.object, -8 :: (store 1 into %ir.object, align 8)113 STNT1H_ZRI renamable $z0, renamable $p0, %stack.1.object, -8 :: (store 2 into %ir.object, align 8)114 STNT1W_ZRI renamable $z0, renamable $p0, %stack.1.object, -8 :: (store 4 into %ir.object, align 8)115 STNT1D_ZRI renamable $z0, renamable $p0, %stack.1.object, -8 :: (store 8 into %ir.object, align 8)116 RET_ReallyLR implicit $z0117...118 119---120name: testcase_positive_offset_out_of_range121tracksRegLiveness: true122stack:123 - { id: 0, name: dummy, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }124 - { id: 1, name: object, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }125body: |126 bb.0 (%ir-block.0):127 liveins: $p0128 129 ; CHECK-LABEL: name: testcase_positive_offset_out_of_range130 ; CHECK: liveins: $p0, $fp131 ; CHECK-NEXT: {{ $}}132 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.2)133 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16134 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16135 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -4, implicit $vg136 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x22137 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg138 ; CHECK-NEXT: renamable $z0 = LDNT1B_ZRI renamable $p0, killed $x8, 7 :: (load (s8) from %ir.object, align 2)139 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg140 ; CHECK-NEXT: renamable $z0 = LDNT1H_ZRI renamable $p0, killed $x8, 7 :: (load (s16) from %ir.object)141 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg142 ; CHECK-NEXT: renamable $z0 = LDNT1W_ZRI renamable $p0, killed $x8, 7 :: (load (s32) from %ir.object)143 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg144 ; CHECK-NEXT: renamable $z0 = LDNT1D_ZRI renamable $p0, killed $x8, 7 :: (load (s64) from %ir.object)145 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg146 ; CHECK-NEXT: STNT1B_ZRI renamable $z0, renamable $p0, killed $x8, 7 :: (store (s8) into %ir.object, align 8)147 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg148 ; CHECK-NEXT: STNT1H_ZRI renamable $z0, renamable $p0, killed $x8, 7 :: (store (s16) into %ir.object, align 8)149 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg150 ; CHECK-NEXT: STNT1W_ZRI renamable $z0, renamable $p0, killed $x8, 7 :: (store (s32) into %ir.object, align 8)151 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 1, implicit $vg152 ; CHECK-NEXT: STNT1D_ZRI renamable $z0, renamable $p0, killed $x8, 7 :: (store (s64) into %ir.object)153 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 4, implicit $vg154 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16155 ; CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2)156 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0157 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29158 ; CHECK-NEXT: RET_ReallyLR implicit $z0159 renamable $z0 = LDNT1B_ZRI renamable $p0, %stack.1.object, 8 :: (load 1 from %ir.object, align 2)160 renamable $z0 = LDNT1H_ZRI renamable $p0, %stack.1.object, 8 :: (load 2 from %ir.object, align 2)161 renamable $z0 = LDNT1W_ZRI renamable $p0, %stack.1.object, 8 :: (load 4 from %ir.object, align 4)162 renamable $z0 = LDNT1D_ZRI renamable $p0, %stack.1.object, 8 :: (load 8 from %ir.object, align 8)163 STNT1B_ZRI renamable $z0, renamable $p0, %stack.1.object, 8 :: (store 1 into %ir.object, align 8)164 STNT1H_ZRI renamable $z0, renamable $p0, %stack.1.object, 8 :: (store 2 into %ir.object, align 8)165 STNT1W_ZRI renamable $z0, renamable $p0, %stack.1.object, 8 :: (store 4 into %ir.object, align 8)166 STNT1D_ZRI renamable $z0, renamable $p0, %stack.1.object, 8 :: (store 8 into %ir.object, align 8)167 RET_ReallyLR implicit $z0168...169 170---171name: testcase_negative_offset_out_of_range172tracksRegLiveness: true173stack:174 - { id: 0, name: dummy, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }175 - { id: 1, name: object, type: default, offset: 0, size: 32, alignment: 16, stack-id: scalable-vector }176body: |177 bb.0 (%ir-block.0):178 liveins: $p0179 180 ; CHECK-LABEL: name: testcase_negative_offset_out_of_range181 ; CHECK: liveins: $p0, $fp182 ; CHECK-NEXT: {{ $}}183 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.2)184 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION def_cfa_offset 16185 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION offset $w29, -16186 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -4, implicit $vg187 ; CHECK-NEXT: frame-setup CFI_INSTRUCTION escape 0x0f, 0x09, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x11, 0x20, 0x1e, 0x22188 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg189 ; CHECK-NEXT: renamable $z0 = LDNT1B_ZRI renamable $p0, killed $x8, -8 :: (load (s8) from %ir.object, align 2)190 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg191 ; CHECK-NEXT: renamable $z0 = LDNT1H_ZRI renamable $p0, killed $x8, -8 :: (load (s16) from %ir.object)192 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg193 ; CHECK-NEXT: renamable $z0 = LDNT1W_ZRI renamable $p0, killed $x8, -8 :: (load (s32) from %ir.object)194 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg195 ; CHECK-NEXT: renamable $z0 = LDNT1D_ZRI renamable $p0, killed $x8, -8 :: (load (s64) from %ir.object)196 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg197 ; CHECK-NEXT: STNT1B_ZRI renamable $z0, renamable $p0, killed $x8, -8 :: (store (s8) into %ir.object, align 8)198 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg199 ; CHECK-NEXT: STNT1H_ZRI renamable $z0, renamable $p0, killed $x8, -8 :: (store (s16) into %ir.object, align 8)200 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg201 ; CHECK-NEXT: STNT1W_ZRI renamable $z0, renamable $p0, killed $x8, -8 :: (store (s32) into %ir.object, align 8)202 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -1, implicit $vg203 ; CHECK-NEXT: STNT1D_ZRI renamable $z0, renamable $p0, killed $x8, -8 :: (store (s64) into %ir.object)204 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 4, implicit $vg205 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa $wsp, 16206 ; CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.2)207 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION def_cfa_offset 0208 ; CHECK-NEXT: frame-destroy CFI_INSTRUCTION restore $w29209 ; CHECK-NEXT: RET_ReallyLR implicit $z0210 renamable $z0 = LDNT1B_ZRI renamable $p0, %stack.1.object, -9 :: (load 1 from %ir.object, align 2)211 renamable $z0 = LDNT1H_ZRI renamable $p0, %stack.1.object, -9 :: (load 2 from %ir.object, align 2)212 renamable $z0 = LDNT1W_ZRI renamable $p0, %stack.1.object, -9 :: (load 4 from %ir.object, align 4)213 renamable $z0 = LDNT1D_ZRI renamable $p0, %stack.1.object, -9 :: (load 8 from %ir.object, align 8)214 STNT1B_ZRI renamable $z0, renamable $p0, %stack.1.object, -9 :: (store 1 into %ir.object, align 8)215 STNT1H_ZRI renamable $z0, renamable $p0, %stack.1.object, -9 :: (store 2 into %ir.object, align 8)216 STNT1W_ZRI renamable $z0, renamable $p0, %stack.1.object, -9 :: (store 4 into %ir.object, align 8)217 STNT1D_ZRI renamable $z0, renamable $p0, %stack.1.object, -9 :: (store 8 into %ir.object, align 8)218 RET_ReallyLR implicit $z0219...220