1;;! target = "x86_64" 2;;! test = "optimize" 3;;! flags = "-O opt-level=0" 4 5;; Test basic code generation for table WebAssembly instructions. 6;; Use optimization but with `opt-level=0` to legalize away table_addr instructions. 7 8(module 9 (table (export "table") 1 externref) 10 (func (export "table.set.const") (param externref) 11 i32.const 0 12 local.get 0 13 table.set 0) 14 (func (export "table.set.var") (param i32 externref) 15 local.get 0 16 local.get 1 17 table.set 0)) 18 19;; function u0:0(i64 vmctx, i64, i32) tail { 20;; gv0 = vmctx 21;; gv1 = load.i64 notrap aligned readonly gv0+8 22;; gv2 = load.i64 notrap aligned gv1+24 23;; gv3 = vmctx 24;; gv4 = load.i64 notrap aligned gv3+48 25;; gv5 = load.i64 notrap aligned gv3+56 26;; gv6 = load.i64 notrap aligned readonly can_move gv3+8 27;; gv7 = load.i64 notrap aligned readonly can_move gv6+32 28;; gv8 = load.i64 notrap aligned gv6+40 29;; sig0 = (i64 vmctx, i32) tail 30;; fn0 = colocated u805306368:25 sig0 31;; stack_limit = gv2 32;; 33;; block0(v0: i64, v1: i64, v2: i32): 34;; @0051 v3 = iconst.i32 0 35;; @0055 v4 = load.i64 notrap aligned v0+56 36;; @0055 v5 = ireduce.i32 v4 37;; @0055 v6 = icmp uge v3, v5 ; v3 = 0 38;; @0055 v7 = uextend.i64 v3 ; v3 = 0 39;; @0055 v8 = load.i64 notrap aligned v0+48 40;; v63 = iconst.i64 2 41;; @0055 v9 = ishl v7, v63 ; v63 = 2 42;; @0055 v10 = iadd v8, v9 43;; @0055 v11 = iconst.i64 0 44;; @0055 v12 = select_spectre_guard v6, v11, v10 ; v11 = 0 45;; @0055 v13 = load.i32 user5 aligned table v12 46;; v62 = iconst.i32 1 47;; @0055 v14 = band v2, v62 ; v62 = 1 48;; v61 = iconst.i32 0 49;; @0055 v15 = icmp eq v2, v61 ; v61 = 0 50;; @0055 v16 = uextend.i32 v15 51;; @0055 v17 = bor v14, v16 52;; @0055 brif v17, block3, block2 53;; 54;; block2: 55;; @0055 v18 = uextend.i64 v2 56;; @0055 v59 = load.i64 notrap aligned readonly can_move v0+8 57;; @0055 v19 = load.i64 notrap aligned readonly can_move v59+32 58;; @0055 v20 = iadd v19, v18 59;; @0055 v21 = iconst.i64 8 60;; @0055 v22 = iadd v20, v21 ; v21 = 8 61;; @0055 v23 = load.i64 notrap aligned v22 62;; v58 = iconst.i64 1 63;; @0055 v24 = iadd v23, v58 ; v58 = 1 64;; @0055 v25 = uextend.i64 v2 65;; @0055 v56 = load.i64 notrap aligned readonly can_move v0+8 66;; @0055 v26 = load.i64 notrap aligned readonly can_move v56+32 67;; @0055 v27 = iadd v26, v25 68;; @0055 v28 = iconst.i64 8 69;; @0055 v29 = iadd v27, v28 ; v28 = 8 70;; @0055 store notrap aligned v24, v29 71;; @0055 jump block3 72;; 73;; block3: 74;; @0055 store.i32 user5 aligned table v2, v12 75;; v55 = iconst.i32 1 76;; @0055 v30 = band.i32 v13, v55 ; v55 = 1 77;; v54 = iconst.i32 0 78;; @0055 v31 = icmp.i32 eq v13, v54 ; v54 = 0 79;; @0055 v32 = uextend.i32 v31 80;; @0055 v33 = bor v30, v32 81;; @0055 brif v33, block7, block4 82;; 83;; block4: 84;; @0055 v34 = uextend.i64 v13 85;; @0055 v52 = load.i64 notrap aligned readonly can_move v0+8 86;; @0055 v35 = load.i64 notrap aligned readonly can_move v52+32 87;; @0055 v36 = iadd v35, v34 88;; @0055 v37 = iconst.i64 8 89;; @0055 v38 = iadd v36, v37 ; v37 = 8 90;; @0055 v39 = load.i64 notrap aligned v38 91;; v51 = iconst.i64 -1 92;; @0055 v40 = iadd v39, v51 ; v51 = -1 93;; v50 = iconst.i64 0 94;; @0055 v41 = icmp eq v40, v50 ; v50 = 0 95;; @0055 brif v41, block5, block6 96;; 97;; block5 cold: 98;; @0055 call fn0(v0, v13) 99;; @0055 jump block7 100;; 101;; block6: 102;; @0055 v43 = uextend.i64 v13 103;; @0055 v48 = load.i64 notrap aligned readonly can_move v0+8 104;; @0055 v44 = load.i64 notrap aligned readonly can_move v48+32 105;; @0055 v45 = iadd v44, v43 106;; @0055 v46 = iconst.i64 8 107;; @0055 v47 = iadd v45, v46 ; v46 = 8 108;; @0055 store.i64 notrap aligned v40, v47 109;; @0055 jump block7 110;; 111;; block7: 112;; @0057 jump block1 113;; 114;; block1: 115;; @0057 return 116;; } 117;; 118;; function u0:1(i64 vmctx, i64, i32, i32) tail { 119;; gv0 = vmctx 120;; gv1 = load.i64 notrap aligned readonly gv0+8 121;; gv2 = load.i64 notrap aligned gv1+24 122;; gv3 = vmctx 123;; gv4 = load.i64 notrap aligned gv3+48 124;; gv5 = load.i64 notrap aligned gv3+56 125;; gv6 = load.i64 notrap aligned readonly can_move gv3+8 126;; gv7 = load.i64 notrap aligned readonly can_move gv6+32 127;; gv8 = load.i64 notrap aligned gv6+40 128;; sig0 = (i64 vmctx, i32) tail 129;; fn0 = colocated u805306368:25 sig0 130;; stack_limit = gv2 131;; 132;; block0(v0: i64, v1: i64, v2: i32, v3: i32): 133;; @005e v4 = load.i64 notrap aligned v0+56 134;; @005e v5 = ireduce.i32 v4 135;; @005e v6 = icmp uge v2, v5 136;; @005e v7 = uextend.i64 v2 137;; @005e v8 = load.i64 notrap aligned v0+48 138;; v63 = iconst.i64 2 139;; @005e v9 = ishl v7, v63 ; v63 = 2 140;; @005e v10 = iadd v8, v9 141;; @005e v11 = iconst.i64 0 142;; @005e v12 = select_spectre_guard v6, v11, v10 ; v11 = 0 143;; @005e v13 = load.i32 user5 aligned table v12 144;; v62 = iconst.i32 1 145;; @005e v14 = band v3, v62 ; v62 = 1 146;; v61 = iconst.i32 0 147;; @005e v15 = icmp eq v3, v61 ; v61 = 0 148;; @005e v16 = uextend.i32 v15 149;; @005e v17 = bor v14, v16 150;; @005e brif v17, block3, block2 151;; 152;; block2: 153;; @005e v18 = uextend.i64 v3 154;; @005e v59 = load.i64 notrap aligned readonly can_move v0+8 155;; @005e v19 = load.i64 notrap aligned readonly can_move v59+32 156;; @005e v20 = iadd v19, v18 157;; @005e v21 = iconst.i64 8 158;; @005e v22 = iadd v20, v21 ; v21 = 8 159;; @005e v23 = load.i64 notrap aligned v22 160;; v58 = iconst.i64 1 161;; @005e v24 = iadd v23, v58 ; v58 = 1 162;; @005e v25 = uextend.i64 v3 163;; @005e v56 = load.i64 notrap aligned readonly can_move v0+8 164;; @005e v26 = load.i64 notrap aligned readonly can_move v56+32 165;; @005e v27 = iadd v26, v25 166;; @005e v28 = iconst.i64 8 167;; @005e v29 = iadd v27, v28 ; v28 = 8 168;; @005e store notrap aligned v24, v29 169;; @005e jump block3 170;; 171;; block3: 172;; @005e store.i32 user5 aligned table v3, v12 173;; v55 = iconst.i32 1 174;; @005e v30 = band.i32 v13, v55 ; v55 = 1 175;; v54 = iconst.i32 0 176;; @005e v31 = icmp.i32 eq v13, v54 ; v54 = 0 177;; @005e v32 = uextend.i32 v31 178;; @005e v33 = bor v30, v32 179;; @005e brif v33, block7, block4 180;; 181;; block4: 182;; @005e v34 = uextend.i64 v13 183;; @005e v52 = load.i64 notrap aligned readonly can_move v0+8 184;; @005e v35 = load.i64 notrap aligned readonly can_move v52+32 185;; @005e v36 = iadd v35, v34 186;; @005e v37 = iconst.i64 8 187;; @005e v38 = iadd v36, v37 ; v37 = 8 188;; @005e v39 = load.i64 notrap aligned v38 189;; v51 = iconst.i64 -1 190;; @005e v40 = iadd v39, v51 ; v51 = -1 191;; v50 = iconst.i64 0 192;; @005e v41 = icmp eq v40, v50 ; v50 = 0 193;; @005e brif v41, block5, block6 194;; 195;; block5 cold: 196;; @005e call fn0(v0, v13) 197;; @005e jump block7 198;; 199;; block6: 200;; @005e v43 = uextend.i64 v13 201;; @005e v48 = load.i64 notrap aligned readonly can_move v0+8 202;; @005e v44 = load.i64 notrap aligned readonly can_move v48+32 203;; @005e v45 = iadd v44, v43 204;; @005e v46 = iconst.i64 8 205;; @005e v47 = iadd v45, v46 ; v46 = 8 206;; @005e store.i64 notrap aligned v40, v47 207;; @005e jump block7 208;; 209;; block7: 210;; @0060 jump block1 211;; 212;; block1: 213;; @0060 return 214;; } 215