Summary: This is necessary and sufficient to get simple cases of multiple return working with multivalue enabled. More complex cases will require block and loop signatures to be generalized to potentially be type indices as well. Reviewers: aheejin, dschuff Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68684 llvm-svn: 374235
61 lines
2.7 KiB
YAML
61 lines
2.7 KiB
YAML
# RUN: llc < %s -run-pass=wasm-reg-stackify -x=mir 2>&1 | FileCheck %s
|
|
|
|
# CHECK: body:
|
|
# CHECK: %1:i32 = I32_WRAP_I64 %0,
|
|
# CHECK-NEXT: DBG_VALUE %1,
|
|
# CHECK-NEXT: %1:i32 = CALL_i32 @bar,
|
|
# CHECK-NEXT: DBG_VALUE %1,
|
|
# CHECK-NEXT: %[[NEWREG:.*]]:i32 = CALL_i32 @bar,
|
|
# CHECK-NEXT: DBG_VALUE %[[NEWREG]],
|
|
# CHECK-NEXT: CALL_VOID @foo, %[[NEWREG]],
|
|
|
|
--- |
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
declare void @foo(i32)
|
|
declare i32 @bar()
|
|
|
|
define void @test(i64 %arg) {
|
|
unreachable
|
|
}
|
|
|
|
!llvm.dbg.cu = !{!0}
|
|
!llvm.module.flags = !{!4}
|
|
!0 = distinct !DICompileUnit(language: DW_LANG_Rust, file: !2, producer: "clang LLVM (rustc version 1.30.0-dev)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !1, globals: !1)
|
|
!1 = !{}
|
|
!2 = !DIFile(filename: "<unknown>", directory: "")
|
|
!3 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "&str", file: !2, size: 64, align: 32, elements: !{}, identifier: "111094d970b097647de579f9c509ef08")
|
|
!4 = !{i32 2, !"Debug Info Version", i32 3}
|
|
!5 = distinct !DILexicalBlock(scope: !6, file: !2, line: 357, column: 8)
|
|
!6 = distinct !DISubprogram(name: "testfoo", linkageName: "_testba", scope: !7, file: !2, line: 353, type: !8, isLocal: true, isDefinition: true, scopeLine: 353, flags: DIFlagPrototyped, isOptimized: true, unit: !0, templateParams: !1, retainedNodes: !9)
|
|
!7 = !DINamespace(name: "ptr", scope: null)
|
|
!8 = !DISubroutineType(types: !1)
|
|
!9 = !{!10}
|
|
!10 = !DILocalVariable(name: "val0", scope: !5, file: !2, line: 357, type: !3, align: 4)
|
|
!11 = !DILocalVariable(name: "val1", scope: !5, file: !2, line: 358, type: !3, align: 4)
|
|
!12 = !DILocalVariable(name: "val2", scope: !5, file: !2, line: 359, type: !3, align: 4)
|
|
!13 = !DILocation(line: 357, column: 12, scope: !5)
|
|
!14 = !DILocation(line: 358, column: 12, scope: !5)
|
|
!15 = !DILocation(line: 359, column: 12, scope: !5)
|
|
|
|
---
|
|
name: test
|
|
liveins:
|
|
- { reg: '$arguments' }
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
liveins: $arguments
|
|
%0:i64 = ARGUMENT_i64 0, implicit $arguments
|
|
%1:i32 = I32_WRAP_I64 %0:i64, implicit-def dead $arguments
|
|
DBG_VALUE %1:i32, $noreg, !10, !DIExpression(), debug-location !13; <unknown>:357:12 line no:357
|
|
%1:i32 = CALL_i32 @bar, implicit-def dead $arguments, implicit $sp32, implicit $sp64
|
|
DBG_VALUE %1:i32, $noreg, !11, !DIExpression(), debug-location !14; <unknown>:357:12 line no:357
|
|
%1:i32 = CALL_i32 @bar, implicit-def dead $arguments, implicit $sp32, implicit $sp64
|
|
DBG_VALUE %1:i32, $noreg, !12, !DIExpression(), debug-location !15; <unknown>:357:12 line no:357
|
|
CALL_VOID @foo, %1:i32, implicit-def dead $arguments, implicit $sp32, implicit $sp64
|
|
RETURN implicit-def dead $arguments
|
|
|
|
...
|