mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-01 21:04:04 -04:00
44cde01a89
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374235 91177308-0d34-0410-b5e6-96231b3b80d8
68 lines
2.1 KiB
YAML
68 lines
2.1 KiB
YAML
# RUN: llc -mtriple=wasm32-unknown-unknown -run-pass wasm-reg-stackify -run-pass wasm-explicit-locals %s -o - | FileCheck %s
|
|
|
|
# In the two tests below, without compiler_fence or atomic.fence in between,
|
|
# atomic.notify and i32.add will be reordered by register stackify pass to meet
|
|
# 'call @foo''s requirements. But because we have fences between atomic.notify
|
|
# and i32.add, they cannot be reordered, and local.set and local.get are
|
|
# inserted to save and load atomic.notify's return value.
|
|
|
|
--- |
|
|
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
|
target triple = "wasm32-unknown-unknown"
|
|
|
|
declare void @foo(i32, i32)
|
|
define void @compiler_fence_test(i32) {
|
|
ret void
|
|
}
|
|
define void @atomic_fence_test(i32) {
|
|
ret void
|
|
}
|
|
...
|
|
---
|
|
# CHECK-LABEL: name: compiler_fence_test
|
|
name: compiler_fence_test
|
|
liveins:
|
|
- { reg: '$arguments' }
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
; CHECK: %[[REG:[0-9]+]]:i32 = ATOMIC_NOTIFY
|
|
; CHECK: LOCAL_SET_I32 [[LOCAL:[0-9]+]], %[[REG]]
|
|
; CHECK: COMPILER_FENCE
|
|
; CHECK: ADD_I32
|
|
; CHECK: LOCAL_GET_I32 [[LOCAL]]
|
|
; CHECK: CALL_VOID @foo
|
|
|
|
liveins: $arguments
|
|
%0:i32 = CONST_I32 0, implicit-def $arguments
|
|
%1:i32 = ATOMIC_NOTIFY 2, 0, %0:i32, %0:i32, implicit-def $arguments
|
|
COMPILER_FENCE implicit-def $arguments
|
|
%2:i32 = ADD_I32 %0:i32, %0:i32, implicit-def $arguments
|
|
CALL_VOID @foo, %2:i32, %1:i32, implicit-def $arguments
|
|
RETURN implicit-def $arguments
|
|
...
|
|
|
|
---
|
|
# CHECK-LABEL: name: atomic_fence_test
|
|
name: atomic_fence_test
|
|
liveins:
|
|
- { reg: '$arguments' }
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
; CHECK: %[[REG:[0-9]+]]:i32 = ATOMIC_NOTIFY
|
|
; CHECK: LOCAL_SET_I32 [[LOCAL:[0-9]+]], %[[REG]]
|
|
; CHECK: ATOMIC_FENCE
|
|
; CHECK: ADD_I32
|
|
; CHECK: LOCAL_GET_I32 [[LOCAL]]
|
|
; CHECK: CALL_VOID @foo
|
|
|
|
liveins: $arguments
|
|
%0:i32 = CONST_I32 0, implicit-def $arguments
|
|
%1:i32 = ATOMIC_NOTIFY 2, 0, %0:i32, %0:i32, implicit-def $arguments
|
|
ATOMIC_FENCE 0, implicit-def $arguments
|
|
%2:i32 = ADD_I32 %0:i32, %0:i32, implicit-def $arguments
|
|
CALL_VOID @foo, %2:i32, %1:i32, implicit-def $arguments
|
|
RETURN implicit-def $arguments
|
|
...
|