brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.8 KiB · 2c2d72c Raw
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