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