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