The layout of the stack frame for SVE means that using the frame pointer rather than the stack pointer for an access to an SVE stack object removes the need for an additional add to jump over the non-SVE objects. Likewise the opposite is true for non-SVE stack objects. This patch allows for the former to be done by having HasFP return true in the presence of both SVE and non-SVE stack objects, and also fixes a minor issue whereby the later would not be done for certain offsets.
128 lines
6.0 KiB
YAML
128 lines
6.0 KiB
YAML
# RUN: llc -o %t -filetype=obj -start-before=prologepilog %s
|
|
# RUN: llvm-dwarfdump --name="value0" %t | FileCheck %s --check-prefix=CHECK0
|
|
# RUN: llvm-dwarfdump --name="value1" %t | FileCheck %s --check-prefix=CHECK1
|
|
# RUN: llvm-dwarfdump --name="value2" %t | FileCheck %s --check-prefix=CHECK2
|
|
# RUN: llvm-dwarfdump --name="value3" %t | FileCheck %s --check-prefix=CHECK3
|
|
# RUN: llvm-dwarfdump --name="value4" %t | FileCheck %s --check-prefix=CHECK4
|
|
# RUN: llvm-dwarfdump --name="value5" %t | FileCheck %s --check-prefix=CHECK5
|
|
|
|
# CHECK0: : DW_OP_breg31 WSP+8, DW_OP_lit16, DW_OP_plus)
|
|
# CHECK0: DW_AT_type {{.*}}ty32
|
|
#
|
|
# CHECK1: : DW_OP_breg31 WSP+16)
|
|
# CHECK1: DW_AT_type {{.*}}ty32
|
|
#
|
|
# CHECK2: : DW_OP_breg29 W29+0, DW_OP_lit8, DW_OP_bregx VG+0, DW_OP_mul, DW_OP_minus)
|
|
# CHECK2: DW_AT_type {{.*}}svint32_t
|
|
#
|
|
# CHECK3: : DW_OP_breg29 W29+0, DW_OP_lit16, DW_OP_bregx VG+0, DW_OP_mul, DW_OP_minus)
|
|
# CHECK3: DW_AT_type {{.*}}svint32_t
|
|
#
|
|
# CHECK4: : DW_OP_breg29 W29+0, DW_OP_lit17, DW_OP_bregx VG+0, DW_OP_mul, DW_OP_minus)
|
|
# CHECK4: DW_AT_type {{.*}}svbool_t
|
|
#
|
|
# CHECK5: : DW_OP_breg29 W29+0, DW_OP_lit18, DW_OP_bregx VG+0, DW_OP_mul, DW_OP_minus)
|
|
# CHECK5: DW_AT_type {{.*}}svbool_t
|
|
|
|
--- |
|
|
; ModuleID = 'bla.mir'
|
|
source_filename = "bla.mir"
|
|
target triple = "aarch64-unknown-linux-gnu"
|
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
|
|
|
define void @foo() #0 !dbg !5 {
|
|
entry:
|
|
unreachable, !dbg !8
|
|
}
|
|
|
|
; Function Attrs: nounwind readnone speculatable willreturn
|
|
declare void @llvm.dbg.value(metadata, metadata, metadata)
|
|
|
|
attributes #0 = { "target-features"="+sve" }
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.debugify = !{!3, !3}
|
|
!llvm.module.flags = !{!4}
|
|
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
|
|
!1 = !DIFile(filename: "bla.mir", directory: "/")
|
|
!2 = !{}
|
|
!3 = !{i32 1}
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!5 = distinct !DISubprogram(name: "foo", linkageName: "foo", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !9)
|
|
!6 = !DISubroutineType(types: !2)
|
|
!7 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_signed)
|
|
!8 = !DILocation(line: 1, column: 1, scope: !5)
|
|
!9 = !{!10, !11, !12, !13, !14, !15}
|
|
!10 = !DILocalVariable(name: "value0", scope: !5, file: !1, line: 1, type: !7)
|
|
!11 = !DILocalVariable(name: "value1", scope: !5, file: !1, line: 1, type: !7)
|
|
!12 = !DILocalVariable(name: "value2", scope: !5, file: !1, line: 1, type: !16)
|
|
!13 = !DILocalVariable(name: "value3", scope: !5, file: !1, line: 1, type: !16)
|
|
!14 = !DILocalVariable(name: "value4", scope: !5, file: !1, line: 1, type: !21)
|
|
!15 = !DILocalVariable(name: "value5", scope: !5, file: !1, line: 1, type: !21)
|
|
!16 = !DIDerivedType(tag: DW_TAG_typedef, name: "svint32_t", file: !1, line: 1, baseType: !17)
|
|
!17 = !DIDerivedType(tag: DW_TAG_typedef, name: "__SVInt32_t", file: !1, baseType: !18)
|
|
!18 = !DICompositeType(tag: DW_TAG_array_type, baseType: !7, flags: DIFlagVector, elements: !19)
|
|
!19 = !{!20}
|
|
!20 = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 2, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
|
!21 = !DIDerivedType(tag: DW_TAG_typedef, name: "svbool_t", file: !1, line: 90, baseType: !22)
|
|
!22 = !DIDerivedType(tag: DW_TAG_typedef, name: "__SVBool_t", file: !1, baseType: !23)
|
|
!23 = !DICompositeType(tag: DW_TAG_array_type, baseType: !24, flags: DIFlagVector, elements: !25)
|
|
!24 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char)
|
|
!25 = !{!26}
|
|
!26 = !DISubrange(lowerBound: 0, upperBound: !DIExpression(DW_OP_constu, 1, DW_OP_bregx, 46, 0, DW_OP_mul, DW_OP_constu, 1, DW_OP_minus))
|
|
|
|
|
|
...
|
|
---
|
|
name: foo
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$z0' }
|
|
- { reg: '$z1' }
|
|
- { reg: '$p0' }
|
|
- { reg: '$p1' }
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 16
|
|
adjustsStack: true
|
|
hasCalls: true
|
|
maxCallFrameSize: 0
|
|
localFrameSize: 4
|
|
stack:
|
|
- { id: 0, size: 8, alignment: 8 }
|
|
- { id: 1, size: 8, alignment: 8 }
|
|
- { id: 2, size: 16, alignment: 16, stack-id: scalable-vector }
|
|
- { id: 3, size: 16, alignment: 16, stack-id: scalable-vector }
|
|
- { id: 4, size: 2, alignment: 2, stack-id: scalable-vector }
|
|
- { id: 5, size: 2, alignment: 2, stack-id: scalable-vector }
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $p0, $p1, $w0, $x1, $z0, $z1
|
|
|
|
; Avoid stack slot scavenging.
|
|
$lr = IMPLICIT_DEF
|
|
|
|
STRXui killed renamable $x0, %stack.0, 0, debug-location !8
|
|
DBG_VALUE %stack.0, $noreg, !10, !DIExpression(DW_OP_constu, 16, DW_OP_plus, DW_OP_deref), debug-location !8
|
|
STRXui killed renamable $x1, %stack.1, 0, debug-location !8
|
|
DBG_VALUE %stack.1, $noreg, !11, !DIExpression(DW_OP_constu, 16, DW_OP_plus, DW_OP_deref), debug-location !8
|
|
|
|
renamable $p2 = PTRUE_S 31, debug-location !DILocation(line: 4, column: 1, scope: !5)
|
|
ST1W_IMM renamable $z0, renamable $p2, %stack.2, 0, debug-location !DILocation(line: 5, column: 1, scope: !5)
|
|
DBG_VALUE %stack.2, $noreg, !12, !DIExpression(DW_OP_deref), debug-location !DILocation(line: 5, column: 1, scope: !5)
|
|
ST1W_IMM renamable $z1, killed renamable $p2, %stack.3, 0, debug-location !DILocation(line: 6, column: 1, scope: !5)
|
|
DBG_VALUE %stack.3, $noreg, !13, !DIExpression(DW_OP_deref), debug-location !DILocation(line: 6, column: 1, scope: !5)
|
|
|
|
STR_PXI killed renamable $p0, %stack.4, 0, debug-location !DILocation(line: 2, column: 1, scope: !5)
|
|
DBG_VALUE %stack.4, $noreg, !14, !DIExpression(DW_OP_deref), debug-location !DILocation(line: 2, column: 1, scope: !5)
|
|
STR_PXI killed renamable $p1, %stack.5, 0, debug-location !DILocation(line: 3, column: 1, scope: !5)
|
|
DBG_VALUE %stack.5, $noreg, !15, !DIExpression(DW_OP_deref), debug-location !DILocation(line: 3, column: 1, scope: !5)
|
|
|
|
RET_ReallyLR implicit $z0, implicit $z1, debug-location !DILocation(line: 7, column: 1, scope: !5)
|
|
|
|
...
|