brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · b531f00 Raw
108 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -mcpu=skylake < %s | FileCheck %s3 4target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-pc-linux-gnu"6 7; Shows a case where we spill a 32 byte value onto a stack which is only8; 16 byte aligned.  With stack realignment, we can use an aligned spill slot9; (if we think it's profitable), but without realignment, using a stack10; slot which is 32 byte aligned or a store which expects 32 byte alignment11; is incorrect.12 13declare void @foo()14define void @can_realign(ptr %p) {15; CHECK-LABEL: can_realign:16; CHECK:       # %bb.0:17; CHECK-NEXT:    pushq %rbp18; CHECK-NEXT:    .cfi_def_cfa_offset 1619; CHECK-NEXT:    .cfi_offset %rbp, -1620; CHECK-NEXT:    movq %rsp, %rbp21; CHECK-NEXT:    .cfi_def_cfa_register %rbp22; CHECK-NEXT:    andq $-32, %rsp23; CHECK-NEXT:    subq $64, %rsp24; CHECK-NEXT:    vmovaps (%rdi), %ymm025; CHECK-NEXT:    vmovaps %ymm0, (%rsp)26; CHECK-NEXT:    vzeroupper27; CHECK-NEXT:    callq foo@PLT28; CHECK-NEXT:  .Ltmp0:29; CHECK-NEXT:    movq %rbp, %rsp30; CHECK-NEXT:    popq %rbp31; CHECK-NEXT:    .cfi_def_cfa %rsp, 832; CHECK-NEXT:    retq33  %val = load <8 x i32>, ptr %p, align 3234  call void @foo() ["deopt" (<8 x i32> %val)]35  ret void36}37 38define void @no_realign(ptr %p) "no-realign-stack" {39; CHECK-LABEL: no_realign:40; CHECK:       # %bb.0:41; CHECK-NEXT:    subq $40, %rsp42; CHECK-NEXT:    .cfi_def_cfa_offset 4843; CHECK-NEXT:    vmovaps (%rdi), %ymm044; CHECK-NEXT:    vmovups %ymm0, (%rsp)45; CHECK-NEXT:    vzeroupper46; CHECK-NEXT:    callq foo@PLT47; CHECK-NEXT:  .Ltmp1:48; CHECK-NEXT:    addq $40, %rsp49; CHECK-NEXT:    .cfi_def_cfa_offset 850; CHECK-NEXT:    retq51  %val = load <8 x i32>, ptr %p, align 3252  call void @foo() ["deopt" (<8 x i32> %val)]53  ret void54}55 56;; Next batch are similiar to the above, but require a reload of the57;; spilled value as well.58 59define <4 x ptr addrspace(1)> @spillfill_can_realign(<4 x ptr addrspace(1)> %obj) gc "statepoint-example" {60; CHECK-LABEL: spillfill_can_realign:61; CHECK:       # %bb.0: # %entry62; CHECK-NEXT:    pushq %rbp63; CHECK-NEXT:    .cfi_def_cfa_offset 1664; CHECK-NEXT:    .cfi_offset %rbp, -1665; CHECK-NEXT:    movq %rsp, %rbp66; CHECK-NEXT:    .cfi_def_cfa_register %rbp67; CHECK-NEXT:    andq $-32, %rsp68; CHECK-NEXT:    subq $64, %rsp69; CHECK-NEXT:    vmovaps %ymm0, (%rsp)70; CHECK-NEXT:    vzeroupper71; CHECK-NEXT:    callq do_safepoint@PLT72; CHECK-NEXT:  .Ltmp2:73; CHECK-NEXT:    vmovaps (%rsp), %ymm074; CHECK-NEXT:    movq %rbp, %rsp75; CHECK-NEXT:    popq %rbp76; CHECK-NEXT:    .cfi_def_cfa %rsp, 877; CHECK-NEXT:    retq78entry:79  %safepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @do_safepoint, i32 0, i32 0, i32 0, i32 0) ["gc-live" (<4 x ptr addrspace(1)> %obj)]80  %obj.relocated = call coldcc <4 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v4p1(token %safepoint_token, i32 0, i32 0) ; (%obj, %obj)81  ret <4 x ptr addrspace(1)> %obj.relocated82}83 84define <4 x ptr addrspace(1)> @spillfill_no_realign(<4 x ptr addrspace(1)> %obj) "no-realign-stack" gc "statepoint-example" {85; CHECK-LABEL: spillfill_no_realign:86; CHECK:       # %bb.0: # %entry87; CHECK-NEXT:    subq $40, %rsp88; CHECK-NEXT:    .cfi_def_cfa_offset 4889; CHECK-NEXT:    vmovups %ymm0, (%rsp)90; CHECK-NEXT:    vzeroupper91; CHECK-NEXT:    callq do_safepoint@PLT92; CHECK-NEXT:  .Ltmp3:93; CHECK-NEXT:    vmovups (%rsp), %ymm094; CHECK-NEXT:    addq $40, %rsp95; CHECK-NEXT:    .cfi_def_cfa_offset 896; CHECK-NEXT:    retq97entry:98  %safepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @do_safepoint, i32 0, i32 0, i32 0, i32 0) ["gc-live" (<4 x ptr addrspace(1)> %obj)]99  %obj.relocated = call coldcc <4 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v4p1(token %safepoint_token, i32 0, i32 0) ; (%obj, %obj)100  ret <4 x ptr addrspace(1)> %obj.relocated101}102 103declare void @do_safepoint()104 105declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)106declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32)107declare <4 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v4p1(token, i32, i32)108