mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
2a3fc0c8b2
Context: https://github.com/WebAssembly/memory64/blob/master/proposals/memory64/Overview.md This is just a first step, adding the new instruction variants while keeping the existing 32-bit functionality working. Some of the basic load/store tests have new wasm64 versions that show that the basics of the target are working. Further features need implementation, but these will be added in followups to keep things reviewable. Differential Revision: https://reviews.llvm.org/D80769
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_A32
|
|
; CHECK: LOCAL_SET_I32 [[LOCAL:[0-9]+]], %[[REG]]
|
|
; CHECK: COMPILER_FENCE
|
|
; CHECK: ADD_I32
|
|
; CHECK: LOCAL_GET_I32 [[LOCAL]]
|
|
; CHECK: CALL @foo
|
|
|
|
liveins: $arguments
|
|
%0:i32 = CONST_I32 0, implicit-def $arguments
|
|
%1:i32 = ATOMIC_NOTIFY_A32 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 @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_A32
|
|
; CHECK: LOCAL_SET_I32 [[LOCAL:[0-9]+]], %[[REG]]
|
|
; CHECK: ATOMIC_FENCE
|
|
; CHECK: ADD_I32
|
|
; CHECK: LOCAL_GET_I32 [[LOCAL]]
|
|
; CHECK: CALL @foo
|
|
|
|
liveins: $arguments
|
|
%0:i32 = CONST_I32 0, implicit-def $arguments
|
|
%1:i32 = ATOMIC_NOTIFY_A32 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 @foo, %2:i32, %1:i32, implicit-def $arguments
|
|
RETURN implicit-def $arguments
|
|
...
|