Files
llvm/test/CodeGen/WebAssembly/atomic-fence.mir
T
Thomas Lively 44cde01a89 [WebAssembly] Make returns variadic
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
2019-10-09 21:42:08 +00:00

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
...