915 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs -O3 -use-registers-for-deopt-values -restrict-statepoint-remat=true < %s | FileCheck %s3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"4target triple = "x86_64-apple-macosx10.11.0"5 6declare void @bar() #07declare void @baz()8 9; Spill caller saved register for %a.10define void @test1(i32 %a) gc "statepoint-example" {11; CHECK-LABEL: test1:12; CHECK: ## %bb.0: ## %entry13; CHECK-NEXT: pushq %rbx14; CHECK-NEXT: .cfi_def_cfa_offset 1615; CHECK-NEXT: .cfi_offset %rbx, -1616; CHECK-NEXT: movl %edi, %ebx17; CHECK-NEXT: callq _bar18; CHECK-NEXT: Ltmp0:19; CHECK-NEXT: popq %rbx20; CHECK-NEXT: retq21entry:22 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a)]23 ret void24}25 26; Callee save registers are ok.27define void @test2(i32 %a, i32 %b) gc "statepoint-example" {28; CHECK-LABEL: test2:29; CHECK: ## %bb.0: ## %entry30; CHECK-NEXT: pushq %rbp31; CHECK-NEXT: .cfi_def_cfa_offset 1632; CHECK-NEXT: pushq %rbx33; CHECK-NEXT: .cfi_def_cfa_offset 2434; CHECK-NEXT: pushq %rax35; CHECK-NEXT: .cfi_def_cfa_offset 3236; CHECK-NEXT: .cfi_offset %rbx, -2437; CHECK-NEXT: .cfi_offset %rbp, -1638; CHECK-NEXT: movl %esi, %ebx39; CHECK-NEXT: movl %edi, %ebp40; CHECK-NEXT: callq _bar41; CHECK-NEXT: Ltmp1:42; CHECK-NEXT: callq _bar43; CHECK-NEXT: Ltmp2:44; CHECK-NEXT: addq $8, %rsp45; CHECK-NEXT: popq %rbx46; CHECK-NEXT: popq %rbp47; CHECK-NEXT: retq48entry:49 call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a, i32 %b)]50 call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %b, i32 %a)]51 ret void52}53 54; Arguments in caller saved registers, so they must be spilled.55define void @test3(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i) gc "statepoint-example" {56; CHECK-LABEL: test3:57; CHECK: ## %bb.0: ## %entry58; CHECK-NEXT: pushq %rbp59; CHECK-NEXT: .cfi_def_cfa_offset 1660; CHECK-NEXT: pushq %r1561; CHECK-NEXT: .cfi_def_cfa_offset 2462; CHECK-NEXT: pushq %r1463; CHECK-NEXT: .cfi_def_cfa_offset 3264; CHECK-NEXT: pushq %r1365; CHECK-NEXT: .cfi_def_cfa_offset 4066; CHECK-NEXT: pushq %r1267; CHECK-NEXT: .cfi_def_cfa_offset 4868; CHECK-NEXT: pushq %rbx69; CHECK-NEXT: .cfi_def_cfa_offset 5670; CHECK-NEXT: pushq %rax71; CHECK-NEXT: .cfi_def_cfa_offset 6472; CHECK-NEXT: .cfi_offset %rbx, -5673; CHECK-NEXT: .cfi_offset %r12, -4874; CHECK-NEXT: .cfi_offset %r13, -4075; CHECK-NEXT: .cfi_offset %r14, -3276; CHECK-NEXT: .cfi_offset %r15, -2477; CHECK-NEXT: .cfi_offset %rbp, -1678; CHECK-NEXT: movl %r9d, %ebx79; CHECK-NEXT: movl %r8d, %ebp80; CHECK-NEXT: movl %ecx, %r14d81; CHECK-NEXT: movl %edx, %r15d82; CHECK-NEXT: movl %esi, %r12d83; CHECK-NEXT: movl %edi, %r13d84; CHECK-NEXT: callq _bar85; CHECK-NEXT: Ltmp3:86; CHECK-NEXT: addq $8, %rsp87; CHECK-NEXT: popq %rbx88; CHECK-NEXT: popq %r1289; CHECK-NEXT: popq %r1390; CHECK-NEXT: popq %r1491; CHECK-NEXT: popq %r1592; CHECK-NEXT: popq %rbp93; CHECK-NEXT: retq94entry:95 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i)]96 ret void97}98 99; This case just confirms that we don't crash when given more live values100; than registers. This is a case where we *have* to use a stack slot. This101; also ends up being a good test of whether we can fold loads from immutable102; stack slots into the statepoint.103define void @test4(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z) gc "statepoint-example" {104; CHECK-LABEL: test4:105; CHECK: ## %bb.0: ## %entry106; CHECK-NEXT: pushq %rbp107; CHECK-NEXT: .cfi_def_cfa_offset 16108; CHECK-NEXT: pushq %r15109; CHECK-NEXT: .cfi_def_cfa_offset 24110; CHECK-NEXT: pushq %r14111; CHECK-NEXT: .cfi_def_cfa_offset 32112; CHECK-NEXT: pushq %r13113; CHECK-NEXT: .cfi_def_cfa_offset 40114; CHECK-NEXT: pushq %r12115; CHECK-NEXT: .cfi_def_cfa_offset 48116; CHECK-NEXT: pushq %rbx117; CHECK-NEXT: .cfi_def_cfa_offset 56118; CHECK-NEXT: pushq %rax119; CHECK-NEXT: .cfi_def_cfa_offset 64120; CHECK-NEXT: .cfi_offset %rbx, -56121; CHECK-NEXT: .cfi_offset %r12, -48122; CHECK-NEXT: .cfi_offset %r13, -40123; CHECK-NEXT: .cfi_offset %r14, -32124; CHECK-NEXT: .cfi_offset %r15, -24125; CHECK-NEXT: .cfi_offset %rbp, -16126; CHECK-NEXT: movl %r9d, %ebx127; CHECK-NEXT: movl %r8d, %ebp128; CHECK-NEXT: movl %ecx, %r14d129; CHECK-NEXT: movl %edx, %r15d130; CHECK-NEXT: movl %esi, %r12d131; CHECK-NEXT: movl %edi, %r13d132; CHECK-NEXT: callq _bar133; CHECK-NEXT: Ltmp4:134; CHECK-NEXT: addq $8, %rsp135; CHECK-NEXT: popq %rbx136; CHECK-NEXT: popq %r12137; CHECK-NEXT: popq %r13138; CHECK-NEXT: popq %r14139; CHECK-NEXT: popq %r15140; CHECK-NEXT: popq %rbp141; CHECK-NEXT: retq142entry:143 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z)]144 ret void145}146 147; A gc-value must be spilled even if it is also a deopt value.148define ptr addrspace(1) @test5(i32 %a, ptr addrspace(1) %p) gc "statepoint-example" {149; CHECK-LABEL: test5:150; CHECK: ## %bb.0: ## %entry151; CHECK-NEXT: pushq %rbx152; CHECK-NEXT: .cfi_def_cfa_offset 16153; CHECK-NEXT: subq $16, %rsp154; CHECK-NEXT: .cfi_def_cfa_offset 32155; CHECK-NEXT: .cfi_offset %rbx, -16156; CHECK-NEXT: movl %edi, %ebx157; CHECK-NEXT: movq %rsi, {{[0-9]+}}(%rsp)158; CHECK-NEXT: callq _bar159; CHECK-NEXT: Ltmp5:160; CHECK-NEXT: callq _bar161; CHECK-NEXT: Ltmp6:162; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax163; CHECK-NEXT: addq $16, %rsp164; CHECK-NEXT: popq %rbx165; CHECK-NEXT: retq166entry:167 %token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %p, ptr addrspace(1) %p), "deopt"(i32 %a)]168 %p2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %token, i32 1, i32 1)169 %token2 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %p2, ptr addrspace(1) %p2), "deopt"(i32 %a)]170 %p3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %token2, i32 1, i32 1)171 ret ptr addrspace(1) %p3172}173 174; Callee saved are ok again.175define void @test6(i32 %a) gc "statepoint-example" {176; CHECK-LABEL: test6:177; CHECK: ## %bb.0: ## %entry178; CHECK-NEXT: pushq %rbx179; CHECK-NEXT: .cfi_def_cfa_offset 16180; CHECK-NEXT: .cfi_offset %rbx, -16181; CHECK-NEXT: movl %edi, %ebx182; CHECK-NEXT: callq _baz183; CHECK-NEXT: Ltmp7:184; CHECK-NEXT: callq _bar185; CHECK-NEXT: Ltmp8:186; CHECK-NEXT: popq %rbx187; CHECK-NEXT: retq188entry:189 call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @baz, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a)]190 call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a)]191 ret void192}193 194; Many deopt values.195define void @test7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z) gc "statepoint-example" {196; The code for this is terrible, check simply for correctness for the moment197; CHECK-LABEL: test7:198; CHECK: ## %bb.0: ## %entry199; CHECK-NEXT: pushq %rbp200; CHECK-NEXT: .cfi_def_cfa_offset 16201; CHECK-NEXT: pushq %r15202; CHECK-NEXT: .cfi_def_cfa_offset 24203; CHECK-NEXT: pushq %r14204; CHECK-NEXT: .cfi_def_cfa_offset 32205; CHECK-NEXT: pushq %r13206; CHECK-NEXT: .cfi_def_cfa_offset 40207; CHECK-NEXT: pushq %r12208; CHECK-NEXT: .cfi_def_cfa_offset 48209; CHECK-NEXT: pushq %rbx210; CHECK-NEXT: .cfi_def_cfa_offset 56211; CHECK-NEXT: subq $168, %rsp212; CHECK-NEXT: .cfi_def_cfa_offset 224213; CHECK-NEXT: .cfi_offset %rbx, -56214; CHECK-NEXT: .cfi_offset %r12, -48215; CHECK-NEXT: .cfi_offset %r13, -40216; CHECK-NEXT: .cfi_offset %r14, -32217; CHECK-NEXT: .cfi_offset %r15, -24218; CHECK-NEXT: .cfi_offset %rbp, -16219; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax220; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill221; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax222; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill223; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax224; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill225; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax226; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill227; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax228; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill229; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax230; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill231; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax232; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill233; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax234; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill235; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax236; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill237; CHECK-NEXT: movl %edi, %r12d238; CHECK-NEXT: movl %esi, %r13d239; CHECK-NEXT: movl %edx, %ebp240; CHECK-NEXT: movl %ecx, %ebx241; CHECK-NEXT: movl %r8d, %r14d242; CHECK-NEXT: movl %r9d, %r15d243; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax244; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill245; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax246; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill247; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax248; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill249; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax250; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill251; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax252; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill253; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax254; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill255; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax256; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill257; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax258; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill259; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax260; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill261; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax262; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill263; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax264; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill265; CHECK-NEXT: callq _bar ## 160-byte Folded Reload266; CHECK-NEXT: Ltmp9:267; CHECK-NEXT: addq $168, %rsp268; CHECK-NEXT: popq %rbx269; CHECK-NEXT: popq %r12270; CHECK-NEXT: popq %r13271; CHECK-NEXT: popq %r14272; CHECK-NEXT: popq %r15273; CHECK-NEXT: popq %rbp274; CHECK-NEXT: retq275entry:276 %a64 = zext i32 %a to i64277 %b64 = zext i32 %b to i64278 %c64 = zext i32 %c to i64279 %d64 = zext i32 %d to i64280 %e64 = zext i32 %e to i64281 %f64 = zext i32 %f to i64282 %g64 = zext i32 %g to i64283 %h64 = zext i32 %h to i64284 %i64 = zext i32 %i to i64285 %j64 = zext i32 %j to i64286 %k64 = zext i32 %k to i64287 %l64 = zext i32 %l to i64288 %m64 = zext i32 %m to i64289 %n64 = zext i32 %n to i64290 %o64 = zext i32 %o to i64291 %p64 = zext i32 %p to i64292 %q64 = zext i32 %q to i64293 %r64 = zext i32 %r to i64294 %s64 = zext i32 %s to i64295 %t64 = zext i32 %t to i64296 %u64 = zext i32 %u to i64297 %v64 = zext i32 %v to i64298 %w64 = zext i32 %w to i64299 %x64 = zext i32 %x to i64300 %y64 = zext i32 %y to i64301 %z64 = zext i32 %z to i64302 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i64 %a64, i64 %b64, i64 %c64, i64 %d64, i64 %e64, i64 %f64, i64 %g64, i64 %h64, i64 %i64, i64 %j64, i64 %k64, i64 %l64, i64 %m64, i64 %n64, i64 %o64, i64 %p64, i64 %q64, i64 %r64, i64 %s64, i64 %t64, i64 %u64, i64 %v64, i64 %w64, i64 %x64, i64 %y64, i64 %z64)]303 ret void304}305 306; a variant of test7 with mixed types chosen to exercise register aliases307define void @test8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z) gc "statepoint-example" {308; The code for this is terrible, check simply for correctness for the moment309; CHECK-LABEL: test8:310; CHECK: ## %bb.0: ## %entry311; CHECK-NEXT: pushq %rbp312; CHECK-NEXT: .cfi_def_cfa_offset 16313; CHECK-NEXT: pushq %r15314; CHECK-NEXT: .cfi_def_cfa_offset 24315; CHECK-NEXT: pushq %r14316; CHECK-NEXT: .cfi_def_cfa_offset 32317; CHECK-NEXT: pushq %r13318; CHECK-NEXT: .cfi_def_cfa_offset 40319; CHECK-NEXT: pushq %r12320; CHECK-NEXT: .cfi_def_cfa_offset 48321; CHECK-NEXT: pushq %rbx322; CHECK-NEXT: .cfi_def_cfa_offset 56323; CHECK-NEXT: subq $136, %rsp324; CHECK-NEXT: .cfi_def_cfa_offset 192325; CHECK-NEXT: .cfi_offset %rbx, -56326; CHECK-NEXT: .cfi_offset %r12, -48327; CHECK-NEXT: .cfi_offset %r13, -40328; CHECK-NEXT: .cfi_offset %r14, -32329; CHECK-NEXT: .cfi_offset %r15, -24330; CHECK-NEXT: .cfi_offset %rbp, -16331; CHECK-NEXT: movl %r9d, {{[-0-9]+}}(%r{{[sb]}}p) ## 4-byte Spill332; CHECK-NEXT: movl %r8d, (%rsp) ## 4-byte Spill333; CHECK-NEXT: movl %ecx, %r14d334; CHECK-NEXT: movl %edx, %r15d335; CHECK-NEXT: movl %esi, %r12d336; CHECK-NEXT: movl %edi, %r13d337; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax338; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill339; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax340; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill341; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax342; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill343; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax344; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill345; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax346; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill347; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax348; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill349; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax350; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill351; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax352; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill353; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax354; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill355; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax356; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill357; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax358; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill359; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax360; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill361; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax362; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill363; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax364; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill365; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax366; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill367; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax368; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill369; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %ebx370; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %ebp371; CHECK-NEXT: callq _bar ## 132-byte Folded Reload372; CHECK-NEXT: Ltmp10:373; CHECK-NEXT: addq $136, %rsp374; CHECK-NEXT: popq %rbx375; CHECK-NEXT: popq %r12376; CHECK-NEXT: popq %r13377; CHECK-NEXT: popq %r14378; CHECK-NEXT: popq %r15379; CHECK-NEXT: popq %rbp380; CHECK-NEXT: retq381entry:382 %a8 = trunc i32 %a to i8383 %b8 = trunc i32 %b to i8384 %c8 = trunc i32 %c to i8385 %d8 = trunc i32 %d to i8386 %e16 = trunc i32 %e to i16387 %f16 = trunc i32 %f to i16388 %g16 = trunc i32 %g to i16389 %h16 = trunc i32 %h to i16390 %i64 = zext i32 %i to i64391 %j64 = zext i32 %j to i64392 %k64 = zext i32 %k to i64393 %l64 = zext i32 %l to i64394 %m64 = zext i32 %m to i64395 %n64 = zext i32 %n to i64396 %o64 = zext i32 %o to i64397 %p64 = zext i32 %p to i64398 %q64 = zext i32 %q to i64399 %r64 = zext i32 %r to i64400 %s64 = zext i32 %s to i64401 %t64 = zext i32 %t to i64402 %u64 = zext i32 %u to i64403 %v64 = zext i32 %v to i64404 %w64 = zext i32 %w to i64405 %x64 = zext i32 %x to i64406 %y64 = zext i32 %y to i64407 %z64 = zext i32 %z to i64408 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i8 %a8, i8 %b8, i8 %c8, i8 %d8, i16 %e16, i16 %f16, i16 %g16, i16 %h16, i64 %i64, i64 %j64, i64 %k64, i64 %l64, i64 %m64, i64 %n64, i64 %o64, i64 %p64, i64 %q64, i64 %r64, i64 %s64, i64 %t64, i64 %u64, i64 %v64, i64 %w64, i64 %x64, i64 %y64, i64 %z64)]409 ret void410}411 412; Test perfect forwarding of argument registers and stack slots to the413; deopt bundle uses414define void @test9(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z) gc "statepoint-example" {415; CHECK-LABEL: test9:416; CHECK: ## %bb.0: ## %entry417; CHECK-NEXT: pushq %rbp418; CHECK-NEXT: .cfi_def_cfa_offset 16419; CHECK-NEXT: pushq %r15420; CHECK-NEXT: .cfi_def_cfa_offset 24421; CHECK-NEXT: pushq %r14422; CHECK-NEXT: .cfi_def_cfa_offset 32423; CHECK-NEXT: pushq %r13424; CHECK-NEXT: .cfi_def_cfa_offset 40425; CHECK-NEXT: pushq %r12426; CHECK-NEXT: .cfi_def_cfa_offset 48427; CHECK-NEXT: pushq %rbx428; CHECK-NEXT: .cfi_def_cfa_offset 56429; CHECK-NEXT: pushq %rax430; CHECK-NEXT: .cfi_def_cfa_offset 64431; CHECK-NEXT: .cfi_offset %rbx, -56432; CHECK-NEXT: .cfi_offset %r12, -48433; CHECK-NEXT: .cfi_offset %r13, -40434; CHECK-NEXT: .cfi_offset %r14, -32435; CHECK-NEXT: .cfi_offset %r15, -24436; CHECK-NEXT: .cfi_offset %rbp, -16437; CHECK-NEXT: movl %r9d, %ebx438; CHECK-NEXT: movl %r8d, %ebp439; CHECK-NEXT: movl %ecx, %r14d440; CHECK-NEXT: movl %edx, %r15d441; CHECK-NEXT: movl %esi, %r12d442; CHECK-NEXT: movl %edi, %r13d443; CHECK-NEXT: callq _bar444; CHECK-NEXT: Ltmp11:445; CHECK-NEXT: addq $8, %rsp446; CHECK-NEXT: popq %rbx447; CHECK-NEXT: popq %r12448; CHECK-NEXT: popq %r13449; CHECK-NEXT: popq %r14450; CHECK-NEXT: popq %r15451; CHECK-NEXT: popq %rbp452; CHECK-NEXT: retq453 454entry:455 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z)]456 ret void457}458 459; Test enough folding of argument slots when we have one call which clobbers460; registers before a second which needs them - i.e. we must do something with461; arguments originally passed in registers462define void @test10(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z) gc "statepoint-example" {463; FIXME (minor): It would be better to just spill (and fold reload) for464; argument registers then spill and fill all the CSRs.465; CHECK-LABEL: test10:466; CHECK: ## %bb.0: ## %entry467; CHECK-NEXT: pushq %rbp468; CHECK-NEXT: .cfi_def_cfa_offset 16469; CHECK-NEXT: pushq %r15470; CHECK-NEXT: .cfi_def_cfa_offset 24471; CHECK-NEXT: pushq %r14472; CHECK-NEXT: .cfi_def_cfa_offset 32473; CHECK-NEXT: pushq %r13474; CHECK-NEXT: .cfi_def_cfa_offset 40475; CHECK-NEXT: pushq %r12476; CHECK-NEXT: .cfi_def_cfa_offset 48477; CHECK-NEXT: pushq %rbx478; CHECK-NEXT: .cfi_def_cfa_offset 56479; CHECK-NEXT: pushq %rax480; CHECK-NEXT: .cfi_def_cfa_offset 64481; CHECK-NEXT: .cfi_offset %rbx, -56482; CHECK-NEXT: .cfi_offset %r12, -48483; CHECK-NEXT: .cfi_offset %r13, -40484; CHECK-NEXT: .cfi_offset %r14, -32485; CHECK-NEXT: .cfi_offset %r15, -24486; CHECK-NEXT: .cfi_offset %rbp, -16487; CHECK-NEXT: movl %r9d, %ebp488; CHECK-NEXT: movl %r8d, %ebx489; CHECK-NEXT: movl %ecx, %r14d490; CHECK-NEXT: movl %edx, %r15d491; CHECK-NEXT: movl %esi, %r12d492; CHECK-NEXT: movl %edi, %r13d493; CHECK-NEXT: callq _bar494; CHECK-NEXT: Ltmp12:495; CHECK-NEXT: callq _bar496; CHECK-NEXT: Ltmp13:497; CHECK-NEXT: addq $8, %rsp498; CHECK-NEXT: popq %rbx499; CHECK-NEXT: popq %r12500; CHECK-NEXT: popq %r13501; CHECK-NEXT: popq %r14502; CHECK-NEXT: popq %r15503; CHECK-NEXT: popq %rbp504; CHECK-NEXT: retq505 506entry:507 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z)]508 %statepoint_token2 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["deopt" (i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z)]509 ret void510}511 512; Check that we can remat some uses of a def despite not remating before the513; statepoint user.514define i64 @test11(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, i32 %j, i32 %k, i32 %l, i32 %m, i32 %n, i32 %o, i32 %p, i32 %q, i32 %r, i32 %s, i32 %t, i32 %u, i32 %v, i32 %w, i32 %x, i32 %y, i32 %z) gc "statepoint-example" {515; FIXME: The codegen for this is correct, but horrible. Lots of room for516; improvement if we so desire.517; CHECK-LABEL: test11:518; CHECK: ## %bb.0: ## %entry519; CHECK-NEXT: pushq %rbp520; CHECK-NEXT: .cfi_def_cfa_offset 16521; CHECK-NEXT: pushq %r15522; CHECK-NEXT: .cfi_def_cfa_offset 24523; CHECK-NEXT: pushq %r14524; CHECK-NEXT: .cfi_def_cfa_offset 32525; CHECK-NEXT: pushq %r13526; CHECK-NEXT: .cfi_def_cfa_offset 40527; CHECK-NEXT: pushq %r12528; CHECK-NEXT: .cfi_def_cfa_offset 48529; CHECK-NEXT: pushq %rbx530; CHECK-NEXT: .cfi_def_cfa_offset 56531; CHECK-NEXT: subq $168, %rsp532; CHECK-NEXT: .cfi_def_cfa_offset 224533; CHECK-NEXT: .cfi_offset %rbx, -56534; CHECK-NEXT: .cfi_offset %r12, -48535; CHECK-NEXT: .cfi_offset %r13, -40536; CHECK-NEXT: .cfi_offset %r14, -32537; CHECK-NEXT: .cfi_offset %r15, -24538; CHECK-NEXT: .cfi_offset %rbp, -16539; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax540; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill541; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax542; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill543; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax544; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill545; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax546; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill547; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax548; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill549; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax550; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill551; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax552; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill553; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax554; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill555; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax556; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill557; CHECK-NEXT: movl %edi, %eax558; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill559; CHECK-NEXT: movl %esi, %eax560; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill561; CHECK-NEXT: movl %edx, %r14d562; CHECK-NEXT: movl %ecx, %eax563; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill564; CHECK-NEXT: movl %r8d, %r15d565; CHECK-NEXT: movl %r9d, %eax566; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill567; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %r13d568; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax569; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill570; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax571; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill572; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax573; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill574; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %ebp575; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax576; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill577; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax578; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill579; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %r12d580; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax581; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill582; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %ebx583; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax584; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill585; CHECK-NEXT: callq _bar ## 160-byte Folded Reload586; CHECK-NEXT: Ltmp14:587; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Reload588; CHECK-NEXT: addq {{[-0-9]+}}(%r{{[sb]}}p), %rax ## 8-byte Folded Reload589; CHECK-NEXT: addq {{[-0-9]+}}(%r{{[sb]}}p), %r14 ## 8-byte Folded Reload590; CHECK-NEXT: addq %rax, %r14591; CHECK-NEXT: addq {{[-0-9]+}}(%r{{[sb]}}p), %r15 ## 8-byte Folded Reload592; CHECK-NEXT: addq %r14, %r15593; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax594; CHECK-NEXT: addq %rax, %r15595; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax596; CHECK-NEXT: addq %rax, %rbx597; CHECK-NEXT: addq %r15, %rbx598; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax599; CHECK-NEXT: addq %rax, %r12600; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax601; CHECK-NEXT: addq %rax, %r12602; CHECK-NEXT: addq %rbx, %r12603; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax604; CHECK-NEXT: addq %rax, %rbp605; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax606; CHECK-NEXT: addq %rax, %rbp607; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax608; CHECK-NEXT: addq %rax, %rbp609; CHECK-NEXT: addq %r12, %rbp610; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax611; CHECK-NEXT: addq %rax, %r13612; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax613; CHECK-NEXT: addq %rax, %r13614; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax615; CHECK-NEXT: addq %rax, %r13616; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax617; CHECK-NEXT: addq %rax, %r13618; CHECK-NEXT: addq %rbp, %r13619; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %ecx620; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax621; CHECK-NEXT: addq %rax, %rcx622; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax623; CHECK-NEXT: addq %rax, %rcx624; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax625; CHECK-NEXT: addq %rax, %rcx626; CHECK-NEXT: movl {{[0-9]+}}(%rsp), %eax627; CHECK-NEXT: addq %rax, %rcx628; CHECK-NEXT: addq %r13, %rcx629; CHECK-NEXT: movq %rcx, %rax630; CHECK-NEXT: addq $168, %rsp631; CHECK-NEXT: popq %rbx632; CHECK-NEXT: popq %r12633; CHECK-NEXT: popq %r13634; CHECK-NEXT: popq %r14635; CHECK-NEXT: popq %r15636; CHECK-NEXT: popq %rbp637; CHECK-NEXT: retq638 639entry:640 %a64 = zext i32 %a to i64641 %b64 = zext i32 %b to i64642 %c64 = zext i32 %c to i64643 %d64 = zext i32 %d to i64644 %e64 = zext i32 %e to i64645 %f64 = zext i32 %f to i64646 %g64 = zext i32 %g to i64647 %h64 = zext i32 %h to i64648 %i64 = zext i32 %i to i64649 %j64 = zext i32 %j to i64650 %k64 = zext i32 %k to i64651 %l64 = zext i32 %l to i64652 %m64 = zext i32 %m to i64653 %n64 = zext i32 %n to i64654 %o64 = zext i32 %o to i64655 %p64 = zext i32 %p to i64656 %q64 = zext i32 %q to i64657 %r64 = zext i32 %r to i64658 %s64 = zext i32 %s to i64659 %t64 = zext i32 %t to i64660 %u64 = zext i32 %u to i64661 %v64 = zext i32 %v to i64662 %w64 = zext i32 %w to i64663 %x64 = zext i32 %x to i64664 %y64 = zext i32 %y to i64665 %z64 = zext i32 %z to i64666 call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i64 0, i64 0) ["deopt" (i64 %a64, i64 %b64, i64 %c64, i64 %d64, i64 %e64, i64 %f64, i64 %g64, i64 %h64, i64 %i64, i64 %j64, i64 %k64, i64 %l64, i64 %m64, i64 %n64, i64 %o64, i64 %p64, i64 %q64, i64 %r64, i64 %s64, i64 %t64, i64 %u64, i64 %v64, i64 %w64, i64 %x64, i64 %y64, i64 %z64)]667 %addab = add i64 %a64, %b64668 %addc = add i64 %addab, %c64669 %addd = add i64 %addc, %d64670 %adde = add i64 %addd, %e64671 %addf = add i64 %adde, %f64672 %addg = add i64 %addf, %g64673 %addh = add i64 %addg, %h64674 %addi = add i64 %addh, %i64675 %addj = add i64 %addi, %j64676 %addk = add i64 %addj, %k64677 %addl = add i64 %addk, %l64678 %addm = add i64 %addl, %m64679 %addn = add i64 %addm, %n64680 %addo = add i64 %addn, %o64681 %addp = add i64 %addo, %p64682 %addq = add i64 %addp, %q64683 %addr = add i64 %addq, %r64684 %adds = add i64 %addr, %s64685 %addt = add i64 %adds, %t64686 %addu = add i64 %addt, %u64687 %addv = add i64 %addu, %v64688 %addw = add i64 %addv, %w64689 %addx = add i64 %addw, %x64690 %addy = add i64 %addx, %y64691 %addz = add i64 %addy, %z64692 ret i64 %addz693}694 695; Demonstrate address of a function (w/ spilling due to caller saved register is used)696define void @addr_func() gc "statepoint-example" {697; CHECK-LABEL: addr_func:698; CHECK: ## %bb.0: ## %entry699; CHECK-NEXT: pushq %rbx700; CHECK-NEXT: .cfi_def_cfa_offset 16701; CHECK-NEXT: .cfi_offset %rbx, -16702; CHECK-NEXT: movq _bar@GOTPCREL(%rip), %rbx703; CHECK-NEXT: callq _bar704; CHECK-NEXT: Ltmp15:705; CHECK-NEXT: popq %rbx706; CHECK-NEXT: retq707entry:708 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i64 0, i64 0) ["deopt" (ptr @bar, ptr @bar, ptr @bar)]709 ret void710}711 712; Demonstrate address of a global (w/ spilling due to caller saved register is used)713@G = external global i32714define void @addr_global() gc "statepoint-example" {715; CHECK-LABEL: addr_global:716; CHECK: ## %bb.0: ## %entry717; CHECK-NEXT: pushq %rbx718; CHECK-NEXT: .cfi_def_cfa_offset 16719; CHECK-NEXT: .cfi_offset %rbx, -16720; CHECK-NEXT: movq _G@GOTPCREL(%rip), %rbx721; CHECK-NEXT: callq _bar722; CHECK-NEXT: Ltmp16:723; CHECK-NEXT: popq %rbx724; CHECK-NEXT: retq725entry:726 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i64 0, i64 0) ["deopt" (ptr @G, ptr @G, ptr @G)]727 ret void728}729 730define void @addr_alloca(i32 %v) gc "statepoint-example" {731; CHECK-LABEL: addr_alloca:732; CHECK: ## %bb.0: ## %entry733; CHECK-NEXT: pushq %rax734; CHECK-NEXT: .cfi_def_cfa_offset 16735; CHECK-NEXT: movl %edi, {{[0-9]+}}(%rsp)736; CHECK-NEXT: callq _bar737; CHECK-NEXT: Ltmp17:738; CHECK-NEXT: popq %rax739; CHECK-NEXT: retq740entry:741 %a = alloca i32742 store i32 %v, ptr %a743 %statepoint_token1 = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @bar, i32 0, i32 0, i64 0, i64 0) ["deopt" (ptr %a, ptr %a, ptr %a)]744 ret void745}746 747define ptr addrspace(1) @test_fpconst_deopt(ptr addrspace(1) %in) gc "statepoint-example" {748; CHECK-LABEL: test_fpconst_deopt:749; CHECK: ## %bb.0:750; CHECK-NEXT: pushq %rax751; CHECK-NEXT: .cfi_def_cfa_offset 16752; CHECK-NEXT: movq %rdi, (%rsp)753; CHECK-NEXT: nopl 8(%rax,%rax)754; CHECK-NEXT: Ltmp18:755; CHECK-NEXT: movq (%rsp), %rax756; CHECK-NEXT: popq %rcx757; CHECK-NEXT: retq758 %statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2, i32 5, ptr nonnull elementtype(void ()) @bar, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %in), "deopt" (759 float 0x40421A1CA0000000, float 0x40459A1CA0000000, float 0x40401A1CA0000000, float 0x40479A1CA0000000, float 0x403C343940000000,760 float 0x403E343940000000, float 0x40469A1CA0000000, float 0x40489A1CA0000000, float 0x404A9A1CA0000000, float 0x40499A1CA0000000,761 float 0xC05FCD2F20000000, float 0xC05C0D2F20000000, float 0xC060269780000000, float 0xC05B8D2F20000000, float 0xC060669780000000,762 float 0xC05B0D2F20000000, float 0xC060A69780000000, float 0xC05A8D2F20000000, float 0xC060E69780000000, float 0x40439A1CA0000000)]763 %out = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %statepoint_token, i32 0, i32 0)764 ret ptr addrspace(1) %out765}766 767; CHECK-LABEL: __LLVM_StackMaps:768; CHECK: .long Ltmp18-_test_fpconst_deopt769; CHECK-NEXT: .short 0770; CHECK-NEXT: .short 25771; CHECK-NEXT: .byte 4772; CHECK-NEXT: .byte 0773; CHECK-NEXT: .short 8774; CHECK-NEXT: .short 0775; CHECK-NEXT: .short 0776; CHECK-NEXT: .long 0777; CHECK-NEXT: .byte 4778; CHECK-NEXT: .byte 0779; CHECK-NEXT: .short 8780; CHECK-NEXT: .short 0781; CHECK-NEXT: .short 0782; CHECK-NEXT: .long 0783; CHECK-NEXT: .byte 4784; CHECK-NEXT: .byte 0785; CHECK-NEXT: .short 8786; CHECK-NEXT: .short 0787; CHECK-NEXT: .short 0788; CHECK-NEXT: .long 20789; CHECK: .byte 4790; CHECK: .byte 0791; CHECK: .short 8792; CHECK: .short 0793; CHECK: .short 0794; CHECK: .long 1108398309795; CHECK: .byte 4796; CHECK: .byte 0797; CHECK: .short 8798; CHECK: .short 0799; CHECK: .short 0800; CHECK: .long 1110233317801; CHECK: .byte 4802; CHECK: .byte 0803; CHECK: .short 8804; CHECK: .short 0805; CHECK: .short 0806; CHECK: .long 1107349733807; CHECK: .byte 4808; CHECK: .byte 0809; CHECK: .short 8810; CHECK: .short 0811; CHECK: .short 0812; CHECK: .long 1111281893813; CHECK: .byte 4814; CHECK: .byte 0815; CHECK: .short 8816; CHECK: .short 0817; CHECK: .short 0818; CHECK: .long 1105306058819; CHECK: .byte 4820; CHECK: .byte 0821; CHECK: .short 8822; CHECK: .short 0823; CHECK: .short 0824; CHECK: .long 1106354634825; CHECK: .byte 4826; CHECK: .byte 0827; CHECK: .short 8828; CHECK: .short 0829; CHECK: .short 0830; CHECK: .long 1110757605831; CHECK: .byte 4832; CHECK: .byte 0833; CHECK: .short 8834; CHECK: .short 0835; CHECK: .short 0836; CHECK: .long 1111806181837; CHECK: .byte 4838; CHECK: .byte 0839; CHECK: .short 8840; CHECK: .short 0841; CHECK: .short 0842; CHECK: .long 1112854757843; CHECK: .byte 4844; CHECK: .byte 0845; CHECK: .short 8846; CHECK: .short 0847; CHECK: .short 0848; CHECK: .long 1112330469849; CHECK: .byte 5850; CHECK: .byte 0851; CHECK: .short 8852; CHECK: .short 0853; CHECK: .short 0854; CHECK: .long 0855; CHECK: .byte 5856; CHECK: .byte 0857; CHECK: .short 8858; CHECK: .short 0859; CHECK: .short 0860; CHECK: .long 1861; CHECK: .byte 5862; CHECK: .byte 0863; CHECK: .short 8864; CHECK: .short 0865; CHECK: .short 0866; CHECK: .long 2867; CHECK: .byte 5868; CHECK: .byte 0869; CHECK: .short 8870; CHECK: .short 0871; CHECK: .short 0872; CHECK: .long 3873; CHECK: .byte 5874; CHECK: .byte 0875; CHECK: .short 8876; CHECK: .short 0877; CHECK: .short 0878; CHECK: .long 4879; CHECK: .byte 5880; CHECK: .byte 0881; CHECK: .short 8882; CHECK: .short 0883; CHECK: .short 0884; CHECK: .long 5885; CHECK: .byte 5886; CHECK: .byte 0887; CHECK: .short 8888; CHECK: .short 0889; CHECK: .short 0890; CHECK: .long 6891; CHECK: .byte 5892; CHECK: .byte 0893; CHECK: .short 8894; CHECK: .short 0895; CHECK: .short 0896; CHECK: .long 7897; CHECK: .byte 5898; CHECK: .byte 0899; CHECK: .short 8900; CHECK: .short 0901; CHECK: .short 0902; CHECK: .long 8903; CHECK: .byte 4904; CHECK: .byte 0905; CHECK: .short 8906; CHECK: .short 0907; CHECK: .short 0908; CHECK: .long 1109184741909 910declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)911declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32)912 913attributes #0 = { "deopt-lowering"="live-in" }914attributes #1 = { "deopt-lowering"="live-through" }915