481 lines · plain
1# RUN: llc -o - %s -mtriple=aarch64 -mcpu=cortex-a55 -lsr-preferred-addressing-mode=preindexed -stop-after=aarch64-ldst-opt | FileCheck %s2 3---4name: 1-strwpre-strwui-merge5alignment: 46tracksRegLiveness: true7liveins:8 - { reg: '$x0' }9 - { reg: '$w1' }10 - { reg: '$w2' }11frameInfo:12 maxAlignment: 113 maxCallFrameSize: 014machineFunctionInfo:15 hasRedZone: false16body: |17 bb.0.entry:18 liveins: $w1, $w2, $x019 ; CHECK-LABEL: name: 1-strwpre-strwui-merge20 ; CHECK: liveins: $w1, $w2, $x021 ; CHECK: early-clobber $x0 = STPWpre renamable $w1, renamable $w2, renamable $x0, 5 :: (store (s32))22 ; CHECK: RET undef $lr, implicit $x023 early-clobber renamable $x0 = STRWpre killed renamable $w1, killed renamable $x0, 20 :: (store (s32))24 STRWui killed renamable $w2, renamable $x0, 1 :: (store (s32))25 RET undef $lr, implicit $x026 27...28 29 30---31name: 2-strxpre-strxui-merge32alignment: 433tracksRegLiveness: true34liveins:35 - { reg: '$x0' }36 - { reg: '$x1' }37 - { reg: '$x2' }38frameInfo:39 maxAlignment: 140 maxCallFrameSize: 041machineFunctionInfo:42 hasRedZone: false43body: |44 bb.0.entry:45 liveins: $x0, $x1, $x246 47 ; CHECK-LABEL: name: 2-strxpre-strxui-merge48 ; CHECK: liveins: $x0, $x1, $x249 ; CHECK: early-clobber $x0 = STPXpre renamable $x1, renamable $x2, renamable $x0, 3 :: (store (s64))50 ; CHECK: RET undef $lr, implicit $x051 early-clobber renamable $x0 = STRXpre killed renamable $x1, killed renamable $x0, 24 :: (store (s64))52 STRXui killed renamable $x2, renamable $x0, 1 :: (store (s64))53 RET undef $lr, implicit $x054 55...56 57 58---59name: 3-strspre-strsui-merge60alignment: 461tracksRegLiveness: true62liveins:63 - { reg: '$x0' }64 - { reg: '$s0' }65 - { reg: '$s1' }66frameInfo:67 maxAlignment: 168 maxCallFrameSize: 069machineFunctionInfo:70 hasRedZone: false71body: |72 bb.0.entry:73 liveins: $s0, $s1, $x074 ; CHECK-LABEL: name: 3-strspre-strsui-merge75 ; CHECK: liveins: $s0, $s1, $x076 ; CHECK: early-clobber $x0 = STPSpre renamable $s0, renamable $s1, renamable $x0, 3 :: (store (s32))77 ; CHECK: RET undef $lr, implicit $x078 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))79 STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))80 RET undef $lr, implicit $x081...82 83 84---85name: 4-strdpre-strdui-merge86alignment: 487tracksRegLiveness: true88liveins:89 - { reg: '$x0' }90 - { reg: '$d0' }91 - { reg: '$d1' }92frameInfo:93 maxAlignment: 194 maxCallFrameSize: 095machineFunctionInfo:96 hasRedZone: false97body: |98 bb.0.entry:99 liveins: $d0, $d1, $x0100 101 ; CHECK-LABEL: name: 4-strdpre-strdui-merge102 ; CHECK: liveins: $d0, $d1, $x0103 ; CHECK: early-clobber $x0 = STPDpre renamable $d0, renamable $d1, renamable $x0, 16 :: (store (s64))104 ; CHECK: RET undef $lr, implicit $x0105 early-clobber renamable $x0 = STRDpre killed renamable $d0, killed renamable $x0, 128 :: (store (s64))106 STRDui killed renamable $d1, renamable $x0, 1 :: (store (s64))107 RET undef $lr, implicit $x0108 109...110 111 112---113name: 5-strqpre-strqui-merge114alignment: 4115tracksRegLiveness: true116liveins:117 - { reg: '$x0' }118 - { reg: '$q0' }119 - { reg: '$q1' }120frameInfo:121 maxAlignment: 1122 maxCallFrameSize: 0123machineFunctionInfo:124 hasRedZone: false125body: |126 bb.0.entry:127 liveins: $q0, $q1, $x0128 129 ; CHECK-LABEL: name: 5-strqpre-strqui-merge130 ; CHECK: liveins: $q0, $q1, $x0131 ; CHECK: early-clobber $x0 = STPQpre renamable $q0, renamable $q1, renamable $x0, 3 :: (store (s128))132 ; CHECK: RET undef $lr, implicit $x0133 early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))134 STRQui killed renamable $q1, renamable $x0, 1 :: (store (s128))135 RET undef $lr, implicit $x0136 137...138 139 140---141name: 6-strqui-strqpre-no-merge142alignment: 4143tracksRegLiveness: true144liveins:145 - { reg: '$x0' }146 - { reg: '$q0' }147 - { reg: '$q1' }148frameInfo:149 maxAlignment: 1150 maxCallFrameSize: 0151machineFunctionInfo:152 hasRedZone: false153body: |154 bb.0.entry:155 liveins: $q0, $q1, $x0156 ; CHECK-LABEL: name: 6-strqui-strqpre-no-merge157 ; CHECK: liveins: $q0, $q1, $x0158 ; CHECK: STRQui renamable $q1, renamable $x0, 1 :: (store (s128))159 ; CHECK: early-clobber renamable $x0 = STRQpre renamable $q0, renamable $x0, 48, implicit $w0, implicit $w0_hi :: (store (s128))160 ; CHECK: RET undef $lr, implicit $x0161 STRQui killed renamable $q1, renamable $x0, 1 :: (store (s128))162 early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))163 RET undef $lr, implicit $x0164...165 166 167---168name: 7-strspre-strsui-max-offset-merge169alignment: 4170tracksRegLiveness: true171liveins:172 - { reg: '$x0' }173 - { reg: '$s0' }174 - { reg: '$s1' }175frameInfo:176 maxAlignment: 1177 maxCallFrameSize: 0178machineFunctionInfo:179 hasRedZone: false180body: |181 bb.0.entry:182 liveins: $s0, $s1, $x0183 ; CHECK-LABEL: name: 7-strspre-strsui-max-offset-merge184 ; CHECK: liveins: $s0, $s1, $x0185 ; CHECK: early-clobber $x0 = STPSpre renamable $s0, renamable $s1, renamable $x0, 63 :: (store (s32))186 ; CHECK: RET undef $lr, implicit $x0187 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 252 :: (store (s32))188 STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))189 RET undef $lr, implicit $x0190...191 192 193---194name: 8-strspre-strsui-min-offset-merge195alignment: 4196tracksRegLiveness: true197liveins:198 - { reg: '$x0' }199 - { reg: '$s0' }200 - { reg: '$s1' }201frameInfo:202 maxAlignment: 1203 maxCallFrameSize: 0204machineFunctionInfo:205 hasRedZone: false206body: |207 bb.0.entry:208 liveins: $s0, $s1, $x0209 ; CHECK-LABEL: name: 8-strspre-strsui-min-offset-merge210 ; CHECK: liveins: $s0, $s1, $x0211 ; CHECK: early-clobber $x0 = STPSpre renamable $s0, renamable $s1, renamable $x0, -64 :: (store (s32))212 ; CHECK: RET undef $lr, implicit $x0213 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, -256 :: (store (s32))214 STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))215 RET undef $lr, implicit $x0216...217 218 219---220name: 9-strspre-strsui-mod-base-reg-no-merge221alignment: 4222tracksRegLiveness: true223liveins:224 - { reg: '$x0' }225 - { reg: '$x1' }226 - { reg: '$s0' }227 - { reg: '$s1' }228frameInfo:229 maxAlignment: 1230 maxCallFrameSize: 0231machineFunctionInfo:232 hasRedZone: false233body: |234 bb.0.entry:235 liveins: $s0, $s1, $x0, $x1236 ; CHECK-LABEL: name: 9-strspre-strsui-mod-base-reg-no-merge237 ; CHECK: liveins: $s0, $s1, $x0, $x1238 ; CHECK: dead early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))239 ; CHECK: renamable $x0 = LDRXui renamable $x1, 1 :: (load (s64))240 ; CHECK: STRSui renamable $s1, renamable $x0, 1 :: (store (s32))241 ; CHECK: RET undef $lr, implicit $x0242 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))243 renamable $x0 = LDRXui renamable $x1, 1 :: (load (s64))244 STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))245 RET undef $lr, implicit $x0246...247 248 249---250name: 10-strspre-strsui-used-base-reg-no-merge251alignment: 4252tracksRegLiveness: true253liveins:254 - { reg: '$x0' }255 - { reg: '$x1' }256 - { reg: '$s0' }257 - { reg: '$s1' }258frameInfo:259 maxAlignment: 1260 maxCallFrameSize: 0261machineFunctionInfo:262 hasRedZone: false263body: |264 bb.0.entry:265 liveins: $s0, $s1, $x0, $x1266 ; CHECK-LABEL: name: 10-strspre-strsui-used-base-reg-no-merge267 ; CHECK: liveins: $s0, $s1, $x0, $x1268 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))269 ; CHECK: STRXui renamable $x1, renamable $x1, 1 :: (store (s32))270 ; CHECK: STRSui renamable $s1, renamable $x0, 1 :: (store (s32))271 ; CHECK: RET undef $lr, implicit $x0272 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))273 274 STRXui killed renamable $x1, renamable $x1, 1 :: (store (s32))275 276 STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))277 RET undef $lr, implicit $x0278...279 280 281---282name: 11-strspre-strspre-no-merge283alignment: 4284tracksRegLiveness: true285liveins:286 - { reg: '$x0' }287 - { reg: '$s0' }288 - { reg: '$s1' }289frameInfo:290 maxAlignment: 1291 maxCallFrameSize: 0292machineFunctionInfo:293 hasRedZone: false294body: |295 bb.0.entry:296 liveins: $s0, $s1, $x0297 ; CHECK-LABEL: name: 11-strspre-strspre-no-merge298 ; CHECK: liveins: $s0, $s1, $x0299 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))300 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s1, renamable $x0, 16, implicit $w0, implicit $w0_hi :: (store (s32))301 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 4, implicit $w0, implicit $w0_hi :: (store (s32))302 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s1, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))303 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 4, implicit $w0, implicit $w0_hi :: (store (s32))304 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s1, renamable $x0, 4, implicit $w0, implicit $w0_hi :: (store (s32))305 ; CHECK: RET undef $lr, implicit $x0306 early-clobber renamable $x0 = STRSpre renamable $s0, killed renamable $x0, 12 :: (store (s32))307 early-clobber renamable $x0 = STRSpre renamable $s1, killed renamable $x0, 16 :: (store (s32))308 early-clobber renamable $x0 = STRSpre renamable $s0, killed renamable $x0, 4 :: (store (s32))309 early-clobber renamable $x0 = STRSpre renamable $s1, killed renamable $x0, 12 :: (store (s32))310 early-clobber renamable $x0 = STRSpre renamable $s0, killed renamable $x0, 4 :: (store (s32))311 early-clobber renamable $x0 = STRSpre renamable $s1, killed renamable $x0, 4 :: (store (s32))312 RET undef $lr, implicit $x0313...314 315 316---317name: 12-strspre-strsui-no-merge318alignment: 4319tracksRegLiveness: true320liveins:321 - { reg: '$x0' }322 - { reg: '$s0' }323 - { reg: '$s1' }324frameInfo:325 maxAlignment: 1326 maxCallFrameSize: 0327machineFunctionInfo:328 hasRedZone: false329body: |330 bb.0.entry:331 332 ; The offset of the second st is not equal to the333 ; size of the destination register, and hence can’t be merged.334 335 liveins: $s0, $s1, $x0336 ; CHECK-LABEL: name: 12-strspre-strsui-no-merge337 ; CHECK: liveins: $s0, $s1, $x0338 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 12, implicit $w0, implicit $w0_hi :: (store (s32))339 ; CHECK: STRSui renamable $s1, renamable $x0, 2 :: (store (s32))340 ; CHECK: RET undef $lr, implicit $x0341 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 12 :: (store (s32))342 STRSui killed renamable $s1, renamable $x0, 2 :: (store (s32))343 RET undef $lr, implicit $x0344...345 346 347---348name: 13-strqpre-sturqi-merge349alignment: 4350tracksRegLiveness: true351liveins:352 - { reg: '$x0' }353 - { reg: '$q0' }354 - { reg: '$q1' }355frameInfo:356 maxAlignment: 1357 maxCallFrameSize: 0358machineFunctionInfo:359 hasRedZone: false360body: |361 bb.0.entry:362 liveins: $q0, $q1, $x0363 364 ; CHECK-LABEL: name: 13-strqpre-sturqi-merge365 ; CHECK: liveins: $q0, $q1, $x0366 ; CHECK: early-clobber $x0 = STPQpre renamable $q0, renamable $q1, renamable $x0, 3 :: (store (s128))367 ; CHECK: RET undef $lr, implicit $x0368 early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))369 STURQi killed renamable $q1, renamable $x0, 16 :: (store (s128))370 RET undef $lr, implicit $x0371 372...373 374 375---376name: 14-strqpre-sturqi-no-merge377alignment: 4378tracksRegLiveness: true379liveins:380 - { reg: '$x0' }381 - { reg: '$q0' }382 - { reg: '$q1' }383frameInfo:384 maxAlignment: 1385 maxCallFrameSize: 0386machineFunctionInfo:387 hasRedZone: false388body: |389 bb.0.entry:390 liveins: $q0, $q1, $x0391 ; CHECK-LABEL: name: 14-strqpre-sturqi-no-merge392 ; CHECK: liveins: $q0, $q1, $x0393 ; CHECK: early-clobber renamable $x0 = STRQpre renamable $q0, renamable $x0, 48, implicit $w0, implicit $w0_hi :: (store (s128))394 ; CHECK: STURQi renamable $q1, renamable $x0, 1 :: (store (s128))395 ; CHECK: RET undef $lr, implicit $x0396 early-clobber renamable $x0 = STRQpre killed renamable $q0, killed renamable $x0, 48 :: (store (s128))397 STURQi killed renamable $q1, renamable $x0, 1 :: (store (s128))398 RET undef $lr, implicit $x0399...400 401 402---403name: 15-strspre-strsui-unaligned-no-merge404alignment: 4405tracksRegLiveness: true406liveins:407 - { reg: '$x0' }408 - { reg: '$s0' }409 - { reg: '$s1' }410frameInfo:411 maxAlignment: 1412 maxCallFrameSize: 0413machineFunctionInfo:414 hasRedZone: false415body: |416 bb.0.entry:417 liveins: $s0, $s1, $x0418 ; CHECK-LABEL: name: 15-strspre-strsui-unaligned-no-merge419 ; CHECK: liveins: $s0, $s1, $x0420 ; CHECK: early-clobber renamable $x0 = STRSpre renamable $s0, renamable $x0, 251, implicit $w0, implicit $w0_hi :: (store (s32))421 ; CHECK: STRSui renamable $s1, renamable $x0, 1 :: (store (s32))422 ; CHECK: RET undef $lr, implicit $x0423 early-clobber renamable $x0 = STRSpre killed renamable $s0, killed renamable $x0, 251 :: (store (s32))424 STRSui killed renamable $s1, renamable $x0, 1 :: (store (s32))425 RET undef $lr, implicit $x0426...427 428---429name: 16-strxpre-strxui-same-reg-no-merge430alignment: 4431tracksRegLiveness: true432liveins:433 - { reg: '$x0' }434 - { reg: '$x1' }435 - { reg: '$x2' }436frameInfo:437 maxAlignment: 1438 maxCallFrameSize: 0439machineFunctionInfo:440 hasRedZone: false441body: |442 bb.0.entry:443 liveins: $x0, $x1, $x2444 ; CHECK-LABEL: name: 16-strxpre-strxui-same-reg-no-merge445 ; CHECK: liveins: $x0, $x1, $x2446 ; CHECK: early-clobber renamable $x0 = STRXpre renamable $x1, renamable $x0, 24, implicit $w0, implicit $w0_hi :: (store (s64))447 ; CHECK: STRXui renamable $x0, renamable $x0, 1 :: (store (s64))448 ; CHECK: RET undef $lr, implicit $x0449 early-clobber renamable $x0 = STRXpre killed renamable $x1, killed renamable $x0, 24 :: (store (s64))450 STRXui renamable $x0, renamable $x0, 1 :: (store (s64))451 RET undef $lr, implicit $x0452 453...454 455---456name: 17-strwpre-strwui-same-reg-no-merge457alignment: 4458tracksRegLiveness: true459liveins:460 - { reg: '$x0' }461 - { reg: '$x1' }462 - { reg: '$x2' }463frameInfo:464 maxAlignment: 1465 maxCallFrameSize: 0466machineFunctionInfo:467 hasRedZone: false468body: |469 bb.0.entry:470 liveins: $x0, $x1, $x2471 ; CHECK-LABEL: name: 17-strwpre-strwui-same-reg-no-merge472 ; CHECK: liveins: $x0, $x1, $x2473 ; CHECK: early-clobber renamable $x0 = STRWpre renamable $w1, renamable $x0, 24, implicit $w0, implicit $w0_hi, implicit-def $w0 :: (store (s32))474 ; CHECK: STRWui renamable $w0, renamable $x0, 1 :: (store (s32))475 ; CHECK: RET undef $lr, implicit $x0476 early-clobber renamable $x0 = STRWpre killed renamable $w1, killed renamable $x0, 24 :: (store (s32))477 STRWui renamable $w0, renamable $x0, 1 :: (store (s32))478 RET undef $lr, implicit $x0479 480...481