brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · 1b22514 Raw
268 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -aarch64-load-store-renaming=true -aarch64-enable-sink-fold=true < %s -mtriple=arm64-apple-ios7.0.0 -mcpu=cyclone -enable-misched=false | FileCheck %s3 4; rdar://136255055; Here we have 9 fixed integer arguments the 9th argument in on stack, the6; varargs start right after at 8-byte alignment.7define void @fn9(ptr %a1, i32 %a2, i32 %a3, i32 %a4, i32 %a5, i32 %a6, i32 %a7, i32 %a8, i32 %a9, ...) nounwind noinline ssp {8; CHECK-LABEL: fn9:9; CHECK:       ; %bb.0:10; CHECK-NEXT:    sub sp, sp, #6411; CHECK-NEXT:    ldr w8, [sp, #64]12; CHECK-NEXT:    stp w2, w1, [sp, #52]13; CHECK-NEXT:    stp w4, w3, [sp, #44]14; CHECK-NEXT:    stp w6, w5, [sp, #36]15; CHECK-NEXT:    str w7, [sp, #32]16; CHECK-NEXT:    str w8, [x0]17; CHECK-NEXT:    add x8, sp, #7218; CHECK-NEXT:    add x8, x8, #819; CHECK-NEXT:    ldr w9, [sp, #72]20; CHECK-NEXT:    str w9, [sp, #20]21; CHECK-NEXT:    ldr w9, [x8], #822; CHECK-NEXT:    str w9, [sp, #16]23; CHECK-NEXT:    ldr w9, [x8], #824; CHECK-NEXT:    str x8, [sp, #24]25; CHECK-NEXT:    str w9, [sp, #12]26; CHECK-NEXT:    add sp, sp, #6427; CHECK-NEXT:    ret28  %1 = alloca i32, align 429  %2 = alloca i32, align 430  %3 = alloca i32, align 431  %4 = alloca i32, align 432  %5 = alloca i32, align 433  %6 = alloca i32, align 434  %7 = alloca i32, align 435  %8 = alloca i32, align 436  %9 = alloca i32, align 437  %args = alloca ptr, align 838  %a10 = alloca i32, align 439  %a11 = alloca i32, align 440  %a12 = alloca i32, align 441  store i32 %a2, ptr %2, align 442  store i32 %a3, ptr %3, align 443  store i32 %a4, ptr %4, align 444  store i32 %a5, ptr %5, align 445  store i32 %a6, ptr %6, align 446  store i32 %a7, ptr %7, align 447  store i32 %a8, ptr %8, align 448  store i32 %a9, ptr %9, align 449  store i32 %a9, ptr %a150  call void @llvm.va_start(ptr %args)51  %10 = va_arg ptr %args, i3252  store i32 %10, ptr %a10, align 453  %11 = va_arg ptr %args, i3254  store i32 %11, ptr %a11, align 455  %12 = va_arg ptr %args, i3256  store i32 %12, ptr %a12, align 457  ret void58}59 60declare void @llvm.va_start(ptr) nounwind61 62define i32 @main() nounwind ssp {63; CHECK-LABEL: main:64; CHECK:       ; %bb.0:65; CHECK-NEXT:    sub sp, sp, #9666; CHECK-NEXT:    stp x29, x30, [sp, #80] ; 16-byte Folded Spill67; CHECK-NEXT:    mov w9, #1 ; =0x168; CHECK-NEXT:    mov w8, #2 ; =0x269; CHECK-NEXT:    stp w8, w9, [sp, #72]70; CHECK-NEXT:    mov w9, #3 ; =0x371; CHECK-NEXT:    mov w8, #4 ; =0x472; CHECK-NEXT:    stp w8, w9, [sp, #64]73; CHECK-NEXT:    mov w9, #5 ; =0x574; CHECK-NEXT:    mov w8, #6 ; =0x675; CHECK-NEXT:    stp w8, w9, [sp, #56]76; CHECK-NEXT:    mov w9, #7 ; =0x777; CHECK-NEXT:    mov w8, #8 ; =0x878; CHECK-NEXT:    stp w8, w9, [sp, #48]79; CHECK-NEXT:    mov w8, #9 ; =0x980; CHECK-NEXT:    mov w9, #10 ; =0xa81; CHECK-NEXT:    stp w9, w8, [sp, #40]82; CHECK-NEXT:    mov w10, #11 ; =0xb83; CHECK-NEXT:    mov w11, #12 ; =0xc84; CHECK-NEXT:    stp w11, w10, [sp, #32]85; CHECK-NEXT:    stp x10, x11, [sp, #16]86; CHECK-NEXT:    str x9, [sp, #8]87; CHECK-NEXT:    str w8, [sp]88; CHECK-NEXT:    add x0, sp, #7689; CHECK-NEXT:    mov w1, #2 ; =0x290; CHECK-NEXT:    mov w2, #3 ; =0x391; CHECK-NEXT:    mov w3, #4 ; =0x492; CHECK-NEXT:    mov w4, #5 ; =0x593; CHECK-NEXT:    mov w5, #6 ; =0x694; CHECK-NEXT:    mov w6, #7 ; =0x795; CHECK-NEXT:    mov w7, #8 ; =0x896; CHECK-NEXT:    bl _fn997; CHECK-NEXT:    mov w0, #0 ; =0x098; CHECK-NEXT:    ldp x29, x30, [sp, #80] ; 16-byte Folded Reload99; CHECK-NEXT:    add sp, sp, #96100; CHECK-NEXT:    ret101  %a1 = alloca i32, align 4102  %a2 = alloca i32, align 4103  %a3 = alloca i32, align 4104  %a4 = alloca i32, align 4105  %a5 = alloca i32, align 4106  %a6 = alloca i32, align 4107  %a7 = alloca i32, align 4108  %a8 = alloca i32, align 4109  %a9 = alloca i32, align 4110  %a10 = alloca i32, align 4111  %a11 = alloca i32, align 4112  %a12 = alloca i32, align 4113  store i32 1, ptr %a1, align 4114  store i32 2, ptr %a2, align 4115  store i32 3, ptr %a3, align 4116  store i32 4, ptr %a4, align 4117  store i32 5, ptr %a5, align 4118  store i32 6, ptr %a6, align 4119  store i32 7, ptr %a7, align 4120  store i32 8, ptr %a8, align 4121  store i32 9, ptr %a9, align 4122  store i32 10, ptr %a10, align 4123  store i32 11, ptr %a11, align 4124  store i32 12, ptr %a12, align 4125  %1 = load i32, ptr %a1, align 4126  %2 = load i32, ptr %a2, align 4127  %3 = load i32, ptr %a3, align 4128  %4 = load i32, ptr %a4, align 4129  %5 = load i32, ptr %a5, align 4130  %6 = load i32, ptr %a6, align 4131  %7 = load i32, ptr %a7, align 4132  %8 = load i32, ptr %a8, align 4133  %9 = load i32, ptr %a9, align 4134  %10 = load i32, ptr %a10, align 4135  %11 = load i32, ptr %a11, align 4136  %12 = load i32, ptr %a12, align 4137  call void (ptr, i32, i32, i32, i32, i32, i32, i32, i32, ...) @fn9(ptr %a1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12)138  ret i32 0139}140 141;rdar://13668483142@.str = private unnamed_addr constant [4 x i8] c"fmt\00", align 1143define void @foo(ptr %fmt, ...) nounwind {144; CHECK-LABEL: foo:145; CHECK:       ; %bb.0: ; %entry146; CHECK-NEXT:    sub sp, sp, #48147; CHECK-NEXT:    ldr w8, [sp, #48]148; CHECK-NEXT:    str w8, [sp, #28]149; CHECK-NEXT:    add x8, sp, #48150; CHECK-NEXT:    add x8, x8, #23151; CHECK-NEXT:    and x8, x8, #0xfffffffffffffff0152; CHECK-NEXT:    add x9, x8, #16153; CHECK-NEXT:    stp x9, x0, [sp, #32]154; CHECK-NEXT:    ldr q0, [x8]155; CHECK-NEXT:    str q0, [sp], #48156; CHECK-NEXT:    ret157entry:158  %fmt.addr = alloca ptr, align 8159  %args = alloca ptr, align 8160  %vc = alloca i32, align 4161  %vv = alloca <4 x i32>, align 16162  store ptr %fmt, ptr %fmt.addr, align 8163  call void @llvm.va_start(ptr %args)164  %0 = va_arg ptr %args, i32165  store i32 %0, ptr %vc, align 4166  %1 = va_arg ptr %args, <4 x i32>167  store <4 x i32> %1, ptr %vv, align 16168  ret void169}170 171define void @bar(i32 %x, <4 x i32> %y) nounwind {172; CHECK-LABEL: bar:173; CHECK:       ; %bb.0: ; %entry174; CHECK-NEXT:    sub sp, sp, #80175; CHECK-NEXT:    stp x29, x30, [sp, #64] ; 16-byte Folded Spill176; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0177; CHECK-NEXT:    str w0, [sp, #60]178; CHECK-NEXT:    stp q0, q0, [sp, #16]179; CHECK-NEXT:    str x0, [sp]180; CHECK-NEXT:  Lloh0:181; CHECK-NEXT:    adrp x0, l_.str@PAGE182; CHECK-NEXT:  Lloh1:183; CHECK-NEXT:    add x0, x0, l_.str@PAGEOFF184; CHECK-NEXT:    bl _foo185; CHECK-NEXT:    ldp x29, x30, [sp, #64] ; 16-byte Folded Reload186; CHECK-NEXT:    add sp, sp, #80187; CHECK-NEXT:    ret188; CHECK-NEXT:    .loh AdrpAdd Lloh0, Lloh1189entry:190  %x.addr = alloca i32, align 4191  %y.addr = alloca <4 x i32>, align 16192  store i32 %x, ptr %x.addr, align 4193  store <4 x i32> %y, ptr %y.addr, align 16194  %0 = load i32, ptr %x.addr, align 4195  %1 = load <4 x i32>, ptr %y.addr, align 16196  call void (ptr, ...) @foo(ptr @.str, i32 %0, <4 x i32> %1)197  ret void198}199 200; rdar://13668927201; When passing 16-byte aligned small structs as vararg, make sure the caller202; side is 16-byte aligned on stack.203%struct.s41 = type { i32, i16, i32, i16 }204define void @foo2(ptr %fmt, ...) nounwind {205; CHECK-LABEL: foo2:206; CHECK:       ; %bb.0: ; %entry207; CHECK-NEXT:    sub sp, sp, #48208; CHECK-NEXT:    ldr w8, [sp, #48]209; CHECK-NEXT:    str w8, [sp, #28]210; CHECK-NEXT:    add x8, sp, #48211; CHECK-NEXT:    add x8, x8, #23212; CHECK-NEXT:    and x8, x8, #0xfffffffffffffff0213; CHECK-NEXT:    add x9, x8, #16214; CHECK-NEXT:    stp x9, x0, [sp, #32]215; CHECK-NEXT:    ldr q0, [x8]216; CHECK-NEXT:    str q0, [sp], #48217; CHECK-NEXT:    ret218entry:219  %fmt.addr = alloca ptr, align 8220  %args = alloca ptr, align 8221  %vc = alloca i32, align 4222  %vs = alloca %struct.s41, align 16223  store ptr %fmt, ptr %fmt.addr, align 8224  call void @llvm.va_start(ptr %args)225  %0 = va_arg ptr %args, i32226  store i32 %0, ptr %vc, align 4227  %ap.cur = load ptr, ptr %args228  %1 = getelementptr i8, ptr %ap.cur, i32 15229  %2 = ptrtoint ptr %1 to i64230  %3 = and i64 %2, -16231  %ap.align = inttoptr i64 %3 to ptr232  %ap.next = getelementptr i8, ptr %ap.align, i32 16233  store ptr %ap.next, ptr %args234  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %vs, ptr align 16 %ap.align, i64 16, i1 false)235  ret void236}237declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind238 239define void @bar2(i32 %x, i128 %s41.coerce) nounwind {240; CHECK-LABEL: bar2:241; CHECK:       ; %bb.0: ; %entry242; CHECK-NEXT:    sub sp, sp, #80243; CHECK-NEXT:    stp x29, x30, [sp, #64] ; 16-byte Folded Spill244; CHECK-NEXT:    ; kill: def $w0 killed $w0 def $x0245; CHECK-NEXT:    str w0, [sp, #60]246; CHECK-NEXT:    stp x1, x2, [sp, #32]247; CHECK-NEXT:    stp x1, x2, [sp, #16]248; CHECK-NEXT:    str x0, [sp]249; CHECK-NEXT:  Lloh2:250; CHECK-NEXT:    adrp x0, l_.str@PAGE251; CHECK-NEXT:  Lloh3:252; CHECK-NEXT:    add x0, x0, l_.str@PAGEOFF253; CHECK-NEXT:    bl _foo2254; CHECK-NEXT:    ldp x29, x30, [sp, #64] ; 16-byte Folded Reload255; CHECK-NEXT:    add sp, sp, #80256; CHECK-NEXT:    ret257; CHECK-NEXT:    .loh AdrpAdd Lloh2, Lloh3258entry:259  %x.addr = alloca i32, align 4260  %s41 = alloca %struct.s41, align 16261  store i32 %x, ptr %x.addr, align 4262  store i128 %s41.coerce, ptr %s41, align 1263  %0 = load i32, ptr %x.addr, align 4264  %1 = load i128, ptr %s41, align 1265  call void (ptr, ...) @foo2(ptr @.str, i32 %0, i128 %1)266  ret void267}268