mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
a2b88794ad
This patch adds TargetStackID::WasmLocal. This stack holds locations of values that are only addressable by name -- not via a pointer to memory. For the WebAssembly target, these objects are lowered to WebAssembly local variables, which are managed by the WebAssembly run-time and are not addressable by linear memory. For the WebAssembly target IR indicates that an AllocaInst should be put on TargetStackID::WasmLocal by putting it in the non-integral address space WASM_ADDRESS_SPACE_WASM_VAR, with value 1. SROA will mostly lift these allocations to SSA locals, but any alloca that reaches instruction selection (usually in non-optimized builds) will be assigned the new TargetStackID there. Loads and stores to those values are transformed to new WebAssemblyISD::LOCAL_GET / WebAssemblyISD::LOCAL_SET nodes, which then lower to the type-specific LOCAL_GET_I32 etc instructions via tablegen patterns. Differential Revision: https://reviews.llvm.org/D101140
23 lines
803 B
LLVM
23 lines
803 B
LLVM
; RUN: llc -mtriple=wasm32-unknown-unknown -asm-verbose=false < %s | FileCheck %s --check-prefix=CHECKCG
|
|
; RUN: llc -mtriple=wasm32-unknown-unknown -stop-after=finalize-isel < %s | FileCheck %s --check-prefix=CHECKISEL
|
|
|
|
%f32_cell = type float addrspace(1)*
|
|
|
|
; CHECKISEL-LABEL: name: ir_local_f32
|
|
; CHECKISEL: stack:
|
|
; CHECKISEL: id: 0, name: retval, type: default, offset: 1, size: 1, alignment: 4,
|
|
; CHECKISEL-NEXT: stack-id: wasm-local
|
|
|
|
; CHECKCG-LABEL: ir_local_f32:
|
|
; CHECKCG-NEXT: .functype ir_local_f32 (f32) -> (f32)
|
|
; CHECKCG-NEXT: .local f32
|
|
; CHECKCG-NEXT: local.get 0
|
|
; CHECKCG-NEXT: local.set 1
|
|
|
|
define float @ir_local_f32(float %arg) {
|
|
%retval = alloca float, addrspace(1)
|
|
store float %arg, %f32_cell %retval
|
|
%reloaded = load float, %f32_cell %retval
|
|
ret float %reloaded
|
|
}
|