Summary: Extends the multivalue call infrastructure to tail calls, removes all legacy calls specialized for particular result types, and removes the CallIndirectFixup pass, since all indirect call arguments are now fixed up directly in the post-insertion hook. In order to keep supporting pretty-printed defs and uses in test expectations, MCInstLower now inserts an immediate containing the number of defs for each call and call_indirect. The InstPrinter is updated to query this immediate if it is present and determine which MCOperands are defs and uses accordingly. Depends on D72902. Reviewers: aheejin Subscribers: dschuff, mgorny, sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D74192
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 @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 @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 @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 @foo, %2:i32, %1:i32, implicit-def $arguments
|
|
RETURN implicit-def $arguments
|
|
...
|