354 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc -mtriple=aarch64-apple-ios -verify-machineinstrs -global-isel -aarch64-enable-sink-fold=true -aarch64-postlegalizer-consecutive-memops=0 < %s | FileCheck %s --check-prefix=CHECK-NO-SPLIT3; RUN: llc -mtriple=aarch64-apple-ios -verify-machineinstrs -global-isel -aarch64-enable-sink-fold=true < %s | FileCheck %s --check-prefix=CHECK-SPLIT4 5define void @basic_split(ptr %p) {6; CHECK-NO-SPLIT-LABEL: basic_split:7; CHECK-NO-SPLIT: ; %bb.0:8; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]9; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8008]10; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8016]11; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8024]12; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8032]13; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8040]14; CHECK-NO-SPLIT-NEXT: ret15;16; CHECK-SPLIT-LABEL: basic_split:17; CHECK-SPLIT: ; %bb.0:18; CHECK-SPLIT-NEXT: mov w8, #8000 ; =0x1f4019; CHECK-SPLIT-NEXT: add x8, x0, x820; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8]21; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8, #16]22; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8, #32]23; CHECK-SPLIT-NEXT: ret24 %bigoffset = getelementptr i64, ptr %p, i64 100025 store i64 0, ptr %bigoffset26 %addr2 = getelementptr i64, ptr %p, i64 100127 store i64 0, ptr %addr228 %addr3 = getelementptr i64, ptr %p, i64 100229 store i64 0, ptr %addr330 %addr4 = getelementptr i64, ptr %p, i64 100331 store i64 0, ptr %addr432 %addr5 = getelementptr i64, ptr %p, i64 100433 store i64 0, ptr %addr534 %addr6 = getelementptr i64, ptr %p, i64 100535 store i64 0, ptr %addr636 ret void37}38 39define void @basic_multi_use_ptr(ptr %p, ptr %p2) {40; CHECK-NO-SPLIT-LABEL: basic_multi_use_ptr:41; CHECK-NO-SPLIT: ; %bb.0:42; CHECK-NO-SPLIT-NEXT: mov w8, #8008 ; =0x1f4843; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]44; CHECK-NO-SPLIT-NEXT: add x8, x0, x845; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8008]46; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8016]47; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8024]48; CHECK-NO-SPLIT-NEXT: str x8, [x1]49; CHECK-NO-SPLIT-NEXT: ret50;51; CHECK-SPLIT-LABEL: basic_multi_use_ptr:52; CHECK-SPLIT: ; %bb.0:53; CHECK-SPLIT-NEXT: mov w8, #8008 ; =0x1f4854; CHECK-SPLIT-NEXT: str xzr, [x0, #8000]55; CHECK-SPLIT-NEXT: add x8, x0, x856; CHECK-SPLIT-NEXT: str xzr, [x0, #8008]57; CHECK-SPLIT-NEXT: str xzr, [x0, #8016]58; CHECK-SPLIT-NEXT: str xzr, [x0, #8024]59; CHECK-SPLIT-NEXT: str x8, [x1]60; CHECK-SPLIT-NEXT: ret61 %bigoffset = getelementptr i64, ptr %p, i64 100062 store i64 0, ptr %bigoffset63 %addr2 = getelementptr i64, ptr %p, i64 100164 store i64 0, ptr %addr265 %addr3 = getelementptr i64, ptr %p, i64 100266 store i64 0, ptr %addr367 %addr4 = getelementptr i64, ptr %p, i64 100368 store i64 0, ptr %addr469 ; multiuse of %addr270 store ptr %addr2, ptr %p271 ret void72}73 74define void @not_consecutive(ptr %p) {75; CHECK-NO-SPLIT-LABEL: not_consecutive:76; CHECK-NO-SPLIT: ; %bb.0:77; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]78; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8008]79; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8024]80; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8032]81; CHECK-NO-SPLIT-NEXT: ret82;83; CHECK-SPLIT-LABEL: not_consecutive:84; CHECK-SPLIT: ; %bb.0:85; CHECK-SPLIT-NEXT: str xzr, [x0, #8000]86; CHECK-SPLIT-NEXT: str xzr, [x0, #8008]87; CHECK-SPLIT-NEXT: str xzr, [x0, #8024]88; CHECK-SPLIT-NEXT: str xzr, [x0, #8032]89; CHECK-SPLIT-NEXT: ret90 %bigoffset = getelementptr i64, ptr %p, i64 100091 store i64 0, ptr %bigoffset92 %addr2 = getelementptr i64, ptr %p, i64 100193 store i64 0, ptr %addr294 %addr3 = getelementptr i64, ptr %p, i64 100395 store i64 0, ptr %addr396 %addr4 = getelementptr i64, ptr %p, i64 100497 store i64 0, ptr %addr498 ret void99}100 101define void @early_store_is_invalid_but_split_rest(ptr %p) {102; CHECK-NO-SPLIT-LABEL: early_store_is_invalid_but_split_rest:103; CHECK-NO-SPLIT: ; %bb.0:104; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]105; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8080]106; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8016]107; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8024]108; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8032]109; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8040]110; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8048]111; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8056]112; CHECK-NO-SPLIT-NEXT: ret113;114; CHECK-SPLIT-LABEL: early_store_is_invalid_but_split_rest:115; CHECK-SPLIT: ; %bb.0:116; CHECK-SPLIT-NEXT: mov w8, #8016 ; =0x1f50117; CHECK-SPLIT-NEXT: str xzr, [x0, #8000]118; CHECK-SPLIT-NEXT: add x8, x0, x8119; CHECK-SPLIT-NEXT: str xzr, [x0, #8080]120; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8]121; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8, #16]122; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8, #32]123; CHECK-SPLIT-NEXT: ret124 %bigoffset = getelementptr i64, ptr %p, i64 1000125 store i64 0, ptr %bigoffset126 %addr2 = getelementptr i64, ptr %p, i64 1010127 store i64 0, ptr %addr2128 %addr3 = getelementptr i64, ptr %p, i64 1002129 store i64 0, ptr %addr3130 %addr4 = getelementptr i64, ptr %p, i64 1003131 store i64 0, ptr %addr4132 %addr5 = getelementptr i64, ptr %p, i64 1004133 store i64 0, ptr %addr5134 %addr6 = getelementptr i64, ptr %p, i64 1005135 store i64 0, ptr %addr6136 %addr7 = getelementptr i64, ptr %p, i64 1006137 store i64 0, ptr %addr7138 %addr8 = getelementptr i64, ptr %p, i64 1007139 store i64 0, ptr %addr8140 ret void141}142 143define void @vector(ptr %p) {144; CHECK-NO-SPLIT-LABEL: vector:145; CHECK-NO-SPLIT: ; %bb.0:146; CHECK-NO-SPLIT-NEXT: movi.2d v0, #0000000000000000147; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16000]148; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16016]149; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16032]150; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16048]151; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16064]152; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16080]153; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16096]154; CHECK-NO-SPLIT-NEXT: str q0, [x0, #16112]155; CHECK-NO-SPLIT-NEXT: ret156;157; CHECK-SPLIT-LABEL: vector:158; CHECK-SPLIT: ; %bb.0:159; CHECK-SPLIT-NEXT: movi.2d v0, #0000000000000000160; CHECK-SPLIT-NEXT: mov w8, #16000 ; =0x3e80161; CHECK-SPLIT-NEXT: add x8, x0, x8162; CHECK-SPLIT-NEXT: stp q0, q0, [x8]163; CHECK-SPLIT-NEXT: stp q0, q0, [x8, #32]164; CHECK-SPLIT-NEXT: stp q0, q0, [x8, #64]165; CHECK-SPLIT-NEXT: stp q0, q0, [x8, #96]166; CHECK-SPLIT-NEXT: ret167 %bigoffset = getelementptr <2 x i64>, ptr %p, i64 1000168 store <2 x i64> <i64 0, i64 0>, ptr %bigoffset169 %addr2 = getelementptr <2 x i64>, ptr %p, i64 1001170 store <2 x i64> <i64 0, i64 0>, ptr %addr2171 %addr3 = getelementptr <2 x i64>, ptr %p, i64 1002172 store <2 x i64> <i64 0, i64 0>, ptr %addr3173 %addr4 = getelementptr <2 x i64>, ptr %p, i64 1003174 store <2 x i64> <i64 0, i64 0>, ptr %addr4175 %addr5 = getelementptr <2 x i64>, ptr %p, i64 1004176 store <2 x i64> <i64 0, i64 0>, ptr %addr5177 %addr6 = getelementptr <2 x i64>, ptr %p, i64 1005178 store <2 x i64> <i64 0, i64 0>, ptr %addr6179 %addr7 = getelementptr <2 x i64>, ptr %p, i64 1006180 store <2 x i64> <i64 0, i64 0>, ptr %addr7181 %addr8 = getelementptr <2 x i64>, ptr %p, i64 1007182 store <2 x i64> <i64 0, i64 0>, ptr %addr8183 ret void184}185 186define void @can_already_form_stp(ptr %p) {187; CHECK-NO-SPLIT-LABEL: can_already_form_stp:188; CHECK-NO-SPLIT: ; %bb.0:189; CHECK-NO-SPLIT-NEXT: stp xzr, xzr, [x0, #80]190; CHECK-NO-SPLIT-NEXT: stp xzr, xzr, [x0, #96]191; CHECK-NO-SPLIT-NEXT: stp xzr, xzr, [x0, #112]192; CHECK-NO-SPLIT-NEXT: ret193;194; CHECK-SPLIT-LABEL: can_already_form_stp:195; CHECK-SPLIT: ; %bb.0:196; CHECK-SPLIT-NEXT: stp xzr, xzr, [x0, #80]197; CHECK-SPLIT-NEXT: stp xzr, xzr, [x0, #96]198; CHECK-SPLIT-NEXT: stp xzr, xzr, [x0, #112]199; CHECK-SPLIT-NEXT: ret200 %bigoffset = getelementptr i64, ptr %p, i64 10201 store i64 0, ptr %bigoffset202 %addr2 = getelementptr i64, ptr %p, i64 11203 store i64 0, ptr %addr2204 %addr3 = getelementptr i64, ptr %p, i64 12205 store i64 0, ptr %addr3206 %addr4 = getelementptr i64, ptr %p, i64 13207 store i64 0, ptr %addr4208 %addr5 = getelementptr i64, ptr %p, i64 14209 store i64 0, ptr %addr5210 %addr6 = getelementptr i64, ptr %p, i64 15211 store i64 0, ptr %addr6212 ret void213}214 215define void @use_of_load_in_between(ptr %p, ptr %ldptr, ptr %ldptr2) {216; CHECK-NO-SPLIT-LABEL: use_of_load_in_between:217; CHECK-NO-SPLIT: ; %bb.0:218; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]219; CHECK-NO-SPLIT-NEXT: ldr x8, [x1]220; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8016]221; CHECK-NO-SPLIT-NEXT: str x8, [x0, #8008]222; CHECK-NO-SPLIT-NEXT: ldr x8, [x2]223; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8032]224; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8040]225; CHECK-NO-SPLIT-NEXT: str x8, [x0, #8024]226; CHECK-NO-SPLIT-NEXT: ret227;228; CHECK-SPLIT-LABEL: use_of_load_in_between:229; CHECK-SPLIT: ; %bb.0:230; CHECK-SPLIT-NEXT: str xzr, [x0, #8000]231; CHECK-SPLIT-NEXT: ldr x8, [x1]232; CHECK-SPLIT-NEXT: str xzr, [x0, #8016]233; CHECK-SPLIT-NEXT: str x8, [x0, #8008]234; CHECK-SPLIT-NEXT: ldr x8, [x2]235; CHECK-SPLIT-NEXT: str xzr, [x0, #8032]236; CHECK-SPLIT-NEXT: str xzr, [x0, #8040]237; CHECK-SPLIT-NEXT: str x8, [x0, #8024]238; CHECK-SPLIT-NEXT: ret239 %bigoffset = getelementptr i64, ptr %p, i64 1000240 store i64 0, ptr %bigoffset241 %addr2 = getelementptr i64, ptr %p, i64 1001242 %ld = load i64, ptr %ldptr243 store i64 %ld, ptr %addr2244 %addr3 = getelementptr i64, ptr %p, i64 1002245 store i64 0, ptr %addr3246 %addr4 = getelementptr i64, ptr %p, i64 1003247 %ld2 = load i64, ptr %ldptr2248 store i64 %ld2, ptr %addr4249 %addr5 = getelementptr i64, ptr %p, i64 1004250 store i64 0, ptr %addr5251 %addr6 = getelementptr i64, ptr %p, i64 1005252 store i64 0, ptr %addr6253 ret void254}255 256define void @offset_legal_for_add_imm(ptr %p) {257; CHECK-NO-SPLIT-LABEL: offset_legal_for_add_imm:258; CHECK-NO-SPLIT: ; %bb.0:259; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3200]260; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3208]261; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3216]262; CHECK-NO-SPLIT-NEXT: ret263;264; CHECK-SPLIT-LABEL: offset_legal_for_add_imm:265; CHECK-SPLIT: ; %bb.0:266; CHECK-SPLIT-NEXT: add x8, x0, #3200267; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8]268; CHECK-SPLIT-NEXT: str xzr, [x8, #16]269; CHECK-SPLIT-NEXT: ret270 %bigoffset = getelementptr i64, ptr %p, i64 400271 store i64 0, ptr %bigoffset272 %addr2 = getelementptr i64, ptr %p, i64 401273 store i64 0, ptr %addr2274 %addr3 = getelementptr i64, ptr %p, i64 402275 store i64 0, ptr %addr3276 ret void277}278 279define void @offset_illegal_for_add_imm(ptr %p) {280; CHECK-NO-SPLIT-LABEL: offset_illegal_for_add_imm:281; CHECK-NO-SPLIT: ; %bb.0:282; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]283; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8008]284; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8016]285; CHECK-NO-SPLIT-NEXT: ret286;287; CHECK-SPLIT-LABEL: offset_illegal_for_add_imm:288; CHECK-SPLIT: ; %bb.0:289; CHECK-SPLIT-NEXT: str xzr, [x0, #8000]290; CHECK-SPLIT-NEXT: str xzr, [x0, #8008]291; CHECK-SPLIT-NEXT: str xzr, [x0, #8016]292; CHECK-SPLIT-NEXT: ret293 %bigoffset = getelementptr i64, ptr %p, i64 1000294 store i64 0, ptr %bigoffset295 %addr2 = getelementptr i64, ptr %p, i64 1001296 store i64 0, ptr %addr2297 %addr3 = getelementptr i64, ptr %p, i64 1002298 store i64 0, ptr %addr3299 ret void300}301 302define void @offset_legal_for_add_imm_4_stores(ptr %p) {303; CHECK-NO-SPLIT-LABEL: offset_legal_for_add_imm_4_stores:304; CHECK-NO-SPLIT: ; %bb.0:305; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3200]306; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3208]307; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3216]308; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #3224]309; CHECK-NO-SPLIT-NEXT: ret310;311; CHECK-SPLIT-LABEL: offset_legal_for_add_imm_4_stores:312; CHECK-SPLIT: ; %bb.0:313; CHECK-SPLIT-NEXT: add x8, x0, #3200314; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8]315; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8, #16]316; CHECK-SPLIT-NEXT: ret317 %bigoffset = getelementptr i64, ptr %p, i64 400318 store i64 0, ptr %bigoffset319 %addr2 = getelementptr i64, ptr %p, i64 401320 store i64 0, ptr %addr2321 %addr3 = getelementptr i64, ptr %p, i64 402322 store i64 0, ptr %addr3323 %addr4 = getelementptr i64, ptr %p, i64 403324 store i64 0, ptr %addr4325 ret void326}327 328define void @offset_illegal_for_add_imm_4_stores(ptr %p) {329; CHECK-NO-SPLIT-LABEL: offset_illegal_for_add_imm_4_stores:330; CHECK-NO-SPLIT: ; %bb.0:331; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8000]332; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8008]333; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8016]334; CHECK-NO-SPLIT-NEXT: str xzr, [x0, #8024]335; CHECK-NO-SPLIT-NEXT: ret336;337; CHECK-SPLIT-LABEL: offset_illegal_for_add_imm_4_stores:338; CHECK-SPLIT: ; %bb.0:339; CHECK-SPLIT-NEXT: mov w8, #8000 ; =0x1f40340; CHECK-SPLIT-NEXT: add x8, x0, x8341; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8]342; CHECK-SPLIT-NEXT: stp xzr, xzr, [x8, #16]343; CHECK-SPLIT-NEXT: ret344 %bigoffset = getelementptr i64, ptr %p, i64 1000345 store i64 0, ptr %bigoffset346 %addr2 = getelementptr i64, ptr %p, i64 1001347 store i64 0, ptr %addr2348 %addr3 = getelementptr i64, ptr %p, i64 1002349 store i64 0, ptr %addr3350 %addr4 = getelementptr i64, ptr %p, i64 1003351 store i64 0, ptr %addr4352 ret void353}354