262 lines · plain
1# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -run-pass=prologepilog -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s2# RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -start-before=prologepilog -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-OFFSET3 4--- |5 define void @testcase_valid_offset() nounwind { entry: unreachable }6 define void @testcase_offset_out_of_range() nounwind { entry: unreachable }7...8---9name: testcase_valid_offset10tracksRegLiveness: true11stack:12 - { id: 0, name: '', type: default, offset: 0, size: 512, alignment: 16, stack-id: scalable-vector }13body: |14 bb.0:15 liveins: $p016 17 ; CHECK-LABEL: name: testcase_valid_offset18 ; CHECK: liveins: $p019 ; CHECK-NEXT: {{ $}}20 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.1)21 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -3222 ; CHECK-NEXT: renamable $z0_z1 = LD2B_IMM renamable $p0, $sp, -823 ; CHECK-NEXT: renamable $z0_z1 = LD2B_IMM renamable $p0, $sp, 724 ; CHECK-NEXT: renamable $z0_z1 = LD2H_IMM renamable $p0, $sp, -825 ; CHECK-NEXT: renamable $z0_z1 = LD2H_IMM renamable $p0, $sp, 726 ; CHECK-NEXT: renamable $z0_z1 = LD2W_IMM renamable $p0, $sp, -827 ; CHECK-NEXT: renamable $z0_z1 = LD2W_IMM renamable $p0, $sp, 728 ; CHECK-NEXT: renamable $z0_z1 = LD2D_IMM renamable $p0, $sp, -829 ; CHECK-NEXT: renamable $z0_z1 = LD2D_IMM renamable $p0, $sp, 730 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3B_IMM renamable $p0, $sp, -831 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3B_IMM renamable $p0, $sp, 732 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3H_IMM renamable $p0, $sp, -833 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3H_IMM renamable $p0, $sp, 734 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3W_IMM renamable $p0, $sp, -835 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3W_IMM renamable $p0, $sp, 736 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3D_IMM renamable $p0, $sp, -837 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3D_IMM renamable $p0, $sp, 738 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, $sp, -839 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, $sp, 740 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, $sp, -841 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, $sp, 742 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, $sp, -843 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, $sp, 744 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, $sp, -845 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, $sp, 746 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 3147 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 148 ; CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.1)49 ; CHECK-NEXT: RET_ReallyLR implicit $z0, implicit $z1, implicit $z2, implicit $z350 51 ; CHECK-OFFSET-LABEL: testcase_valid_offset:52 ; CHECK-OFFSET: str x29, [sp, #-16]!53 ; CHECK-OFFSET-NEXT: addvl sp, sp, #-3254 ; CHECK-OFFSET-NEXT: ld2b { z0.b, z1.b }, p0/z, [sp, #-16, mul vl]55 ; CHECK-OFFSET-NEXT: ld2b { z0.b, z1.b }, p0/z, [sp, #14, mul vl]56 ; CHECK-OFFSET-NEXT: ld2h { z0.h, z1.h }, p0/z, [sp, #-16, mul vl]57 ; CHECK-OFFSET-NEXT: ld2h { z0.h, z1.h }, p0/z, [sp, #14, mul vl]58 ; CHECK-OFFSET-NEXT: ld2w { z0.s, z1.s }, p0/z, [sp, #-16, mul vl]59 ; CHECK-OFFSET-NEXT: ld2w { z0.s, z1.s }, p0/z, [sp, #14, mul vl]60 ; CHECK-OFFSET-NEXT: ld2d { z0.d, z1.d }, p0/z, [sp, #-16, mul vl]61 ; CHECK-OFFSET-NEXT: ld2d { z0.d, z1.d }, p0/z, [sp, #14, mul vl]62 ; CHECK-OFFSET-NEXT: ld3b { z0.b - z2.b }, p0/z, [sp, #-24, mul vl]63 ; CHECK-OFFSET-NEXT: ld3b { z0.b - z2.b }, p0/z, [sp, #21, mul vl]64 ; CHECK-OFFSET-NEXT: ld3h { z0.h - z2.h }, p0/z, [sp, #-24, mul vl]65 ; CHECK-OFFSET-NEXT: ld3h { z0.h - z2.h }, p0/z, [sp, #21, mul vl]66 ; CHECK-OFFSET-NEXT: ld3w { z0.s - z2.s }, p0/z, [sp, #-24, mul vl]67 ; CHECK-OFFSET-NEXT: ld3w { z0.s - z2.s }, p0/z, [sp, #21, mul vl]68 ; CHECK-OFFSET-NEXT: ld3d { z0.d - z2.d }, p0/z, [sp, #-24, mul vl]69 ; CHECK-OFFSET-NEXT: ld3d { z0.d - z2.d }, p0/z, [sp, #21, mul vl]70 ; CHECK-OFFSET-NEXT: ld4b { z0.b - z3.b }, p0/z, [sp, #-32, mul vl]71 ; CHECK-OFFSET-NEXT: ld4b { z0.b - z3.b }, p0/z, [sp, #28, mul vl]72 ; CHECK-OFFSET-NEXT: ld4h { z0.h - z3.h }, p0/z, [sp, #-32, mul vl]73 ; CHECK-OFFSET-NEXT: ld4h { z0.h - z3.h }, p0/z, [sp, #28, mul vl]74 ; CHECK-OFFSET-NEXT: ld4w { z0.s - z3.s }, p0/z, [sp, #-32, mul vl]75 ; CHECK-OFFSET-NEXT: ld4w { z0.s - z3.s }, p0/z, [sp, #28, mul vl]76 ; CHECK-OFFSET-NEXT: ld4d { z0.d - z3.d }, p0/z, [sp, #-32, mul vl]77 ; CHECK-OFFSET-NEXT: ld4d { z0.d - z3.d }, p0/z, [sp, #28, mul vl]78 ; CHECK-OFFSET-NEXT: addvl sp, sp, #3179 ; CHECK-OFFSET-NEXT: addvl sp, sp, #180 ; CHECK-OFFSET-NEXT: ldr x29, [sp], #1681 ; CHECK-OFFSET-NEXT: ret82 83 renamable $z0_z1 = LD2B_IMM renamable $p0, %stack.0, -884 renamable $z0_z1 = LD2B_IMM renamable $p0, %stack.0, 785 renamable $z0_z1 = LD2H_IMM renamable $p0, %stack.0, -886 renamable $z0_z1 = LD2H_IMM renamable $p0, %stack.0, 787 renamable $z0_z1 = LD2W_IMM renamable $p0, %stack.0, -888 renamable $z0_z1 = LD2W_IMM renamable $p0, %stack.0, 789 renamable $z0_z1 = LD2D_IMM renamable $p0, %stack.0, -890 renamable $z0_z1 = LD2D_IMM renamable $p0, %stack.0, 791 92 renamable $z0_z1_z2 = LD3B_IMM renamable $p0, %stack.0, -893 renamable $z0_z1_z2 = LD3B_IMM renamable $p0, %stack.0, 794 renamable $z0_z1_z2 = LD3H_IMM renamable $p0, %stack.0, -895 renamable $z0_z1_z2 = LD3H_IMM renamable $p0, %stack.0, 796 renamable $z0_z1_z2 = LD3W_IMM renamable $p0, %stack.0, -897 renamable $z0_z1_z2 = LD3W_IMM renamable $p0, %stack.0, 798 renamable $z0_z1_z2 = LD3D_IMM renamable $p0, %stack.0, -899 renamable $z0_z1_z2 = LD3D_IMM renamable $p0, %stack.0, 7100 101 renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, %stack.0, -8102 renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, %stack.0, 7103 renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, %stack.0, -8104 renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, %stack.0, 7105 renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, %stack.0, -8106 renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, %stack.0, 7107 renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, %stack.0, -8108 renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, %stack.0, 7109 RET_ReallyLR implicit $z0, implicit $z1, implicit $z2, implicit $z3110...111---112name: testcase_offset_out_of_range113tracksRegLiveness: true114stack:115 - { id: 0, name: '', type: default, offset: 0, size: 512, alignment: 16, stack-id: scalable-vector }116body: |117 bb.0:118 liveins: $p0119 120 ; CHECK-LABEL: name: testcase_offset_out_of_range121 ; CHECK: liveins: $p0122 ; CHECK-NEXT: {{ $}}123 ; CHECK-NEXT: early-clobber $sp = frame-setup STRXpre killed $fp, $sp, -16 :: (store (s64) into %stack.1)124 ; CHECK-NEXT: $sp = frame-setup ADDVL_XXI $sp, -32125 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -2126 ; CHECK-NEXT: renamable $z0_z1 = LD2B_IMM renamable $p0, killed $x8, -8127 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 2128 ; CHECK-NEXT: renamable $z0_z1 = LD2B_IMM renamable $p0, killed $x8, 7129 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -2130 ; CHECK-NEXT: renamable $z0_z1 = LD2H_IMM renamable $p0, killed $x8, -8131 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 2132 ; CHECK-NEXT: renamable $z0_z1 = LD2H_IMM renamable $p0, killed $x8, 7133 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -2134 ; CHECK-NEXT: renamable $z0_z1 = LD2W_IMM renamable $p0, killed $x8, -8135 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 2136 ; CHECK-NEXT: renamable $z0_z1 = LD2W_IMM renamable $p0, killed $x8, 7137 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -2138 ; CHECK-NEXT: renamable $z0_z1 = LD2D_IMM renamable $p0, killed $x8, -8139 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 2140 ; CHECK-NEXT: renamable $z0_z1 = LD2D_IMM renamable $p0, killed $x8, 7141 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -3142 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3B_IMM renamable $p0, killed $x8, -8143 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 3144 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3B_IMM renamable $p0, killed $x8, 7145 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -3146 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3H_IMM renamable $p0, killed $x8, -8147 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 3148 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3H_IMM renamable $p0, killed $x8, 7149 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -3150 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3W_IMM renamable $p0, killed $x8, -8151 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 3152 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3W_IMM renamable $p0, killed $x8, 7153 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -3154 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3D_IMM renamable $p0, killed $x8, -8155 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 3156 ; CHECK-NEXT: renamable $z0_z1_z2 = LD3D_IMM renamable $p0, killed $x8, 7157 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -4158 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, killed $x8, -8159 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 4160 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, killed $x8, 7161 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -4162 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, killed $x8, -8163 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 4164 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, killed $x8, 7165 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -4166 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, killed $x8, -8167 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 4168 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, killed $x8, 7169 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, -4170 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, killed $x8, -8171 ; CHECK-NEXT: $x8 = ADDVL_XXI $sp, 4172 ; CHECK-NEXT: renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, killed $x8, 7173 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 31174 ; CHECK-NEXT: $sp = frame-destroy ADDVL_XXI $sp, 1175 ; CHECK-NEXT: early-clobber $sp, $fp = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.1)176 ; CHECK-NEXT: RET_ReallyLR implicit $z0, implicit $z1, implicit $z2, implicit $z3177 178 ; CHECK-OFFSET-LABEL: testcase_offset_out_of_range:179 ; CHECK-OFFSET: str x29, [sp, #-16]!180 ; CHECK-OFFSET-NEXT: addvl sp, sp, #-32181 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-2182 ; CHECK-OFFSET-NEXT: ld2b { z0.b, z1.b }, p0/z, [x8, #-16, mul vl]183 ; CHECK-OFFSET-NEXT: addvl x8, sp, #2184 ; CHECK-OFFSET-NEXT: ld2b { z0.b, z1.b }, p0/z, [x8, #14, mul vl]185 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-2186 ; CHECK-OFFSET-NEXT: ld2h { z0.h, z1.h }, p0/z, [x8, #-16, mul vl]187 ; CHECK-OFFSET-NEXT: addvl x8, sp, #2188 ; CHECK-OFFSET-NEXT: ld2h { z0.h, z1.h }, p0/z, [x8, #14, mul vl]189 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-2190 ; CHECK-OFFSET-NEXT: ld2w { z0.s, z1.s }, p0/z, [x8, #-16, mul vl]191 ; CHECK-OFFSET-NEXT: addvl x8, sp, #2192 ; CHECK-OFFSET-NEXT: ld2w { z0.s, z1.s }, p0/z, [x8, #14, mul vl]193 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-2194 ; CHECK-OFFSET-NEXT: ld2d { z0.d, z1.d }, p0/z, [x8, #-16, mul vl]195 ; CHECK-OFFSET-NEXT: addvl x8, sp, #2196 ; CHECK-OFFSET-NEXT: ld2d { z0.d, z1.d }, p0/z, [x8, #14, mul vl]197 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-3198 ; CHECK-OFFSET-NEXT: ld3b { z0.b - z2.b }, p0/z, [x8, #-24, mul vl]199 ; CHECK-OFFSET-NEXT: addvl x8, sp, #3200 ; CHECK-OFFSET-NEXT: ld3b { z0.b - z2.b }, p0/z, [x8, #21, mul vl]201 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-3202 ; CHECK-OFFSET-NEXT: ld3h { z0.h - z2.h }, p0/z, [x8, #-24, mul vl]203 ; CHECK-OFFSET-NEXT: addvl x8, sp, #3204 ; CHECK-OFFSET-NEXT: ld3h { z0.h - z2.h }, p0/z, [x8, #21, mul vl]205 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-3206 ; CHECK-OFFSET-NEXT: ld3w { z0.s - z2.s }, p0/z, [x8, #-24, mul vl]207 ; CHECK-OFFSET-NEXT: addvl x8, sp, #3208 ; CHECK-OFFSET-NEXT: ld3w { z0.s - z2.s }, p0/z, [x8, #21, mul vl]209 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-3210 ; CHECK-OFFSET-NEXT: ld3d { z0.d - z2.d }, p0/z, [x8, #-24, mul vl]211 ; CHECK-OFFSET-NEXT: addvl x8, sp, #3212 ; CHECK-OFFSET-NEXT: ld3d { z0.d - z2.d }, p0/z, [x8, #21, mul vl]213 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-4214 ; CHECK-OFFSET-NEXT: ld4b { z0.b - z3.b }, p0/z, [x8, #-32, mul vl]215 ; CHECK-OFFSET-NEXT: addvl x8, sp, #4216 ; CHECK-OFFSET-NEXT: ld4b { z0.b - z3.b }, p0/z, [x8, #28, mul vl]217 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-4218 ; CHECK-OFFSET-NEXT: ld4h { z0.h - z3.h }, p0/z, [x8, #-32, mul vl]219 ; CHECK-OFFSET-NEXT: addvl x8, sp, #4220 ; CHECK-OFFSET-NEXT: ld4h { z0.h - z3.h }, p0/z, [x8, #28, mul vl]221 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-4222 ; CHECK-OFFSET-NEXT: ld4w { z0.s - z3.s }, p0/z, [x8, #-32, mul vl]223 ; CHECK-OFFSET-NEXT: addvl x8, sp, #4224 ; CHECK-OFFSET-NEXT: ld4w { z0.s - z3.s }, p0/z, [x8, #28, mul vl]225 ; CHECK-OFFSET-NEXT: addvl x8, sp, #-4226 ; CHECK-OFFSET-NEXT: ld4d { z0.d - z3.d }, p0/z, [x8, #-32, mul vl]227 ; CHECK-OFFSET-NEXT: addvl x8, sp, #4228 ; CHECK-OFFSET-NEXT: ld4d { z0.d - z3.d }, p0/z, [x8, #28, mul vl]229 ; CHECK-OFFSET-NEXT: addvl sp, sp, #31230 ; CHECK-OFFSET-NEXT: addvl sp, sp, #1231 ; CHECK-OFFSET-NEXT: ldr x29, [sp], #16232 ; CHECK-OFFSET-NEXT: ret233 234 renamable $z0_z1 = LD2B_IMM renamable $p0, %stack.0, -9235 renamable $z0_z1 = LD2B_IMM renamable $p0, %stack.0, 8236 renamable $z0_z1 = LD2H_IMM renamable $p0, %stack.0, -9237 renamable $z0_z1 = LD2H_IMM renamable $p0, %stack.0, 8238 renamable $z0_z1 = LD2W_IMM renamable $p0, %stack.0, -9239 renamable $z0_z1 = LD2W_IMM renamable $p0, %stack.0, 8240 renamable $z0_z1 = LD2D_IMM renamable $p0, %stack.0, -9241 renamable $z0_z1 = LD2D_IMM renamable $p0, %stack.0, 8242 243 renamable $z0_z1_z2 = LD3B_IMM renamable $p0, %stack.0, -9244 renamable $z0_z1_z2 = LD3B_IMM renamable $p0, %stack.0, 8245 renamable $z0_z1_z2 = LD3H_IMM renamable $p0, %stack.0, -9246 renamable $z0_z1_z2 = LD3H_IMM renamable $p0, %stack.0, 8247 renamable $z0_z1_z2 = LD3W_IMM renamable $p0, %stack.0, -9248 renamable $z0_z1_z2 = LD3W_IMM renamable $p0, %stack.0, 8249 renamable $z0_z1_z2 = LD3D_IMM renamable $p0, %stack.0, -9250 renamable $z0_z1_z2 = LD3D_IMM renamable $p0, %stack.0, 8251 252 renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, %stack.0, -9253 renamable $z0_z1_z2_z3 = LD4B_IMM renamable $p0, %stack.0, 8254 renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, %stack.0, -9255 renamable $z0_z1_z2_z3 = LD4H_IMM renamable $p0, %stack.0, 8256 renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, %stack.0, -9257 renamable $z0_z1_z2_z3 = LD4W_IMM renamable $p0, %stack.0, 8258 renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, %stack.0, -9259 renamable $z0_z1_z2_z3 = LD4D_IMM renamable $p0, %stack.0, 8260 RET_ReallyLR implicit $z0, implicit $z1, implicit $z2, implicit $z3261...262