[PATCH] D40876: AArch64: Fix emergency spillslot being out of reach for large callframes

Matthias Braun via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 6 17:06:25 PST 2017


MatzeB added a comment.

So this works as a testcase, however I wouldn't want to check this in either; as no matter what I do, for huge callframes we always produce a huge number of stores in selectiondag (or fastisel) that take a long time to create and optimize away even when the argument is simply undef...

  target triple = "arm64--"
  
  declare void @extfunc([4096 x i64] %p)
  
  define void @func() {
    %lvar = alloca i8
  
    %v00 = load volatile i8, i8* %lvar
    %v01 = load volatile i8, i8* %lvar
    %v02 = load volatile i8, i8* %lvar
    %v03 = load volatile i8, i8* %lvar
    %v04 = load volatile i8, i8* %lvar
    %v05 = load volatile i8, i8* %lvar
    %v06 = load volatile i8, i8* %lvar
    %v07 = load volatile i8, i8* %lvar
    %v08 = load volatile i8, i8* %lvar
    %v09 = load volatile i8, i8* %lvar
    %v10 = load volatile i8, i8* %lvar
    %v11 = load volatile i8, i8* %lvar
    %v12 = load volatile i8, i8* %lvar
    %v13 = load volatile i8, i8* %lvar
    %v14 = load volatile i8, i8* %lvar
    %v15 = load volatile i8, i8* %lvar
    %v16 = load volatile i8, i8* %lvar
    %v17 = load volatile i8, i8* %lvar
    %v18 = load volatile i8, i8* %lvar
    %v19 = load volatile i8, i8* %lvar
    %v20 = load volatile i8, i8* %lvar
    %v21 = load volatile i8, i8* %lvar
    %v22 = load volatile i8, i8* %lvar
    %v23 = load volatile i8, i8* %lvar
    %v24 = load volatile i8, i8* %lvar
    %v25 = load volatile i8, i8* %lvar
    %v26 = load volatile i8, i8* %lvar
    %v27 = load volatile i8, i8* %lvar
    %v28 = load volatile i8, i8* %lvar
    %v29 = load volatile i8, i8* %lvar
    %v30 = load volatile i8, i8* %lvar
    %v31 = load volatile i8, i8* %lvar
  
    store volatile i8 %v00, i8* %lvar
    store volatile i8 %v01, i8* %lvar
    store volatile i8 %v02, i8* %lvar
    store volatile i8 %v03, i8* %lvar
    store volatile i8 %v04, i8* %lvar
    store volatile i8 %v05, i8* %lvar
    store volatile i8 %v06, i8* %lvar
    store volatile i8 %v07, i8* %lvar
    store volatile i8 %v08, i8* %lvar
    store volatile i8 %v09, i8* %lvar
    store volatile i8 %v10, i8* %lvar
    store volatile i8 %v11, i8* %lvar
    store volatile i8 %v12, i8* %lvar
    store volatile i8 %v13, i8* %lvar
    store volatile i8 %v14, i8* %lvar
    store volatile i8 %v15, i8* %lvar
    store volatile i8 %v16, i8* %lvar
    store volatile i8 %v17, i8* %lvar
    store volatile i8 %v18, i8* %lvar
    store volatile i8 %v19, i8* %lvar
    store volatile i8 %v20, i8* %lvar
    store volatile i8 %v21, i8* %lvar
    store volatile i8 %v22, i8* %lvar
    store volatile i8 %v23, i8* %lvar
    store volatile i8 %v24, i8* %lvar
    store volatile i8 %v25, i8* %lvar
    store volatile i8 %v26, i8* %lvar
    store volatile i8 %v27, i8* %lvar
    store volatile i8 %v28, i8* %lvar
    store volatile i8 %v29, i8* %lvar
    store volatile i8 %v30, i8* %lvar
    store volatile i8 %v31, i8* %lvar
  
    call void @extfunc([4096 x i64] undef)
    ret void
  }

(this takes an embarrassing 50 seconds to run on my machine)


Repository:
  rL LLVM

https://reviews.llvm.org/D40876





More information about the llvm-commits mailing list