## Test mips32:
# RUN: llc -emit-call-site-info -start-after=machineverifier -filetype=obj -mtriple=mips-linux-gnu %s -o -| llvm-dwarfdump -| FileCheck %s
## Test mipsel:
# RUN: llc -emit-call-site-info -start-after=machineverifier -filetype=obj -mtriple=mipsel-linux-gnu %s -o -| llvm-dwarfdump -| FileCheck %s

## Built from source:
## extern int __attribute__((noinline)) sum(int a, int b);
## void __attribute__((noinline)) set(int *adr, int val) {
##   val++;
##   *adr = val + sum(val, val);
## }
## Using command:
## clang -g -O2 -target mips-linux-gnu m.c -c -mllvm -stop-before=machineverifier
## Check that call site interpretation analysis can interpret calls with delay slot and
## parameters set outside and inside of the call delay slot.

## Test mips32:
# CHECK:        DW_TAG_GNU_call_site
# CHECK-NEXT:     DW_AT_abstract_origin {{.*}} "sum"
# CHECK-NEXT:     DW_AT_low_pc
# CHECK-EMPTY:
## Parameter forwarding register A1_64 is set in call delay slot.
# CHECK-NEXT:     DW_TAG_GNU_call_site_parameter
# CHECK-NEXT:       DW_AT_location      (DW_OP_reg5 A1_64)
# CHECK-NEXT:       DW_AT_GNU_call_site_value   (DW_OP_breg17 S1_64+0)
# CHECK-EMPTY:
# CHECK-NEXT:     DW_TAG_GNU_call_site_parameter
# CHECK-NEXT:       DW_AT_location      (DW_OP_reg4 A0_64)
# CHECK-NEXT:       DW_AT_GNU_call_site_value   (DW_OP_breg17 S1_64+0)

--- |
  ; ModuleID = 'm.ll'
  source_filename = "m.c"
  target datalayout = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64"
  target triple = "mips-unknown-linux-gnu"
  ; Function Attrs: noinline nounwind
  define dso_local void @set(i32* nocapture %adr, i32 signext %val) local_unnamed_addr !dbg !12 {
  entry:
    call void @llvm.dbg.value(metadata i32* %adr, metadata !17, metadata !DIExpression()), !dbg !19
    call void @llvm.dbg.value(metadata i32 %val, metadata !18, metadata !DIExpression()), !dbg !19
    %inc = add nsw i32 %val, 1, !dbg !19
    call void @llvm.dbg.value(metadata i32 %inc, metadata !18, metadata !DIExpression()), !dbg !19
    %call = tail call i32 @sum(i32 signext %inc, i32 signext %inc), !dbg !19
    %add = add nsw i32 %call, %inc, !dbg !19
    store i32 %add, i32* %adr, align 4, !dbg !19
    ret void
  }
  declare !dbg !4 dso_local i32 @sum(i32 signext, i32 signext) local_unnamed_addr
  ; Function Attrs: nounwind readnone speculatable willreturn
  declare void @llvm.dbg.value(metadata, metadata, metadata)
  
  !llvm.dbg.cu = !{!0}
  !llvm.module.flags = !{!8, !9, !10}
  !llvm.ident = !{!11}
  
  !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, splitDebugInlining: false, nameTableKind: None)
  !1 = !DIFile(filename: "m.c", directory: "/dir")
  !2 = !{}
  !3 = !{!4}
  !4 = !DISubprogram(name: "sum", scope: !1, file: !1, line: 1, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2)
  !5 = !DISubroutineType(types: !6)
  !6 = !{!7, !7, !7}
  !7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
  !8 = !{i32 7, !"Dwarf Version", i32 4}
  !9 = !{i32 2, !"Debug Info Version", i32 3}
  !10 = !{i32 1, !"wchar_size", i32 4}
  !11 = !{!"clang version 11.0.0"}
  !12 = distinct !DISubprogram(name: "set", scope: !1, file: !1, line: 2, type: !13, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !16)
  !13 = !DISubroutineType(types: !14)
  !14 = !{null, !15, !7}
  !15 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !7, size: 32)
  !16 = !{!17, !18}
  !17 = !DILocalVariable(name: "adr", arg: 1, scope: !12, file: !1, line: 2, type: !15)
  !18 = !DILocalVariable(name: "val", arg: 2, scope: !12, file: !1, line: 2, type: !7)
  !19 = !DILocation(line: 0, scope: !12)

...
---
name:            set
alignment:       4
stack:
  - { id: 0, name: '', type: spill-slot, offset: -4, size: 4, alignment: 4, 
      stack-id: default, callee-saved-register: '$ra', callee-saved-restored: true, 
      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
  - { id: 1, name: '', type: spill-slot, offset: -8, size: 4, alignment: 4, 
      stack-id: default, callee-saved-register: '$s1', callee-saved-restored: true, 
      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
  - { id: 2, name: '', type: spill-slot, offset: -12, size: 4, alignment: 4, 
      stack-id: default, callee-saved-register: '$s0', callee-saved-restored: true, 
      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
callSites:
  - { bb: 0, offset: 16, fwdArgRegs: 
      - { arg: 0, reg: '$a0' }
      - { arg: 1, reg: '$a1' } }
body:             |
  bb.0.entry:
    DBG_VALUE $a0, $noreg, !17, !DIExpression(), debug-location !19
    DBG_VALUE $a1, $noreg, !18, !DIExpression(), debug-location !19
    DBG_VALUE $a1, $noreg, !18, !DIExpression(), debug-location !19
    $sp = ADDiu $sp, -32
    CFI_INSTRUCTION def_cfa_offset 32
    SW killed $ra, $sp, 28 :: (store 4 into %stack.0)
    SW killed $s1, $sp, 24 :: (store 4 into %stack.1)
    SW killed $s0, $sp, 20 :: (store 4 into %stack.2)
    CFI_INSTRUCTION offset $ra_64, -4
    CFI_INSTRUCTION offset $s1_64, -8
    CFI_INSTRUCTION offset $s0_64, -12
    $s0 = OR $a0, $zero
    DBG_VALUE $s0, $noreg, !17, !DIExpression(), debug-location !19
    renamable $s1 = nsw ADDiu killed renamable $a1, 1, debug-location !19
    DBG_VALUE $s1, $noreg, !18, !DIExpression(), debug-location !19
    $a0 = OR $s1, $zero, debug-location !19
    JAL @sum, csr_o32, implicit-def dead $ra, implicit $a0, implicit $a1, implicit-def $sp, implicit-def $v0, debug-location !19 {
      $a1 = OR $s1, $zero, debug-location !19
    }
    renamable $at = nsw ADDu killed renamable $v0, killed renamable $s1, debug-location !19
    SW killed renamable $at, killed renamable $s0, 0, debug-location !19 :: (store 4 into %ir.adr)
    $s0 = LW $sp, 20
    DBG_VALUE $a0, $noreg, !17, !DIExpression(DW_OP_LLVM_entry_value, 1), debug-location !19
    $s1 = LW $sp, 24
    $ra = LW $sp, 28
    PseudoReturn undef $ra {
      $sp = ADDiu $sp, 32
    }

...

