Skip to content
  • Reid Kleckner's avatar
    Use the frame index side table for byval and inalloca arguments · 45efcf0c
    Reid Kleckner authored
    Summary:
    For inalloca functions, this is a very common code pattern:
    
      %argpack = type <{ i32, i32, i32 }>
      define void @f(%argpack* inalloca %args) {
      entry:
        %a = getelementptr inbounds %argpack, %argpack* %args, i32 0, i32 0
        %b = getelementptr inbounds %argpack, %argpack* %args, i32 0, i32 1
        %c = getelementptr inbounds %argpack, %argpack* %args, i32 0, i32 2
        tail call void @llvm.dbg.declare(metadata i32* %a, ... "a")
        tail call void @llvm.dbg.declare(metadata i32* %c, ... "b")
        tail call void @llvm.dbg.declare(metadata i32* %b, ... "c")
    
    Even though these GEPs can be simplified to a constant offset from EBP
    or RSP, we don't do that at -O0, and each GEP is computed into a
    register. Registers used to compute argument addresses are typically
    spilled and clobbered very quickly after the initial computation, so
    live debug variable tracking loses information very quickly if we use
    DBG_VALUE instructions.
    
    This change moves processing of dbg.declare between argument lowering
    and basic block isel, so that we can ask if an argument has a frame
    index or not. If the argument lives in a register as is the case for
    byval arguments on some targets, then we don't put it in the side table
    and during ISel we emit DBG_VALUE instructions.
    
    Reviewers: aprantl
    
    Subscribers: llvm-commits
    
    Differential Revision: https://reviews.llvm.org/D32980
    
    llvm-svn: 302483
    45efcf0c
Loading