brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.0 KiB · 5c26e29 Raw
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