mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-02 07:41:38 +00:00

Summary: Renames `ExprType` to the more apt `BlockType` and adds a variant for multivalue blocks. Currently non-void blocks are only generated at the end of functions where the block return type needs to agree with the function return type, and that remains true for multivalue blocks. That invariant means that the actual signature does not need to be stored in the block signature `MachineOperand` because it can be inferred by `WebAssemblyMCInstLower` from the return type of the parent function. `WebAssemblyMCInstLower` continues to lower block signature operands to immediates when possible but lowers multivalue signatures to function type symbols. The AsmParser and Disassembler are updated to handle multivalue block types as well. Reviewers: aheejin, dschuff, aardappel Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68889 llvm-svn: 374933
45 lines
1.3 KiB
LLVM
45 lines
1.3 KiB
LLVM
; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+multivalue | FileCheck %s
|
|
|
|
; Test that the multivalue returns, function types, and block types
|
|
; work as expected.
|
|
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
%pair = type { i32, i32 }
|
|
%packed_pair = type <{ i32, i32 }>
|
|
|
|
; CHECK-LABEL: pair_ident:
|
|
; CHECK-NEXT: .functype pair_ident (i32, i32) -> (i32, i32)
|
|
; CHECK-NEXT: return $0, $1{{$}}
|
|
define %pair @pair_ident(%pair %p) {
|
|
ret %pair %p
|
|
}
|
|
|
|
; CHECK-LABEL: packed_pair_ident:
|
|
; CHECK-NEXT: .functype packed_pair_ident (i32, i32) -> (i32, i32)
|
|
; CHECK-NEXT: return $0, $1{{$}}
|
|
define %packed_pair @packed_pair_ident(%packed_pair %p) {
|
|
ret %packed_pair %p
|
|
}
|
|
|
|
; CHECK-LABEL: minimal_loop:
|
|
; CHECK-NEXT: .functype minimal_loop (i32) -> (i32, i64)
|
|
; CHECK-NEXT: .LBB{{[0-9]+}}_1:
|
|
; CHECK-NEXT: loop () -> (i32, i64)
|
|
; CHECK-NEXT: br 0{{$}}
|
|
; CHECK-NEXT: .LBB{{[0-9]+}}_2:
|
|
; CHECK-NEXT: end_loop{{$}}
|
|
define {i32, i64} @minimal_loop(i32* %p) {
|
|
entry:
|
|
br label %loop
|
|
loop:
|
|
br label %loop
|
|
}
|
|
|
|
; CHECK-LABEL: .section .custom_section.target_features
|
|
; CHECK-NEXT: .int8 1
|
|
; CHECK-NEXT: .int8 43
|
|
; CHECK-NEXT: .int8 10
|
|
; CHECK-NEXT: .ascii "multivalue"
|