1;;! target = "x86_64" 2;;! flags = [ 3;;! "-Ccranelift-enable-heap-access-spectre-mitigation=false", 4;;! "-Ostatic-memory-maximum-size=0", 5;;! "-Odynamic-memory-guard-size=0", 6;;! ] 7 8;; Test that dynamic memories with `min_size == max_size` don't actually load 9;; their dynamic memory bound, since it is a constant. 10 11(module 12 (memory 1 1) 13 14 (func (export "do_store") (param i32 i32) 15 local.get 0 16 local.get 1 17 i32.store8 offset=0) 18 19 (func (export "do_load") (param i32) (result i32) 20 local.get 0 21 i32.load8_u offset=0)) 22 23;; function u0:0(i64 vmctx, i64, i32, i32) tail { 24;; gv0 = vmctx 25;; gv1 = load.i64 notrap aligned readonly gv0+8 26;; gv2 = load.i64 notrap aligned gv1+24 27;; gv3 = vmctx 28;; gv4 = load.i64 notrap aligned gv3+64 29;; gv5 = load.i64 notrap aligned readonly can_move gv3+56 30;; stack_limit = gv2 31;; 32;; block0(v0: i64, v1: i64, v2: i32, v3: i32): 33;; @0041 v4 = uextend.i64 v2 34;; @0041 v5 = iconst.i64 0x0001_0000 35;; @0041 v6 = icmp uge v4, v5 ; v5 = 0x0001_0000 36;; @0041 trapnz v6, heap_oob 37;; @0041 v7 = load.i64 notrap aligned readonly can_move v0+56 38;; @0041 v8 = iadd v7, v4 39;; @0041 istore8 little heap v3, v8 40;; @0044 jump block1 41;; 42;; block1: 43;; @0044 return 44;; } 45;; 46;; function u0:1(i64 vmctx, i64, i32) -> i32 tail { 47;; gv0 = vmctx 48;; gv1 = load.i64 notrap aligned readonly gv0+8 49;; gv2 = load.i64 notrap aligned gv1+24 50;; gv3 = vmctx 51;; gv4 = load.i64 notrap aligned gv3+64 52;; gv5 = load.i64 notrap aligned readonly can_move gv3+56 53;; stack_limit = gv2 54;; 55;; block0(v0: i64, v1: i64, v2: i32): 56;; @0049 v4 = uextend.i64 v2 57;; @0049 v5 = iconst.i64 0x0001_0000 58;; @0049 v6 = icmp uge v4, v5 ; v5 = 0x0001_0000 59;; @0049 trapnz v6, heap_oob 60;; @0049 v7 = load.i64 notrap aligned readonly can_move v0+56 61;; @0049 v8 = iadd v7, v4 62;; @0049 v9 = uload8.i32 little heap v8 63;; @004c jump block1 64;; 65;; block1: 66;; @004c return v9 67;; } 68