91 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s --mtriple=wasm32-unknown-unknown | FileCheck %s3 4%alloca_cell = type ptr addrspace(1)5 6; We have a set of tests in which we set a local and then reload the7; local. If the load immediately follows the set, the DAG combiner will8; infer that the reloaded value is the same value that was set, which9; isn't what we want to test. To inhibit this optimization, we include10; 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 i3217; CHECK-NEXT: # %bb.0:18; CHECK-NEXT: local.get 019; CHECK-NEXT: local.set 120; CHECK-NEXT: call inhibit_store_to_load_forwarding21; CHECK-NEXT: local.get 122; CHECK-NEXT: # fallthrough-return23 %retval = alloca i32, addrspace(1)24 store i32 %arg, %alloca_cell %retval25 call void @inhibit_store_to_load_forwarding()26 %reloaded = load i32, %alloca_cell %retval27 ret i32 %reloaded28}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 i6434; CHECK-NEXT: # %bb.0:35; CHECK-NEXT: local.get 036; CHECK-NEXT: local.set 137; CHECK-NEXT: call inhibit_store_to_load_forwarding38; CHECK-NEXT: local.get 139; CHECK-NEXT: # fallthrough-return40 %retval = alloca i64, addrspace(1)41 store i64 %arg, %alloca_cell %retval42 call void @inhibit_store_to_load_forwarding()43 %reloaded = load i64, %alloca_cell %retval44 ; See note in ir_local_i32.45 ret i64 %reloaded46}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 f3252; CHECK-NEXT: # %bb.0:53; CHECK-NEXT: local.get 054; CHECK-NEXT: local.set 155; CHECK-NEXT: call inhibit_store_to_load_forwarding56; CHECK-NEXT: local.get 157; CHECK-NEXT: # fallthrough-return58 %retval = alloca float, addrspace(1)59 store float %arg, %alloca_cell %retval60 call void @inhibit_store_to_load_forwarding()61 %reloaded = load float, %alloca_cell %retval62 ret float %reloaded63}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 f6469; CHECK-NEXT: # %bb.0:70; CHECK-NEXT: local.get 071; CHECK-NEXT: local.set 172; CHECK-NEXT: call inhibit_store_to_load_forwarding73; CHECK-NEXT: local.get 174; CHECK-NEXT: # fallthrough-return75 %retval = alloca double, addrspace(1)76 store double %arg, %alloca_cell %retval77 call void @inhibit_store_to_load_forwarding()78 %reloaded = load double, %alloca_cell %retval79 ret double %reloaded80}81 82define void @ir_unreferenced_local() {83; CHECK-LABEL: ir_unreferenced_local:84; CHECK: .functype ir_unreferenced_local () -> ()85; CHECK-NEXT: .local i3286; CHECK-NEXT: # %bb.0:87; CHECK-NEXT: # fallthrough-return88 %unused = alloca i32, addrspace(1)89 ret void90}91