xref: /llvm-project/llvm/test/CodeGen/WebAssembly/ir-locals.ll (revision 1ae859753c06c480f05baa31a871b998c2c2acd2)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s --mtriple=wasm32-unknown-unknown | FileCheck %s
3
4%alloca_cell = type ptr addrspace(1)
5
6; We have a set of tests in which we set a local and then reload the
7; local.  If the load immediately follows the set, the DAG combiner will
8; infer that the reloaded value is the same value that was set, which
9; isn't what we want to test.  To inhibit this optimization, we include
10; an opaque call between the store and the load.
11declare void @inhibit_store_to_load_forwarding()
12
13define i32 @ir_local_i32(i32 %arg) {
14; CHECK-LABEL: ir_local_i32:
15; CHECK:         .functype ir_local_i32 (i32) -> (i32)
16; CHECK-NEXT:    .local i32
17; CHECK-NEXT:  # %bb.0:
18; CHECK-NEXT:    local.get 0
19; CHECK-NEXT:    local.set 1
20; CHECK-NEXT:    call inhibit_store_to_load_forwarding
21; CHECK-NEXT:    local.get 1
22; CHECK-NEXT:    # fallthrough-return
23 %retval = alloca i32, addrspace(1)
24 store i32 %arg, %alloca_cell %retval
25 call void @inhibit_store_to_load_forwarding()
26 %reloaded = load i32, %alloca_cell %retval
27 ret i32 %reloaded
28}
29
30define i64 @ir_local_i64(i64 %arg) {
31; CHECK-LABEL: ir_local_i64:
32; CHECK:         .functype ir_local_i64 (i64) -> (i64)
33; CHECK-NEXT:    .local i64
34; CHECK-NEXT:  # %bb.0:
35; CHECK-NEXT:    local.get 0
36; CHECK-NEXT:    local.set 1
37; CHECK-NEXT:    call inhibit_store_to_load_forwarding
38; CHECK-NEXT:    local.get 1
39; CHECK-NEXT:    # fallthrough-return
40 %retval = alloca i64, addrspace(1)
41 store i64 %arg, %alloca_cell %retval
42 call void @inhibit_store_to_load_forwarding()
43 %reloaded = load i64, %alloca_cell %retval
44 ; See note in ir_local_i32.
45 ret i64 %reloaded
46}
47
48define float @ir_local_f32(float %arg) {
49; CHECK-LABEL: ir_local_f32:
50; CHECK:         .functype ir_local_f32 (f32) -> (f32)
51; CHECK-NEXT:    .local f32
52; CHECK-NEXT:  # %bb.0:
53; CHECK-NEXT:    local.get 0
54; CHECK-NEXT:    local.set 1
55; CHECK-NEXT:    call inhibit_store_to_load_forwarding
56; CHECK-NEXT:    local.get 1
57; CHECK-NEXT:    # fallthrough-return
58 %retval = alloca float, addrspace(1)
59 store float %arg, %alloca_cell %retval
60 call void @inhibit_store_to_load_forwarding()
61 %reloaded = load float, %alloca_cell %retval
62 ret float %reloaded
63}
64
65define double @ir_local_f64(double %arg) {
66; CHECK-LABEL: ir_local_f64:
67; CHECK:         .functype ir_local_f64 (f64) -> (f64)
68; CHECK-NEXT:    .local f64
69; CHECK-NEXT:  # %bb.0:
70; CHECK-NEXT:    local.get 0
71; CHECK-NEXT:    local.set 1
72; CHECK-NEXT:    call inhibit_store_to_load_forwarding
73; CHECK-NEXT:    local.get 1
74; CHECK-NEXT:    # fallthrough-return
75 %retval = alloca double, addrspace(1)
76 store double %arg, %alloca_cell %retval
77 call void @inhibit_store_to_load_forwarding()
78 %reloaded = load double, %alloca_cell %retval
79 ret double %reloaded
80}
81
82define void @ir_unreferenced_local() {
83; CHECK-LABEL: ir_unreferenced_local:
84; CHECK:         .functype ir_unreferenced_local () -> ()
85; CHECK-NEXT:    .local i32
86; CHECK-NEXT:  # %bb.0:
87; CHECK-NEXT:    # fallthrough-return
88 %unused = alloca i32, addrspace(1)
89 ret void
90}
91