brintos

brintos / llvm-project-archived public Read only

0
0
Text · 124.4 KiB · fc47dc8 Raw
3647 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s3 4; Test SIMD loads and stores5 6target triple = "wasm32-unknown-unknown"7 8; ==============================================================================9; 16 x i810; ==============================================================================11define <16 x i8> @load_v16i8(ptr %p) {12; CHECK-LABEL: load_v16i8:13; CHECK:         .functype load_v16i8 (i32) -> (v128)14; CHECK-NEXT:  # %bb.0:15; CHECK-NEXT:    local.get 016; CHECK-NEXT:    v128.load 017; CHECK-NEXT:    # fallthrough-return18  %v = load <16 x i8>, ptr %p19  ret <16 x i8> %v20}21 22define <16 x i8> @load_splat_v16i8(ptr %p) {23; CHECK-LABEL: load_splat_v16i8:24; CHECK:         .functype load_splat_v16i8 (i32) -> (v128)25; CHECK-NEXT:  # %bb.0:26; CHECK-NEXT:    local.get 027; CHECK-NEXT:    v128.load8_splat 028; CHECK-NEXT:    # fallthrough-return29  %e = load i8, ptr %p30  %v1 = insertelement <16 x i8> undef, i8 %e, i32 031  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer32  ret <16 x i8> %v233}34 35define <16 x i8> @load_v16i8_with_folded_offset(ptr %p) {36; CHECK-LABEL: load_v16i8_with_folded_offset:37; CHECK:         .functype load_v16i8_with_folded_offset (i32) -> (v128)38; CHECK-NEXT:  # %bb.0:39; CHECK-NEXT:    local.get 040; CHECK-NEXT:    v128.load 1641; CHECK-NEXT:    # fallthrough-return42  %q = ptrtoint ptr %p to i3243  %r = add nuw i32 %q, 1644  %s = inttoptr i32 %r to ptr45  %v = load <16 x i8>, ptr %s46  ret <16 x i8> %v47}48 49define <16 x i8> @load_splat_v16i8_with_folded_offset(ptr %p) {50; CHECK-LABEL: load_splat_v16i8_with_folded_offset:51; CHECK:         .functype load_splat_v16i8_with_folded_offset (i32) -> (v128)52; CHECK-NEXT:  # %bb.0:53; CHECK-NEXT:    local.get 054; CHECK-NEXT:    v128.load8_splat 1655; CHECK-NEXT:    # fallthrough-return56  %q = ptrtoint ptr %p to i3257  %r = add nuw i32 %q, 1658  %s = inttoptr i32 %r to ptr59  %e = load i8, ptr %s60  %v1 = insertelement <16 x i8> undef, i8 %e, i32 061  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer62  ret <16 x i8> %v263}64 65define <16 x i8> @load_v16i8_with_folded_gep_offset(ptr %p) {66; CHECK-LABEL: load_v16i8_with_folded_gep_offset:67; CHECK:         .functype load_v16i8_with_folded_gep_offset (i32) -> (v128)68; CHECK-NEXT:  # %bb.0:69; CHECK-NEXT:    local.get 070; CHECK-NEXT:    v128.load 1671; CHECK-NEXT:    # fallthrough-return72  %s = getelementptr inbounds <16 x i8>, ptr %p, i32 173  %v = load <16 x i8>, ptr %s74  ret <16 x i8> %v75}76 77define <16 x i8> @load_splat_v16i8_with_folded_gep_offset(ptr %p) {78; CHECK-LABEL: load_splat_v16i8_with_folded_gep_offset:79; CHECK:         .functype load_splat_v16i8_with_folded_gep_offset (i32) -> (v128)80; CHECK-NEXT:  # %bb.0:81; CHECK-NEXT:    local.get 082; CHECK-NEXT:    v128.load8_splat 183; CHECK-NEXT:    # fallthrough-return84  %s = getelementptr inbounds i8, ptr %p, i32 185  %e = load i8, ptr %s86  %v1 = insertelement <16 x i8> undef, i8 %e, i32 087  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer88  ret <16 x i8> %v289}90 91define <16 x i8> @load_v16i8_with_unfolded_gep_negative_offset(ptr %p) {92; CHECK-LABEL: load_v16i8_with_unfolded_gep_negative_offset:93; CHECK:         .functype load_v16i8_with_unfolded_gep_negative_offset (i32) -> (v128)94; CHECK-NEXT:  # %bb.0:95; CHECK-NEXT:    local.get 096; CHECK-NEXT:    i32.const -1697; CHECK-NEXT:    i32.add98; CHECK-NEXT:    v128.load 099; CHECK-NEXT:    # fallthrough-return100  %s = getelementptr inbounds <16 x i8>, ptr %p, i32 -1101  %v = load <16 x i8>, ptr %s102  ret <16 x i8> %v103}104 105define <16 x i8> @load_splat_v16i8_with_unfolded_gep_negative_offset(ptr %p) {106; CHECK-LABEL: load_splat_v16i8_with_unfolded_gep_negative_offset:107; CHECK:         .functype load_splat_v16i8_with_unfolded_gep_negative_offset (i32) -> (v128)108; CHECK-NEXT:  # %bb.0:109; CHECK-NEXT:    local.get 0110; CHECK-NEXT:    i32.const -1111; CHECK-NEXT:    i32.add112; CHECK-NEXT:    v128.load8_splat 0113; CHECK-NEXT:    # fallthrough-return114  %s = getelementptr inbounds i8, ptr %p, i32 -1115  %e = load i8, ptr %s116  %v1 = insertelement <16 x i8> undef, i8 %e, i32 0117  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer118  ret <16 x i8> %v2119}120 121define <16 x i8> @load_v16i8_with_unfolded_offset(ptr %p) {122; CHECK-LABEL: load_v16i8_with_unfolded_offset:123; CHECK:         .functype load_v16i8_with_unfolded_offset (i32) -> (v128)124; CHECK-NEXT:  # %bb.0:125; CHECK-NEXT:    local.get 0126; CHECK-NEXT:    i32.const 16127; CHECK-NEXT:    i32.add128; CHECK-NEXT:    v128.load 0129; CHECK-NEXT:    # fallthrough-return130  %q = ptrtoint ptr %p to i32131  %r = add nsw i32 %q, 16132  %s = inttoptr i32 %r to ptr133  %v = load <16 x i8>, ptr %s134  ret <16 x i8> %v135}136 137define <16 x i8> @load_splat_v16i8_with_unfolded_offset(ptr %p) {138; CHECK-LABEL: load_splat_v16i8_with_unfolded_offset:139; CHECK:         .functype load_splat_v16i8_with_unfolded_offset (i32) -> (v128)140; CHECK-NEXT:  # %bb.0:141; CHECK-NEXT:    local.get 0142; CHECK-NEXT:    i32.const 16143; CHECK-NEXT:    i32.add144; CHECK-NEXT:    v128.load8_splat 0145; CHECK-NEXT:    # fallthrough-return146  %q = ptrtoint ptr %p to i32147  %r = add nsw i32 %q, 16148  %s = inttoptr i32 %r to ptr149  %e = load i8, ptr %s150  %v1 = insertelement <16 x i8> undef, i8 %e, i32 0151  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer152  ret <16 x i8> %v2153}154 155define <16 x i8> @load_v16i8_with_unfolded_gep_offset(ptr %p) {156; CHECK-LABEL: load_v16i8_with_unfolded_gep_offset:157; CHECK:         .functype load_v16i8_with_unfolded_gep_offset (i32) -> (v128)158; CHECK-NEXT:  # %bb.0:159; CHECK-NEXT:    local.get 0160; CHECK-NEXT:    i32.const 16161; CHECK-NEXT:    i32.add162; CHECK-NEXT:    v128.load 0163; CHECK-NEXT:    # fallthrough-return164  %s = getelementptr <16 x i8>, ptr %p, i32 1165  %v = load <16 x i8>, ptr %s166  ret <16 x i8> %v167}168 169define <16 x i8> @load_splat_v16i8_with_unfolded_gep_offset(ptr %p) {170; CHECK-LABEL: load_splat_v16i8_with_unfolded_gep_offset:171; CHECK:         .functype load_splat_v16i8_with_unfolded_gep_offset (i32) -> (v128)172; CHECK-NEXT:  # %bb.0:173; CHECK-NEXT:    local.get 0174; CHECK-NEXT:    i32.const 1175; CHECK-NEXT:    i32.add176; CHECK-NEXT:    v128.load8_splat 0177; CHECK-NEXT:    # fallthrough-return178  %s = getelementptr i8, ptr %p, i32 1179  %e = load i8, ptr %s180  %v1 = insertelement <16 x i8> undef, i8 %e, i32 0181  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer182  ret <16 x i8> %v2183}184 185define <16 x i8> @load_v16i8_from_numeric_address() {186; CHECK-LABEL: load_v16i8_from_numeric_address:187; CHECK:         .functype load_v16i8_from_numeric_address () -> (v128)188; CHECK-NEXT:  # %bb.0:189; CHECK-NEXT:    i32.const 0190; CHECK-NEXT:    v128.load 32191; CHECK-NEXT:    # fallthrough-return192  %s = inttoptr i32 32 to ptr193  %v = load <16 x i8>, ptr %s194  ret <16 x i8> %v195}196 197define <16 x i8> @load_splat_v16i8_from_numeric_address() {198; CHECK-LABEL: load_splat_v16i8_from_numeric_address:199; CHECK:         .functype load_splat_v16i8_from_numeric_address () -> (v128)200; CHECK-NEXT:  # %bb.0:201; CHECK-NEXT:    i32.const 0202; CHECK-NEXT:    v128.load8_splat 32203; CHECK-NEXT:    # fallthrough-return204  %s = inttoptr i32 32 to ptr205  %e = load i8, ptr %s206  %v1 = insertelement <16 x i8> undef, i8 %e, i32 0207  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer208  ret <16 x i8> %v2209}210 211@gv_v16i8 = global <16 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>212define <16 x i8> @load_v16i8_from_global_address() {213; CHECK-LABEL: load_v16i8_from_global_address:214; CHECK:         .functype load_v16i8_from_global_address () -> (v128)215; CHECK-NEXT:  # %bb.0:216; CHECK-NEXT:    i32.const 0217; CHECK-NEXT:    v128.load gv_v16i8218; CHECK-NEXT:    # fallthrough-return219  %v = load <16 x i8>, ptr @gv_v16i8220  ret <16 x i8> %v221}222 223@gv_i8 = global i8 42224define <16 x i8> @load_splat_v16i8_from_global_address() {225; CHECK-LABEL: load_splat_v16i8_from_global_address:226; CHECK:         .functype load_splat_v16i8_from_global_address () -> (v128)227; CHECK-NEXT:  # %bb.0:228; CHECK-NEXT:    i32.const 0229; CHECK-NEXT:    v128.load8_splat gv_i8230; CHECK-NEXT:    # fallthrough-return231  %e = load i8, ptr @gv_i8232  %v1 = insertelement <16 x i8> undef, i8 %e, i32 0233  %v2 = shufflevector <16 x i8> %v1, <16 x i8> undef, <16 x i32> zeroinitializer234  ret <16 x i8> %v2235}236 237define void @store_v16i8(<16 x i8> %v, ptr %p) {238; CHECK-LABEL: store_v16i8:239; CHECK:         .functype store_v16i8 (v128, i32) -> ()240; CHECK-NEXT:  # %bb.0:241; CHECK-NEXT:    local.get 1242; CHECK-NEXT:    local.get 0243; CHECK-NEXT:    v128.store 0244; CHECK-NEXT:    # fallthrough-return245  store <16 x i8> %v , ptr %p246  ret void247}248 249define void @store_v16i8_with_folded_offset(<16 x i8> %v, ptr %p) {250; CHECK-LABEL: store_v16i8_with_folded_offset:251; CHECK:         .functype store_v16i8_with_folded_offset (v128, i32) -> ()252; CHECK-NEXT:  # %bb.0:253; CHECK-NEXT:    local.get 1254; CHECK-NEXT:    local.get 0255; CHECK-NEXT:    v128.store 16256; CHECK-NEXT:    # fallthrough-return257  %q = ptrtoint ptr %p to i32258  %r = add nuw i32 %q, 16259  %s = inttoptr i32 %r to ptr260  store <16 x i8> %v , ptr %s261  ret void262}263 264define void @store_v16i8_with_folded_gep_offset(<16 x i8> %v, ptr %p) {265; CHECK-LABEL: store_v16i8_with_folded_gep_offset:266; CHECK:         .functype store_v16i8_with_folded_gep_offset (v128, i32) -> ()267; CHECK-NEXT:  # %bb.0:268; CHECK-NEXT:    local.get 1269; CHECK-NEXT:    local.get 0270; CHECK-NEXT:    v128.store 16271; CHECK-NEXT:    # fallthrough-return272  %s = getelementptr inbounds <16 x i8>, ptr %p, i32 1273  store <16 x i8> %v , ptr %s274  ret void275}276 277define void @store_v16i8_with_unfolded_gep_negative_offset(<16 x i8> %v, ptr %p) {278; CHECK-LABEL: store_v16i8_with_unfolded_gep_negative_offset:279; CHECK:         .functype store_v16i8_with_unfolded_gep_negative_offset (v128, i32) -> ()280; CHECK-NEXT:  # %bb.0:281; CHECK-NEXT:    local.get 1282; CHECK-NEXT:    i32.const -16283; CHECK-NEXT:    i32.add284; CHECK-NEXT:    local.get 0285; CHECK-NEXT:    v128.store 0286; CHECK-NEXT:    # fallthrough-return287  %s = getelementptr inbounds <16 x i8>, ptr %p, i32 -1288  store <16 x i8> %v , ptr %s289  ret void290}291 292define void @store_v16i8_with_unfolded_offset(<16 x i8> %v, ptr %p) {293; CHECK-LABEL: store_v16i8_with_unfolded_offset:294; CHECK:         .functype store_v16i8_with_unfolded_offset (v128, i32) -> ()295; CHECK-NEXT:  # %bb.0:296; CHECK-NEXT:    local.get 1297; CHECK-NEXT:    i32.const 16298; CHECK-NEXT:    i32.add299; CHECK-NEXT:    local.get 0300; CHECK-NEXT:    v128.store 0301; CHECK-NEXT:    # fallthrough-return302  %q = ptrtoint ptr %p to i32303  %r = add nsw i32 %q, 16304  %s = inttoptr i32 %r to ptr305  store <16 x i8> %v , ptr %s306  ret void307}308 309define void @store_v16i8_with_unfolded_gep_offset(<16 x i8> %v, ptr %p) {310; CHECK-LABEL: store_v16i8_with_unfolded_gep_offset:311; CHECK:         .functype store_v16i8_with_unfolded_gep_offset (v128, i32) -> ()312; CHECK-NEXT:  # %bb.0:313; CHECK-NEXT:    local.get 1314; CHECK-NEXT:    i32.const 16315; CHECK-NEXT:    i32.add316; CHECK-NEXT:    local.get 0317; CHECK-NEXT:    v128.store 0318; CHECK-NEXT:    # fallthrough-return319  %s = getelementptr <16 x i8>, ptr %p, i32 1320  store <16 x i8> %v , ptr %s321  ret void322}323 324define void @store_v16i8_to_numeric_address(<16 x i8> %v) {325; CHECK-LABEL: store_v16i8_to_numeric_address:326; CHECK:         .functype store_v16i8_to_numeric_address (v128) -> ()327; CHECK-NEXT:  # %bb.0:328; CHECK-NEXT:    i32.const 0329; CHECK-NEXT:    local.get 0330; CHECK-NEXT:    v128.store 32331; CHECK-NEXT:    # fallthrough-return332  %s = inttoptr i32 32 to ptr333  store <16 x i8> %v , ptr %s334  ret void335}336 337define void @store_v16i8_to_global_address(<16 x i8> %v) {338; CHECK-LABEL: store_v16i8_to_global_address:339; CHECK:         .functype store_v16i8_to_global_address (v128) -> ()340; CHECK-NEXT:  # %bb.0:341; CHECK-NEXT:    i32.const 0342; CHECK-NEXT:    local.get 0343; CHECK-NEXT:    v128.store gv_v16i8344; CHECK-NEXT:    # fallthrough-return345  store <16 x i8> %v , ptr @gv_v16i8346  ret void347}348 349; ==============================================================================350; 8 x i16351; ==============================================================================352define <8 x i16> @load_v8i16(ptr %p) {353; CHECK-LABEL: load_v8i16:354; CHECK:         .functype load_v8i16 (i32) -> (v128)355; CHECK-NEXT:  # %bb.0:356; CHECK-NEXT:    local.get 0357; CHECK-NEXT:    v128.load 0358; CHECK-NEXT:    # fallthrough-return359  %v = load <8 x i16>, ptr %p360  ret <8 x i16> %v361}362 363define <8 x i16> @load_splat_v8i16(ptr %p) {364; CHECK-LABEL: load_splat_v8i16:365; CHECK:         .functype load_splat_v8i16 (i32) -> (v128)366; CHECK-NEXT:  # %bb.0:367; CHECK-NEXT:    local.get 0368; CHECK-NEXT:    v128.load16_splat 0369; CHECK-NEXT:    # fallthrough-return370  %e = load i16, ptr %p371  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0372  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer373  ret <8 x i16> %v2374}375 376define <8 x i16> @load_sext_v8i16(ptr %p) {377; CHECK-LABEL: load_sext_v8i16:378; CHECK:         .functype load_sext_v8i16 (i32) -> (v128)379; CHECK-NEXT:  # %bb.0:380; CHECK-NEXT:    local.get 0381; CHECK-NEXT:    i16x8.load8x8_s 0382; CHECK-NEXT:    # fallthrough-return383  %v = load <8 x i8>, ptr %p384  %v2 = sext <8 x i8> %v to <8 x i16>385  ret <8 x i16> %v2386}387 388define <8 x i16> @load_zext_v8i16(ptr %p) {389; CHECK-LABEL: load_zext_v8i16:390; CHECK:         .functype load_zext_v8i16 (i32) -> (v128)391; CHECK-NEXT:  # %bb.0:392; CHECK-NEXT:    local.get 0393; CHECK-NEXT:    i16x8.load8x8_u 0394; CHECK-NEXT:    # fallthrough-return395  %v = load <8 x i8>, ptr %p396  %v2 = zext <8 x i8> %v to <8 x i16>397  ret <8 x i16> %v2398}399 400define <8 x i8> @load_ext_v8i16(ptr %p) {401; CHECK-LABEL: load_ext_v8i16:402; CHECK:         .functype load_ext_v8i16 (i32) -> (v128)403; CHECK-NEXT:  # %bb.0:404; CHECK-NEXT:    local.get 0405; CHECK-NEXT:    v128.load64_zero 0406; CHECK-NEXT:    # fallthrough-return407  %v = load <8 x i8>, ptr %p408  ret <8 x i8> %v409}410 411define <8 x i16> @load_v8i16_with_folded_offset(ptr %p) {412; CHECK-LABEL: load_v8i16_with_folded_offset:413; CHECK:         .functype load_v8i16_with_folded_offset (i32) -> (v128)414; CHECK-NEXT:  # %bb.0:415; CHECK-NEXT:    local.get 0416; CHECK-NEXT:    v128.load 16417; CHECK-NEXT:    # fallthrough-return418  %q = ptrtoint ptr %p to i32419  %r = add nuw i32 %q, 16420  %s = inttoptr i32 %r to ptr421  %v = load <8 x i16>, ptr %s422  ret <8 x i16> %v423}424 425define <8 x i16> @load_splat_v8i16_with_folded_offset(ptr %p) {426; CHECK-LABEL: load_splat_v8i16_with_folded_offset:427; CHECK:         .functype load_splat_v8i16_with_folded_offset (i32) -> (v128)428; CHECK-NEXT:  # %bb.0:429; CHECK-NEXT:    local.get 0430; CHECK-NEXT:    v128.load16_splat 16431; CHECK-NEXT:    # fallthrough-return432  %q = ptrtoint ptr %p to i32433  %r = add nuw i32 %q, 16434  %s = inttoptr i32 %r to ptr435  %e = load i16, ptr %s436  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0437  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer438  ret <8 x i16> %v2439}440 441define <8 x i16> @load_sext_v8i16_with_folded_offset(ptr %p) {442; CHECK-LABEL: load_sext_v8i16_with_folded_offset:443; CHECK:         .functype load_sext_v8i16_with_folded_offset (i32) -> (v128)444; CHECK-NEXT:  # %bb.0:445; CHECK-NEXT:    local.get 0446; CHECK-NEXT:    i16x8.load8x8_s 16447; CHECK-NEXT:    # fallthrough-return448  %q = ptrtoint ptr %p to i32449  %r = add nuw i32 %q, 16450  %s = inttoptr i32 %r to ptr451  %v = load <8 x i8>, ptr %s452  %v2 = sext <8 x i8> %v to <8 x i16>453  ret <8 x i16> %v2454}455 456define <8 x i16> @load_zext_v8i16_with_folded_offset(ptr %p) {457; CHECK-LABEL: load_zext_v8i16_with_folded_offset:458; CHECK:         .functype load_zext_v8i16_with_folded_offset (i32) -> (v128)459; CHECK-NEXT:  # %bb.0:460; CHECK-NEXT:    local.get 0461; CHECK-NEXT:    i16x8.load8x8_u 16462; CHECK-NEXT:    # fallthrough-return463  %q = ptrtoint ptr %p to i32464  %r = add nuw i32 %q, 16465  %s = inttoptr i32 %r to ptr466  %v = load <8 x i8>, ptr %s467  %v2 = zext <8 x i8> %v to <8 x i16>468  ret <8 x i16> %v2469}470 471define <8 x i8> @load_ext_v8i16_with_folded_offset(ptr %p) {472; CHECK-LABEL: load_ext_v8i16_with_folded_offset:473; CHECK:         .functype load_ext_v8i16_with_folded_offset (i32) -> (v128)474; CHECK-NEXT:  # %bb.0:475; CHECK-NEXT:    local.get 0476; CHECK-NEXT:    v128.load64_zero 16477; CHECK-NEXT:    # fallthrough-return478  %q = ptrtoint ptr %p to i32479  %r = add nuw i32 %q, 16480  %s = inttoptr i32 %r to ptr481  %v = load <8 x i8>, ptr %s482  ret <8 x i8> %v483}484 485define <8 x i16> @load_v8i16_with_folded_gep_offset(ptr %p) {486; CHECK-LABEL: load_v8i16_with_folded_gep_offset:487; CHECK:         .functype load_v8i16_with_folded_gep_offset (i32) -> (v128)488; CHECK-NEXT:  # %bb.0:489; CHECK-NEXT:    local.get 0490; CHECK-NEXT:    v128.load 16491; CHECK-NEXT:    # fallthrough-return492  %s = getelementptr inbounds <8 x i16>, ptr %p, i32 1493  %v = load <8 x i16>, ptr %s494  ret <8 x i16> %v495}496 497define <8 x i16> @load_splat_v8i16_with_folded_gep_offset(ptr %p) {498; CHECK-LABEL: load_splat_v8i16_with_folded_gep_offset:499; CHECK:         .functype load_splat_v8i16_with_folded_gep_offset (i32) -> (v128)500; CHECK-NEXT:  # %bb.0:501; CHECK-NEXT:    local.get 0502; CHECK-NEXT:    v128.load16_splat 2503; CHECK-NEXT:    # fallthrough-return504  %s = getelementptr inbounds i16, ptr %p, i32 1505  %e = load i16, ptr %s506  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0507  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer508  ret <8 x i16> %v2509}510 511define <8 x i16> @load_sext_v8i16_with_folded_gep_offset(ptr %p) {512; CHECK-LABEL: load_sext_v8i16_with_folded_gep_offset:513; CHECK:         .functype load_sext_v8i16_with_folded_gep_offset (i32) -> (v128)514; CHECK-NEXT:  # %bb.0:515; CHECK-NEXT:    local.get 0516; CHECK-NEXT:    i16x8.load8x8_s 8517; CHECK-NEXT:    # fallthrough-return518  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1519  %v = load <8 x i8>, ptr %s520  %v2 = sext <8 x i8> %v to <8 x i16>521  ret <8 x i16> %v2522}523 524define <8 x i16> @load_zext_v8i16_with_folded_gep_offset(ptr %p) {525; CHECK-LABEL: load_zext_v8i16_with_folded_gep_offset:526; CHECK:         .functype load_zext_v8i16_with_folded_gep_offset (i32) -> (v128)527; CHECK-NEXT:  # %bb.0:528; CHECK-NEXT:    local.get 0529; CHECK-NEXT:    i16x8.load8x8_u 8530; CHECK-NEXT:    # fallthrough-return531  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1532  %v = load <8 x i8>, ptr %s533  %v2 = zext <8 x i8> %v to <8 x i16>534  ret <8 x i16> %v2535}536 537define <8 x i8> @load_ext_v8i16_with_folded_gep_offset(ptr %p) {538; CHECK-LABEL: load_ext_v8i16_with_folded_gep_offset:539; CHECK:         .functype load_ext_v8i16_with_folded_gep_offset (i32) -> (v128)540; CHECK-NEXT:  # %bb.0:541; CHECK-NEXT:    local.get 0542; CHECK-NEXT:    v128.load64_zero 8543; CHECK-NEXT:    # fallthrough-return544  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1545  %v = load <8 x i8>, ptr %s546  ret <8 x i8> %v547}548 549define <8 x i16> @load_v8i16_with_unfolded_gep_negative_offset(ptr %p) {550; CHECK-LABEL: load_v8i16_with_unfolded_gep_negative_offset:551; CHECK:         .functype load_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)552; CHECK-NEXT:  # %bb.0:553; CHECK-NEXT:    local.get 0554; CHECK-NEXT:    i32.const -16555; CHECK-NEXT:    i32.add556; CHECK-NEXT:    v128.load 0557; CHECK-NEXT:    # fallthrough-return558  %s = getelementptr inbounds <8 x i16>, ptr %p, i32 -1559  %v = load <8 x i16>, ptr %s560  ret <8 x i16> %v561}562 563define <8 x i16> @load_splat_v8i16_with_unfolded_gep_negative_offset(ptr %p) {564; CHECK-LABEL: load_splat_v8i16_with_unfolded_gep_negative_offset:565; CHECK:         .functype load_splat_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)566; CHECK-NEXT:  # %bb.0:567; CHECK-NEXT:    local.get 0568; CHECK-NEXT:    i32.const -2569; CHECK-NEXT:    i32.add570; CHECK-NEXT:    v128.load16_splat 0571; CHECK-NEXT:    # fallthrough-return572  %s = getelementptr inbounds i16, ptr %p, i32 -1573  %e = load i16, ptr %s574  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0575  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer576  ret <8 x i16> %v2577}578 579define <8 x i16> @load_sext_v8i16_with_unfolded_gep_negative_offset(ptr %p) {580; CHECK-LABEL: load_sext_v8i16_with_unfolded_gep_negative_offset:581; CHECK:         .functype load_sext_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)582; CHECK-NEXT:  # %bb.0:583; CHECK-NEXT:    local.get 0584; CHECK-NEXT:    i32.const -8585; CHECK-NEXT:    i32.add586; CHECK-NEXT:    i16x8.load8x8_s 0587; CHECK-NEXT:    # fallthrough-return588  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -1589  %v = load <8 x i8>, ptr %s590  %v2 = sext <8 x i8> %v to <8 x i16>591  ret <8 x i16> %v2592}593 594define <8 x i16> @load_zext_v8i16_with_unfolded_gep_negative_offset(ptr %p) {595; CHECK-LABEL: load_zext_v8i16_with_unfolded_gep_negative_offset:596; CHECK:         .functype load_zext_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)597; CHECK-NEXT:  # %bb.0:598; CHECK-NEXT:    local.get 0599; CHECK-NEXT:    i32.const -8600; CHECK-NEXT:    i32.add601; CHECK-NEXT:    i16x8.load8x8_u 0602; CHECK-NEXT:    # fallthrough-return603  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -1604  %v = load <8 x i8>, ptr %s605  %v2 = zext <8 x i8> %v to <8 x i16>606  ret <8 x i16> %v2607}608 609define <8 x i8> @load_ext_v8i16_with_unfolded_gep_negative_offset(ptr %p) {610; CHECK-LABEL: load_ext_v8i16_with_unfolded_gep_negative_offset:611; CHECK:         .functype load_ext_v8i16_with_unfolded_gep_negative_offset (i32) -> (v128)612; CHECK-NEXT:  # %bb.0:613; CHECK-NEXT:    local.get 0614; CHECK-NEXT:    i32.const -8615; CHECK-NEXT:    i32.add616; CHECK-NEXT:    v128.load64_zero 0617; CHECK-NEXT:    # fallthrough-return618  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -1619  %v = load <8 x i8>, ptr %s620  ret <8 x i8> %v621}622 623define <8 x i16> @load_v8i16_with_unfolded_offset(ptr %p) {624; CHECK-LABEL: load_v8i16_with_unfolded_offset:625; CHECK:         .functype load_v8i16_with_unfolded_offset (i32) -> (v128)626; CHECK-NEXT:  # %bb.0:627; CHECK-NEXT:    local.get 0628; CHECK-NEXT:    i32.const 16629; CHECK-NEXT:    i32.add630; CHECK-NEXT:    v128.load 0631; CHECK-NEXT:    # fallthrough-return632  %q = ptrtoint ptr %p to i32633  %r = add nsw i32 %q, 16634  %s = inttoptr i32 %r to ptr635  %v = load <8 x i16>, ptr %s636  ret <8 x i16> %v637}638 639define <8 x i16> @load_splat_v8i16_with_unfolded_offset(ptr %p) {640; CHECK-LABEL: load_splat_v8i16_with_unfolded_offset:641; CHECK:         .functype load_splat_v8i16_with_unfolded_offset (i32) -> (v128)642; CHECK-NEXT:  # %bb.0:643; CHECK-NEXT:    local.get 0644; CHECK-NEXT:    i32.const 16645; CHECK-NEXT:    i32.add646; CHECK-NEXT:    v128.load16_splat 0647; CHECK-NEXT:    # fallthrough-return648  %q = ptrtoint ptr %p to i32649  %r = add nsw i32 %q, 16650  %s = inttoptr i32 %r to ptr651  %e = load i16, ptr %s652  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0653  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer654  ret <8 x i16> %v2655}656 657define <8 x i16> @load_sext_v8i16_with_unfolded_offset(ptr %p) {658; CHECK-LABEL: load_sext_v8i16_with_unfolded_offset:659; CHECK:         .functype load_sext_v8i16_with_unfolded_offset (i32) -> (v128)660; CHECK-NEXT:  # %bb.0:661; CHECK-NEXT:    local.get 0662; CHECK-NEXT:    i32.const 16663; CHECK-NEXT:    i32.add664; CHECK-NEXT:    i16x8.load8x8_s 0665; CHECK-NEXT:    # fallthrough-return666  %q = ptrtoint ptr %p to i32667  %r = add nsw i32 %q, 16668  %s = inttoptr i32 %r to ptr669  %v = load <8 x i8>, ptr %s670  %v2 = sext <8 x i8> %v to <8 x i16>671  ret <8 x i16> %v2672}673 674define <8 x i16> @load_zext_v8i16_with_unfolded_offset(ptr %p) {675; CHECK-LABEL: load_zext_v8i16_with_unfolded_offset:676; CHECK:         .functype load_zext_v8i16_with_unfolded_offset (i32) -> (v128)677; CHECK-NEXT:  # %bb.0:678; CHECK-NEXT:    local.get 0679; CHECK-NEXT:    i32.const 16680; CHECK-NEXT:    i32.add681; CHECK-NEXT:    i16x8.load8x8_u 0682; CHECK-NEXT:    # fallthrough-return683  %q = ptrtoint ptr %p to i32684  %r = add nsw i32 %q, 16685  %s = inttoptr i32 %r to ptr686  %v = load <8 x i8>, ptr %s687  %v2 = zext <8 x i8> %v to <8 x i16>688  ret <8 x i16> %v2689}690 691define <8 x i8> @load_ext_v8i16_with_unfolded_offset(ptr %p) {692; CHECK-LABEL: load_ext_v8i16_with_unfolded_offset:693; CHECK:         .functype load_ext_v8i16_with_unfolded_offset (i32) -> (v128)694; CHECK-NEXT:  # %bb.0:695; CHECK-NEXT:    local.get 0696; CHECK-NEXT:    i32.const 16697; CHECK-NEXT:    i32.add698; CHECK-NEXT:    v128.load64_zero 0699; CHECK-NEXT:    # fallthrough-return700  %q = ptrtoint ptr %p to i32701  %r = add nsw i32 %q, 16702  %s = inttoptr i32 %r to ptr703  %v = load <8 x i8>, ptr %s704  ret <8 x i8> %v705}706 707define <8 x i16> @load_v8i16_with_unfolded_gep_offset(ptr %p) {708; CHECK-LABEL: load_v8i16_with_unfolded_gep_offset:709; CHECK:         .functype load_v8i16_with_unfolded_gep_offset (i32) -> (v128)710; CHECK-NEXT:  # %bb.0:711; CHECK-NEXT:    local.get 0712; CHECK-NEXT:    i32.const 16713; CHECK-NEXT:    i32.add714; CHECK-NEXT:    v128.load 0715; CHECK-NEXT:    # fallthrough-return716  %s = getelementptr <8 x i16>, ptr %p, i32 1717  %v = load <8 x i16>, ptr %s718  ret <8 x i16> %v719}720 721define <8 x i16> @load_splat_v8i16_with_unfolded_gep_offset(ptr %p) {722; CHECK-LABEL: load_splat_v8i16_with_unfolded_gep_offset:723; CHECK:         .functype load_splat_v8i16_with_unfolded_gep_offset (i32) -> (v128)724; CHECK-NEXT:  # %bb.0:725; CHECK-NEXT:    local.get 0726; CHECK-NEXT:    i32.const 2727; CHECK-NEXT:    i32.add728; CHECK-NEXT:    v128.load16_splat 0729; CHECK-NEXT:    # fallthrough-return730  %s = getelementptr i16, ptr %p, i32 1731  %e = load i16, ptr %s732  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0733  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer734  ret <8 x i16> %v2735}736 737define <8 x i16> @load_sext_v8i16_with_unfolded_gep_offset(ptr %p) {738; CHECK-LABEL: load_sext_v8i16_with_unfolded_gep_offset:739; CHECK:         .functype load_sext_v8i16_with_unfolded_gep_offset (i32) -> (v128)740; CHECK-NEXT:  # %bb.0:741; CHECK-NEXT:    local.get 0742; CHECK-NEXT:    i32.const 8743; CHECK-NEXT:    i32.add744; CHECK-NEXT:    i16x8.load8x8_s 0745; CHECK-NEXT:    # fallthrough-return746  %s = getelementptr <8 x i8>, ptr %p, i32 1747  %v = load <8 x i8>, ptr %s748  %v2 = sext <8 x i8> %v to <8 x i16>749  ret <8 x i16> %v2750}751 752define <8 x i16> @load_zext_v8i16_with_unfolded_gep_offset(ptr %p) {753; CHECK-LABEL: load_zext_v8i16_with_unfolded_gep_offset:754; CHECK:         .functype load_zext_v8i16_with_unfolded_gep_offset (i32) -> (v128)755; CHECK-NEXT:  # %bb.0:756; CHECK-NEXT:    local.get 0757; CHECK-NEXT:    i32.const 8758; CHECK-NEXT:    i32.add759; CHECK-NEXT:    i16x8.load8x8_u 0760; CHECK-NEXT:    # fallthrough-return761  %s = getelementptr <8 x i8>, ptr %p, i32 1762  %v = load <8 x i8>, ptr %s763  %v2 = zext <8 x i8> %v to <8 x i16>764  ret <8 x i16> %v2765}766 767define <8 x i8> @load_ext_v8i16_with_unfolded_gep_offset(ptr %p) {768; CHECK-LABEL: load_ext_v8i16_with_unfolded_gep_offset:769; CHECK:         .functype load_ext_v8i16_with_unfolded_gep_offset (i32) -> (v128)770; CHECK-NEXT:  # %bb.0:771; CHECK-NEXT:    local.get 0772; CHECK-NEXT:    i32.const 8773; CHECK-NEXT:    i32.add774; CHECK-NEXT:    v128.load64_zero 0775; CHECK-NEXT:    # fallthrough-return776  %s = getelementptr <8 x i8>, ptr %p, i32 1777  %v = load <8 x i8>, ptr %s778  ret <8 x i8> %v779}780 781define <8 x i16> @load_v8i16_from_numeric_address() {782; CHECK-LABEL: load_v8i16_from_numeric_address:783; CHECK:         .functype load_v8i16_from_numeric_address () -> (v128)784; CHECK-NEXT:  # %bb.0:785; CHECK-NEXT:    i32.const 0786; CHECK-NEXT:    v128.load 32787; CHECK-NEXT:    # fallthrough-return788  %s = inttoptr i32 32 to ptr789  %v = load <8 x i16>, ptr %s790  ret <8 x i16> %v791}792 793define <8 x i16> @load_splat_v8i16_from_numeric_address() {794; CHECK-LABEL: load_splat_v8i16_from_numeric_address:795; CHECK:         .functype load_splat_v8i16_from_numeric_address () -> (v128)796; CHECK-NEXT:  # %bb.0:797; CHECK-NEXT:    i32.const 0798; CHECK-NEXT:    v128.load16_splat 32799; CHECK-NEXT:    # fallthrough-return800  %s = inttoptr i32 32 to ptr801  %e = load i16, ptr %s802  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0803  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer804  ret <8 x i16> %v2805}806 807define <8 x i16> @load_sext_v8i16_from_numeric_address() {808; CHECK-LABEL: load_sext_v8i16_from_numeric_address:809; CHECK:         .functype load_sext_v8i16_from_numeric_address () -> (v128)810; CHECK-NEXT:  # %bb.0:811; CHECK-NEXT:    i32.const 0812; CHECK-NEXT:    i16x8.load8x8_s 32813; CHECK-NEXT:    # fallthrough-return814  %s = inttoptr i32 32 to ptr815  %v = load <8 x i8>, ptr %s816  %v2 = sext <8 x i8> %v to <8 x i16>817  ret <8 x i16> %v2818}819 820define <8 x i16> @load_zext_v8i16_from_numeric_address() {821; CHECK-LABEL: load_zext_v8i16_from_numeric_address:822; CHECK:         .functype load_zext_v8i16_from_numeric_address () -> (v128)823; CHECK-NEXT:  # %bb.0:824; CHECK-NEXT:    i32.const 0825; CHECK-NEXT:    i16x8.load8x8_u 32826; CHECK-NEXT:    # fallthrough-return827  %s = inttoptr i32 32 to ptr828  %v = load <8 x i8>, ptr %s829  %v2 = zext <8 x i8> %v to <8 x i16>830  ret <8 x i16> %v2831}832 833define <8 x i8> @load_ext_v8i16_from_numeric_address() {834; CHECK-LABEL: load_ext_v8i16_from_numeric_address:835; CHECK:         .functype load_ext_v8i16_from_numeric_address () -> (v128)836; CHECK-NEXT:  # %bb.0:837; CHECK-NEXT:    i32.const 0838; CHECK-NEXT:    v128.load64_zero 32839; CHECK-NEXT:    # fallthrough-return840  %s = inttoptr i32 32 to ptr841  %v = load <8 x i8>, ptr %s842  ret <8 x i8> %v843}844 845@gv_v8i16 = global <8 x i16> <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>846define <8 x i16> @load_v8i16_from_global_address() {847; CHECK-LABEL: load_v8i16_from_global_address:848; CHECK:         .functype load_v8i16_from_global_address () -> (v128)849; CHECK-NEXT:  # %bb.0:850; CHECK-NEXT:    i32.const 0851; CHECK-NEXT:    v128.load gv_v8i16852; CHECK-NEXT:    # fallthrough-return853  %v = load <8 x i16>, ptr @gv_v8i16854  ret <8 x i16> %v855}856 857@gv_i16 = global i16 42858define <8 x i16> @load_splat_v8i16_from_global_address() {859; CHECK-LABEL: load_splat_v8i16_from_global_address:860; CHECK:         .functype load_splat_v8i16_from_global_address () -> (v128)861; CHECK-NEXT:  # %bb.0:862; CHECK-NEXT:    i32.const 0863; CHECK-NEXT:    v128.load16_splat gv_i16864; CHECK-NEXT:    # fallthrough-return865  %e = load i16, ptr @gv_i16866  %v1 = insertelement <8 x i16> undef, i16 %e, i32 0867  %v2 = shufflevector <8 x i16> %v1, <8 x i16> undef, <8 x i32> zeroinitializer868  ret <8 x i16> %v2869}870 871@gv_v8i8 = global <8 x i8> <i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42, i8 42>872define <8 x i16> @load_sext_v8i16_from_global_address() {873; CHECK-LABEL: load_sext_v8i16_from_global_address:874; CHECK:         .functype load_sext_v8i16_from_global_address () -> (v128)875; CHECK-NEXT:  # %bb.0:876; CHECK-NEXT:    i32.const 0877; CHECK-NEXT:    i16x8.load8x8_s gv_v8i8878; CHECK-NEXT:    # fallthrough-return879  %v = load <8 x i8>, ptr @gv_v8i8880  %v2 = sext <8 x i8> %v to <8 x i16>881  ret <8 x i16> %v2882}883 884define <8 x i16> @load_zext_v8i16_from_global_address() {885; CHECK-LABEL: load_zext_v8i16_from_global_address:886; CHECK:         .functype load_zext_v8i16_from_global_address () -> (v128)887; CHECK-NEXT:  # %bb.0:888; CHECK-NEXT:    i32.const 0889; CHECK-NEXT:    i16x8.load8x8_u gv_v8i8890; CHECK-NEXT:    # fallthrough-return891  %v = load <8 x i8>, ptr @gv_v8i8892  %v2 = zext <8 x i8> %v to <8 x i16>893  ret <8 x i16> %v2894}895 896define <8 x i8> @load_ext_v8i16_from_global_address() {897; CHECK-LABEL: load_ext_v8i16_from_global_address:898; CHECK:         .functype load_ext_v8i16_from_global_address () -> (v128)899; CHECK-NEXT:  # %bb.0:900; CHECK-NEXT:    i32.const 0901; CHECK-NEXT:    v128.load64_zero gv_v8i8902; CHECK-NEXT:    # fallthrough-return903  %v = load <8 x i8>, ptr @gv_v8i8904  ret <8 x i8> %v905}906 907 908define void @store_v8i16(<8 x i16> %v, ptr %p) {909; CHECK-LABEL: store_v8i16:910; CHECK:         .functype store_v8i16 (v128, i32) -> ()911; CHECK-NEXT:  # %bb.0:912; CHECK-NEXT:    local.get 1913; CHECK-NEXT:    local.get 0914; CHECK-NEXT:    v128.store 0915; CHECK-NEXT:    # fallthrough-return916  store <8 x i16> %v , ptr %p917  ret void918}919 920define void @store_narrowing_v8i16(<8 x i8> %v, ptr %p) {921; CHECK-LABEL: store_narrowing_v8i16:922; CHECK:         .functype store_narrowing_v8i16 (v128, i32) -> ()923; CHECK-NEXT:  # %bb.0:924; CHECK-NEXT:    local.get 1925; CHECK-NEXT:    local.get 0926; CHECK-NEXT:    v128.store64_lane 0, 0927; CHECK-NEXT:    # fallthrough-return928  store <8 x i8> %v, ptr %p929  ret void930}931 932define void @store_v8i16_with_folded_offset(<8 x i16> %v, ptr %p) {933; CHECK-LABEL: store_v8i16_with_folded_offset:934; CHECK:         .functype store_v8i16_with_folded_offset (v128, i32) -> ()935; CHECK-NEXT:  # %bb.0:936; CHECK-NEXT:    local.get 1937; CHECK-NEXT:    local.get 0938; CHECK-NEXT:    v128.store 16939; CHECK-NEXT:    # fallthrough-return940  %q = ptrtoint ptr %p to i32941  %r = add nuw i32 %q, 16942  %s = inttoptr i32 %r to ptr943  store <8 x i16> %v , ptr %s944  ret void945}946 947define void @store_narrowing_v8i16_with_folded_offset(<8 x i8> %v, ptr %p) {948; CHECK-LABEL: store_narrowing_v8i16_with_folded_offset:949; CHECK:         .functype store_narrowing_v8i16_with_folded_offset (v128, i32) -> ()950; CHECK-NEXT:  # %bb.0:951; CHECK-NEXT:    local.get 1952; CHECK-NEXT:    local.get 0953; CHECK-NEXT:    v128.store64_lane 16, 0954; CHECK-NEXT:    # fallthrough-return955  %q = ptrtoint ptr %p to i32956  %r = add nuw i32 %q, 16957  %s = inttoptr i32 %r to ptr958  store <8 x i8> %v , ptr %s959  ret void960}961 962define void @store_v8i16_with_folded_gep_offset(<8 x i16> %v, ptr %p) {963; CHECK-LABEL: store_v8i16_with_folded_gep_offset:964; CHECK:         .functype store_v8i16_with_folded_gep_offset (v128, i32) -> ()965; CHECK-NEXT:  # %bb.0:966; CHECK-NEXT:    local.get 1967; CHECK-NEXT:    local.get 0968; CHECK-NEXT:    v128.store 16969; CHECK-NEXT:    # fallthrough-return970  %s = getelementptr inbounds <8 x i16>, ptr %p, i32 1971  store <8 x i16> %v , ptr %s972  ret void973}974 975define void @store_narrowing_v8i16_with_folded_gep_offset(<8 x i8> %v, ptr %p) {976; CHECK-LABEL: store_narrowing_v8i16_with_folded_gep_offset:977; CHECK:         .functype store_narrowing_v8i16_with_folded_gep_offset (v128, i32) -> ()978; CHECK-NEXT:  # %bb.0:979; CHECK-NEXT:    local.get 1980; CHECK-NEXT:    local.get 0981; CHECK-NEXT:    v128.store64_lane 8, 0982; CHECK-NEXT:    # fallthrough-return983  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 1984  store <8 x i8> %v , ptr %s985  ret void986}987 988define void @store_v8i16_with_unfolded_gep_negative_offset(<8 x i16> %v, ptr %p) {989; CHECK-LABEL: store_v8i16_with_unfolded_gep_negative_offset:990; CHECK:         .functype store_v8i16_with_unfolded_gep_negative_offset (v128, i32) -> ()991; CHECK-NEXT:  # %bb.0:992; CHECK-NEXT:    local.get 1993; CHECK-NEXT:    i32.const -16994; CHECK-NEXT:    i32.add995; CHECK-NEXT:    local.get 0996; CHECK-NEXT:    v128.store 0997; CHECK-NEXT:    # fallthrough-return998  %s = getelementptr inbounds <8 x i16>, ptr %p, i32 -1999  store <8 x i16> %v , ptr %s1000  ret void1001}1002 1003define void @store_narrowing_v8i16_with_unfolded_gep_negative_offset(<8 x i8> %v, ptr %p) {1004; CHECK-LABEL: store_narrowing_v8i16_with_unfolded_gep_negative_offset:1005; CHECK:         .functype store_narrowing_v8i16_with_unfolded_gep_negative_offset (v128, i32) -> ()1006; CHECK-NEXT:  # %bb.0:1007; CHECK-NEXT:    local.get 11008; CHECK-NEXT:    i32.const -81009; CHECK-NEXT:    i32.add1010; CHECK-NEXT:    local.get 01011; CHECK-NEXT:    v128.store64_lane 0, 01012; CHECK-NEXT:    # fallthrough-return1013  %s = getelementptr inbounds <8 x i8>, ptr %p, i32 -11014  store <8 x i8> %v , ptr %s1015  ret void1016}1017 1018define void @store_v8i16_with_unfolded_offset(<8 x i16> %v, ptr %p) {1019; CHECK-LABEL: store_v8i16_with_unfolded_offset:1020; CHECK:         .functype store_v8i16_with_unfolded_offset (v128, i32) -> ()1021; CHECK-NEXT:  # %bb.0:1022; CHECK-NEXT:    local.get 11023; CHECK-NEXT:    i32.const 161024; CHECK-NEXT:    i32.add1025; CHECK-NEXT:    local.get 01026; CHECK-NEXT:    v128.store 01027; CHECK-NEXT:    # fallthrough-return1028  %q = ptrtoint ptr %p to i321029  %r = add nsw i32 %q, 161030  %s = inttoptr i32 %r to ptr1031  store <8 x i16> %v , ptr %s1032  ret void1033}1034 1035define void @store_narrowing_v8i16_with_unfolded_offset(<8 x i8> %v, ptr %p) {1036; CHECK-LABEL: store_narrowing_v8i16_with_unfolded_offset:1037; CHECK:         .functype store_narrowing_v8i16_with_unfolded_offset (v128, i32) -> ()1038; CHECK-NEXT:  # %bb.0:1039; CHECK-NEXT:    local.get 11040; CHECK-NEXT:    i32.const 161041; CHECK-NEXT:    i32.add1042; CHECK-NEXT:    local.get 01043; CHECK-NEXT:    v128.store64_lane 0, 01044; CHECK-NEXT:    # fallthrough-return1045  %q = ptrtoint ptr %p to i321046  %r = add nsw i32 %q, 161047  %s = inttoptr i32 %r to ptr1048  store <8 x i8> %v , ptr %s1049  ret void1050}1051 1052define void @store_v8i16_with_unfolded_gep_offset(<8 x i16> %v, ptr %p) {1053; CHECK-LABEL: store_v8i16_with_unfolded_gep_offset:1054; CHECK:         .functype store_v8i16_with_unfolded_gep_offset (v128, i32) -> ()1055; CHECK-NEXT:  # %bb.0:1056; CHECK-NEXT:    local.get 11057; CHECK-NEXT:    i32.const 161058; CHECK-NEXT:    i32.add1059; CHECK-NEXT:    local.get 01060; CHECK-NEXT:    v128.store 01061; CHECK-NEXT:    # fallthrough-return1062  %s = getelementptr <8 x i16>, ptr %p, i32 11063  store <8 x i16> %v , ptr %s1064  ret void1065}1066 1067define void @store_narrowing_v8i16_with_unfolded_gep_offset(<8 x i8> %v, ptr %p) {1068; CHECK-LABEL: store_narrowing_v8i16_with_unfolded_gep_offset:1069; CHECK:         .functype store_narrowing_v8i16_with_unfolded_gep_offset (v128, i32) -> ()1070; CHECK-NEXT:  # %bb.0:1071; CHECK-NEXT:    local.get 11072; CHECK-NEXT:    i32.const 81073; CHECK-NEXT:    i32.add1074; CHECK-NEXT:    local.get 01075; CHECK-NEXT:    v128.store64_lane 0, 01076; CHECK-NEXT:    # fallthrough-return1077  %s = getelementptr <8 x i8>, ptr %p, i32 11078  store <8 x i8> %v , ptr %s1079  ret void1080}1081 1082define void @store_v8i16_to_numeric_address(<8 x i16> %v) {1083; CHECK-LABEL: store_v8i16_to_numeric_address:1084; CHECK:         .functype store_v8i16_to_numeric_address (v128) -> ()1085; CHECK-NEXT:  # %bb.0:1086; CHECK-NEXT:    i32.const 01087; CHECK-NEXT:    local.get 01088; CHECK-NEXT:    v128.store 321089; CHECK-NEXT:    # fallthrough-return1090  %s = inttoptr i32 32 to ptr1091  store <8 x i16> %v , ptr %s1092  ret void1093}1094 1095define void @store_narrowing_v8i16_to_numeric_address(<8 x i8> %v, ptr %p) {1096; CHECK-LABEL: store_narrowing_v8i16_to_numeric_address:1097; CHECK:         .functype store_narrowing_v8i16_to_numeric_address (v128, i32) -> ()1098; CHECK-NEXT:  # %bb.0:1099; CHECK-NEXT:    i32.const 01100; CHECK-NEXT:    local.get 01101; CHECK-NEXT:    v128.store64_lane 32, 01102; CHECK-NEXT:    # fallthrough-return1103  %s = inttoptr i32 32 to ptr1104  store <8 x i8> %v , ptr %s1105  ret void1106}1107 1108define void @store_v8i16_to_global_address(<8 x i16> %v) {1109; CHECK-LABEL: store_v8i16_to_global_address:1110; CHECK:         .functype store_v8i16_to_global_address (v128) -> ()1111; CHECK-NEXT:  # %bb.0:1112; CHECK-NEXT:    i32.const 01113; CHECK-NEXT:    local.get 01114; CHECK-NEXT:    v128.store gv_v8i161115; CHECK-NEXT:    # fallthrough-return1116  store <8 x i16> %v , ptr @gv_v8i161117  ret void1118}1119 1120define void @store_narrowing_v8i16_to_global_address(<8 x i8> %v) {1121; CHECK-LABEL: store_narrowing_v8i16_to_global_address:1122; CHECK:         .functype store_narrowing_v8i16_to_global_address (v128) -> ()1123; CHECK-NEXT:  # %bb.0:1124; CHECK-NEXT:    i32.const 01125; CHECK-NEXT:    local.get 01126; CHECK-NEXT:    v128.store64_lane gv_v8i8, 01127; CHECK-NEXT:    # fallthrough-return1128  store <8 x i8> %v , ptr @gv_v8i81129  ret void1130}1131 1132; ==============================================================================1133; 4 x i321134; ==============================================================================1135define <4 x i32> @load_v4i32(ptr %p) {1136; CHECK-LABEL: load_v4i32:1137; CHECK:         .functype load_v4i32 (i32) -> (v128)1138; CHECK-NEXT:  # %bb.0:1139; CHECK-NEXT:    local.get 01140; CHECK-NEXT:    v128.load 01141; CHECK-NEXT:    # fallthrough-return1142  %v = load <4 x i32>, ptr %p1143  ret <4 x i32> %v1144}1145 1146define <4 x i32> @load_splat_v4i32(ptr %addr) {1147; CHECK-LABEL: load_splat_v4i32:1148; CHECK:         .functype load_splat_v4i32 (i32) -> (v128)1149; CHECK-NEXT:  # %bb.0:1150; CHECK-NEXT:    local.get 01151; CHECK-NEXT:    v128.load32_splat 01152; CHECK-NEXT:    # fallthrough-return1153  %e = load i32, ptr %addr, align 41154  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01155  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1156  ret <4 x i32> %v21157}1158 1159define <4 x i32> @load_sext_v4i16_to_v4i32(ptr %p) {1160; CHECK-LABEL: load_sext_v4i16_to_v4i32:1161; CHECK:         .functype load_sext_v4i16_to_v4i32 (i32) -> (v128)1162; CHECK-NEXT:  # %bb.0:1163; CHECK-NEXT:    local.get 01164; CHECK-NEXT:    i32x4.load16x4_s 01165; CHECK-NEXT:    # fallthrough-return1166  %v = load <4 x i16>, ptr %p1167  %v2 = sext <4 x i16> %v to <4 x i32>1168  ret <4 x i32> %v21169}1170 1171define <4 x i32> @load_zext_v4i16_to_v4i32(ptr %p) {1172; CHECK-LABEL: load_zext_v4i16_to_v4i32:1173; CHECK:         .functype load_zext_v4i16_to_v4i32 (i32) -> (v128)1174; CHECK-NEXT:  # %bb.0:1175; CHECK-NEXT:    local.get 01176; CHECK-NEXT:    i32x4.load16x4_u 01177; CHECK-NEXT:    # fallthrough-return1178  %v = load <4 x i16>, ptr %p1179  %v2 = zext <4 x i16> %v to <4 x i32>1180  ret <4 x i32> %v21181}1182 1183define <4 x i32> @load_sext_v4i8_to_v4i32(ptr %p) {1184; CHECK-LABEL: load_sext_v4i8_to_v4i32:1185; CHECK:         .functype load_sext_v4i8_to_v4i32 (i32) -> (v128)1186; CHECK-NEXT:  # %bb.0:1187; CHECK-NEXT:    local.get 01188; CHECK-NEXT:    v128.load32_zero 01189; CHECK-NEXT:    i16x8.extend_low_i8x16_s1190; CHECK-NEXT:    i32x4.extend_low_i16x8_s1191; CHECK-NEXT:    # fallthrough-return1192  %v = load <4 x i8>, ptr %p1193  %v2 = sext <4 x i8> %v to <4 x i32>1194  ret <4 x i32> %v21195}1196 1197define <4 x i32> @load_zext_v4i8_to_v4i32(ptr %p) {1198; CHECK-LABEL: load_zext_v4i8_to_v4i32:1199; CHECK:         .functype load_zext_v4i8_to_v4i32 (i32) -> (v128)1200; CHECK-NEXT:  # %bb.0:1201; CHECK-NEXT:    local.get 01202; CHECK-NEXT:    v128.load32_zero 01203; CHECK-NEXT:    i16x8.extend_low_i8x16_u1204; CHECK-NEXT:    i32x4.extend_low_i16x8_u1205; CHECK-NEXT:    # fallthrough-return1206  %v = load <4 x i8>, ptr %p1207  %v2 = zext <4 x i8> %v to <4 x i32>1208  ret <4 x i32> %v21209}1210 1211define <4 x i16> @load_ext_v4i32(ptr %p) {1212; CHECK-LABEL: load_ext_v4i32:1213; CHECK:         .functype load_ext_v4i32 (i32) -> (v128)1214; CHECK-NEXT:  # %bb.0:1215; CHECK-NEXT:    local.get 01216; CHECK-NEXT:    v128.load64_zero 01217; CHECK-NEXT:    # fallthrough-return1218  %v = load <4 x i16>, ptr %p1219  ret <4 x i16> %v1220}1221 1222define <4 x i32> @load_v4i32_with_folded_offset(ptr %p) {1223; CHECK-LABEL: load_v4i32_with_folded_offset:1224; CHECK:         .functype load_v4i32_with_folded_offset (i32) -> (v128)1225; CHECK-NEXT:  # %bb.0:1226; CHECK-NEXT:    local.get 01227; CHECK-NEXT:    v128.load 161228; CHECK-NEXT:    # fallthrough-return1229  %q = ptrtoint ptr %p to i321230  %r = add nuw i32 %q, 161231  %s = inttoptr i32 %r to ptr1232  %v = load <4 x i32>, ptr %s1233  ret <4 x i32> %v1234}1235 1236define <4 x i32> @load_splat_v4i32_with_folded_offset(ptr %p) {1237; CHECK-LABEL: load_splat_v4i32_with_folded_offset:1238; CHECK:         .functype load_splat_v4i32_with_folded_offset (i32) -> (v128)1239; CHECK-NEXT:  # %bb.0:1240; CHECK-NEXT:    local.get 01241; CHECK-NEXT:    v128.load32_splat 161242; CHECK-NEXT:    # fallthrough-return1243  %q = ptrtoint ptr %p to i321244  %r = add nuw i32 %q, 161245  %s = inttoptr i32 %r to ptr1246  %e = load i32, ptr %s1247  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01248  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1249  ret <4 x i32> %v21250}1251 1252define <4 x i32> @load_sext_v4i16_to_v4i32_with_folded_offset(ptr %p) {1253; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_folded_offset:1254; CHECK:         .functype load_sext_v4i16_to_v4i32_with_folded_offset (i32) -> (v128)1255; CHECK-NEXT:  # %bb.0:1256; CHECK-NEXT:    local.get 01257; CHECK-NEXT:    i32x4.load16x4_s 161258; CHECK-NEXT:    # fallthrough-return1259  %q = ptrtoint ptr %p to i321260  %r = add nuw i32 %q, 161261  %s = inttoptr i32 %r to ptr1262  %v = load <4 x i16>, ptr %s1263  %v2 = sext <4 x i16> %v to <4 x i32>1264  ret <4 x i32> %v21265}1266 1267define <4 x i32> @load_zext_v4i16_to_v4i32_with_folded_offset(ptr %p) {1268; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_folded_offset:1269; CHECK:         .functype load_zext_v4i16_to_v4i32_with_folded_offset (i32) -> (v128)1270; CHECK-NEXT:  # %bb.0:1271; CHECK-NEXT:    local.get 01272; CHECK-NEXT:    i32x4.load16x4_u 161273; CHECK-NEXT:    # fallthrough-return1274  %q = ptrtoint ptr %p to i321275  %r = add nuw i32 %q, 161276  %s = inttoptr i32 %r to ptr1277  %v = load <4 x i16>, ptr %s1278  %v2 = zext <4 x i16> %v to <4 x i32>1279  ret <4 x i32> %v21280}1281 1282define <4 x i32> @load_sext_v4i8_to_v4i32_with_folded_offset(ptr %p) {1283; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_folded_offset:1284; CHECK:         .functype load_sext_v4i8_to_v4i32_with_folded_offset (i32) -> (v128)1285; CHECK-NEXT:  # %bb.0:1286; CHECK-NEXT:    local.get 01287; CHECK-NEXT:    v128.load32_zero 161288; CHECK-NEXT:    i16x8.extend_low_i8x16_s1289; CHECK-NEXT:    i32x4.extend_low_i16x8_s1290; CHECK-NEXT:    # fallthrough-return1291  %q = ptrtoint ptr %p to i321292  %r = add nuw i32 %q, 161293  %s = inttoptr i32 %r to ptr1294  %v = load <4 x i8>, ptr %s1295  %v2 = sext <4 x i8> %v to <4 x i32>1296  ret <4 x i32> %v21297}1298 1299define <4 x i32> @load_zext_v4i8_to_v4i32_with_folded_offset(ptr %p) {1300; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_folded_offset:1301; CHECK:         .functype load_zext_v4i8_to_v4i32_with_folded_offset (i32) -> (v128)1302; CHECK-NEXT:  # %bb.0:1303; CHECK-NEXT:    local.get 01304; CHECK-NEXT:    v128.load32_zero 161305; CHECK-NEXT:    i16x8.extend_low_i8x16_u1306; CHECK-NEXT:    i32x4.extend_low_i16x8_u1307; CHECK-NEXT:    # fallthrough-return1308  %q = ptrtoint ptr %p to i321309  %r = add nuw i32 %q, 161310  %s = inttoptr i32 %r to ptr1311  %v = load <4 x i8>, ptr %s1312  %v2 = zext <4 x i8> %v to <4 x i32>1313  ret <4 x i32> %v21314}1315 1316define <4 x i16> @load_ext_v4i32_with_folded_offset(ptr %p) {1317; CHECK-LABEL: load_ext_v4i32_with_folded_offset:1318; CHECK:         .functype load_ext_v4i32_with_folded_offset (i32) -> (v128)1319; CHECK-NEXT:  # %bb.0:1320; CHECK-NEXT:    local.get 01321; CHECK-NEXT:    v128.load64_zero 161322; CHECK-NEXT:    # fallthrough-return1323  %q = ptrtoint ptr %p to i321324  %r = add nuw i32 %q, 161325  %s = inttoptr i32 %r to ptr1326  %v = load <4 x i16>, ptr %s1327  ret <4 x i16> %v1328}1329 1330define <4 x i32> @load_v4i32_with_folded_gep_offset(ptr %p) {1331; CHECK-LABEL: load_v4i32_with_folded_gep_offset:1332; CHECK:         .functype load_v4i32_with_folded_gep_offset (i32) -> (v128)1333; CHECK-NEXT:  # %bb.0:1334; CHECK-NEXT:    local.get 01335; CHECK-NEXT:    v128.load 161336; CHECK-NEXT:    # fallthrough-return1337  %s = getelementptr inbounds <4 x i32>, ptr %p, i32 11338  %v = load <4 x i32>, ptr %s1339  ret <4 x i32> %v1340}1341 1342define <4 x i32> @load_splat_v4i32_with_folded_gep_offset(ptr %p) {1343; CHECK-LABEL: load_splat_v4i32_with_folded_gep_offset:1344; CHECK:         .functype load_splat_v4i32_with_folded_gep_offset (i32) -> (v128)1345; CHECK-NEXT:  # %bb.0:1346; CHECK-NEXT:    local.get 01347; CHECK-NEXT:    v128.load32_splat 41348; CHECK-NEXT:    # fallthrough-return1349  %s = getelementptr inbounds i32, ptr %p, i32 11350  %e = load i32, ptr %s1351  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01352  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1353  ret <4 x i32> %v21354}1355 1356define <4 x i32> @load_sext_v4i16_to_v4i32_with_folded_gep_offset(ptr %p) {1357; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_folded_gep_offset:1358; CHECK:         .functype load_sext_v4i16_to_v4i32_with_folded_gep_offset (i32) -> (v128)1359; CHECK-NEXT:  # %bb.0:1360; CHECK-NEXT:    local.get 01361; CHECK-NEXT:    i32x4.load16x4_s 81362; CHECK-NEXT:    # fallthrough-return1363  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 11364  %v = load <4 x i16>, ptr %s1365  %v2 = sext <4 x i16> %v to <4 x i32>1366  ret <4 x i32> %v21367}1368 1369define <4 x i32> @load_zext_v4i16_to_v4i32_with_folded_gep_offset(ptr %p) {1370; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_folded_gep_offset:1371; CHECK:         .functype load_zext_v4i16_to_v4i32_with_folded_gep_offset (i32) -> (v128)1372; CHECK-NEXT:  # %bb.0:1373; CHECK-NEXT:    local.get 01374; CHECK-NEXT:    i32x4.load16x4_u 81375; CHECK-NEXT:    # fallthrough-return1376  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 11377  %v = load <4 x i16>, ptr %s1378  %v2 = zext <4 x i16> %v to <4 x i32>1379  ret <4 x i32> %v21380}1381 1382define <4 x i32> @load_sext_v4i8_to_v4i32_with_folded_gep_offset(ptr %p) {1383; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_folded_gep_offset:1384; CHECK:         .functype load_sext_v4i8_to_v4i32_with_folded_gep_offset (i32) -> (v128)1385; CHECK-NEXT:  # %bb.0:1386; CHECK-NEXT:    local.get 01387; CHECK-NEXT:    v128.load32_zero 41388; CHECK-NEXT:    i16x8.extend_low_i8x16_s1389; CHECK-NEXT:    i32x4.extend_low_i16x8_s1390; CHECK-NEXT:    # fallthrough-return1391  %s = getelementptr inbounds <4 x i8>, ptr %p, i32 11392  %v = load <4 x i8>, ptr %s1393  %v2 = sext <4 x i8> %v to <4 x i32>1394  ret <4 x i32> %v21395}1396 1397define <4 x i32> @load_zext_v4i8_to_v4i32_with_folded_gep_offset(ptr %p) {1398; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_folded_gep_offset:1399; CHECK:         .functype load_zext_v4i8_to_v4i32_with_folded_gep_offset (i32) -> (v128)1400; CHECK-NEXT:  # %bb.0:1401; CHECK-NEXT:    local.get 01402; CHECK-NEXT:    v128.load32_zero 41403; CHECK-NEXT:    i16x8.extend_low_i8x16_u1404; CHECK-NEXT:    i32x4.extend_low_i16x8_u1405; CHECK-NEXT:    # fallthrough-return1406  %s = getelementptr inbounds <4 x i8>, ptr %p, i32 11407  %v = load <4 x i8>, ptr %s1408  %v2 = zext <4 x i8> %v to <4 x i32>1409  ret <4 x i32> %v21410}1411 1412define <4 x i16> @load_ext_v4i32_with_folded_gep_offset(ptr %p) {1413; CHECK-LABEL: load_ext_v4i32_with_folded_gep_offset:1414; CHECK:         .functype load_ext_v4i32_with_folded_gep_offset (i32) -> (v128)1415; CHECK-NEXT:  # %bb.0:1416; CHECK-NEXT:    local.get 01417; CHECK-NEXT:    v128.load64_zero 81418; CHECK-NEXT:    # fallthrough-return1419  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 11420  %v = load <4 x i16>, ptr %s1421  ret <4 x i16> %v1422}1423 1424define <4 x i32> @load_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1425; CHECK-LABEL: load_v4i32_with_unfolded_gep_negative_offset:1426; CHECK:         .functype load_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1427; CHECK-NEXT:  # %bb.0:1428; CHECK-NEXT:    local.get 01429; CHECK-NEXT:    i32.const -161430; CHECK-NEXT:    i32.add1431; CHECK-NEXT:    v128.load 01432; CHECK-NEXT:    # fallthrough-return1433  %s = getelementptr inbounds <4 x i32>, ptr %p, i32 -11434  %v = load <4 x i32>, ptr %s1435  ret <4 x i32> %v1436}1437 1438define <4 x i32> @load_splat_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1439; CHECK-LABEL: load_splat_v4i32_with_unfolded_gep_negative_offset:1440; CHECK:         .functype load_splat_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1441; CHECK-NEXT:  # %bb.0:1442; CHECK-NEXT:    local.get 01443; CHECK-NEXT:    i32.const -41444; CHECK-NEXT:    i32.add1445; CHECK-NEXT:    v128.load32_splat 01446; CHECK-NEXT:    # fallthrough-return1447  %s = getelementptr inbounds i32, ptr %p, i32 -11448  %e = load i32, ptr %s1449  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01450  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1451  ret <4 x i32> %v21452}1453 1454define <4 x i32> @load_sext_v4i16_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1455; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_unfolded_gep_negative_offset:1456; CHECK:         .functype load_sext_v4i16_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1457; CHECK-NEXT:  # %bb.0:1458; CHECK-NEXT:    local.get 01459; CHECK-NEXT:    i32.const -81460; CHECK-NEXT:    i32.add1461; CHECK-NEXT:    i32x4.load16x4_s 01462; CHECK-NEXT:    # fallthrough-return1463  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -11464  %v = load <4 x i16>, ptr %s1465  %v2 = sext <4 x i16> %v to <4 x i32>1466  ret <4 x i32> %v21467}1468 1469define <4 x i32> @load_zext_v4i16_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1470; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_unfolded_gep_negative_offset:1471; CHECK:         .functype load_zext_v4i16_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1472; CHECK-NEXT:  # %bb.0:1473; CHECK-NEXT:    local.get 01474; CHECK-NEXT:    i32.const -81475; CHECK-NEXT:    i32.add1476; CHECK-NEXT:    i32x4.load16x4_u 01477; CHECK-NEXT:    # fallthrough-return1478  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -11479  %v = load <4 x i16>, ptr %s1480  %v2 = zext <4 x i16> %v to <4 x i32>1481  ret <4 x i32> %v21482}1483 1484define <4 x i32> @load_sext_v4i8_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1485; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_unfolded_gep_negative_offset:1486; CHECK:         .functype load_sext_v4i8_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1487; CHECK-NEXT:  # %bb.0:1488; CHECK-NEXT:    local.get 01489; CHECK-NEXT:    i32.const -41490; CHECK-NEXT:    i32.add1491; CHECK-NEXT:    v128.load32_zero 01492; CHECK-NEXT:    i16x8.extend_low_i8x16_s1493; CHECK-NEXT:    i32x4.extend_low_i16x8_s1494; CHECK-NEXT:    # fallthrough-return1495  %s = getelementptr inbounds <4 x i8>, ptr %p, i32 -11496  %v = load <4 x i8>, ptr %s1497  %v2 = sext <4 x i8> %v to <4 x i32>1498  ret <4 x i32> %v21499}1500 1501define <4 x i32> @load_zext_v4i8_to_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1502; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_unfolded_gep_negative_offset:1503; CHECK:         .functype load_zext_v4i8_to_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1504; CHECK-NEXT:  # %bb.0:1505; CHECK-NEXT:    local.get 01506; CHECK-NEXT:    i32.const -41507; CHECK-NEXT:    i32.add1508; CHECK-NEXT:    v128.load32_zero 01509; CHECK-NEXT:    i16x8.extend_low_i8x16_u1510; CHECK-NEXT:    i32x4.extend_low_i16x8_u1511; CHECK-NEXT:    # fallthrough-return1512  %s = getelementptr inbounds <4 x i8>, ptr %p, i32 -11513  %v = load <4 x i8>, ptr %s1514  %v2 = zext <4 x i8> %v to <4 x i32>1515  ret <4 x i32> %v21516}1517 1518define <4 x i16> @load_ext_v4i32_with_unfolded_gep_negative_offset(ptr %p) {1519; CHECK-LABEL: load_ext_v4i32_with_unfolded_gep_negative_offset:1520; CHECK:         .functype load_ext_v4i32_with_unfolded_gep_negative_offset (i32) -> (v128)1521; CHECK-NEXT:  # %bb.0:1522; CHECK-NEXT:    local.get 01523; CHECK-NEXT:    i32.const -81524; CHECK-NEXT:    i32.add1525; CHECK-NEXT:    v128.load64_zero 01526; CHECK-NEXT:    # fallthrough-return1527  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -11528  %v = load <4 x i16>, ptr %s1529  ret <4 x i16> %v1530}1531 1532define <4 x i32> @load_v4i32_with_unfolded_offset(ptr %p) {1533; CHECK-LABEL: load_v4i32_with_unfolded_offset:1534; CHECK:         .functype load_v4i32_with_unfolded_offset (i32) -> (v128)1535; CHECK-NEXT:  # %bb.0:1536; CHECK-NEXT:    local.get 01537; CHECK-NEXT:    i32.const 161538; CHECK-NEXT:    i32.add1539; CHECK-NEXT:    v128.load 01540; CHECK-NEXT:    # fallthrough-return1541  %q = ptrtoint ptr %p to i321542  %r = add nsw i32 %q, 161543  %s = inttoptr i32 %r to ptr1544  %v = load <4 x i32>, ptr %s1545  ret <4 x i32> %v1546}1547 1548define <4 x i32> @load_splat_v4i32_with_unfolded_offset(ptr %p) {1549; CHECK-LABEL: load_splat_v4i32_with_unfolded_offset:1550; CHECK:         .functype load_splat_v4i32_with_unfolded_offset (i32) -> (v128)1551; CHECK-NEXT:  # %bb.0:1552; CHECK-NEXT:    local.get 01553; CHECK-NEXT:    i32.const 161554; CHECK-NEXT:    i32.add1555; CHECK-NEXT:    v128.load32_splat 01556; CHECK-NEXT:    # fallthrough-return1557  %q = ptrtoint ptr %p to i321558  %r = add nsw i32 %q, 161559  %s = inttoptr i32 %r to ptr1560  %e = load i32, ptr %s1561  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01562  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1563  ret <4 x i32> %v21564}1565 1566define <4 x i32> @load_sext_v4i16_to_v4i32_with_unfolded_offset(ptr %p) {1567; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_unfolded_offset:1568; CHECK:         .functype load_sext_v4i16_to_v4i32_with_unfolded_offset (i32) -> (v128)1569; CHECK-NEXT:  # %bb.0:1570; CHECK-NEXT:    local.get 01571; CHECK-NEXT:    i32.const 161572; CHECK-NEXT:    i32.add1573; CHECK-NEXT:    i32x4.load16x4_s 01574; CHECK-NEXT:    # fallthrough-return1575  %q = ptrtoint ptr %p to i321576  %r = add nsw i32 %q, 161577  %s = inttoptr i32 %r to ptr1578  %v = load <4 x i16>, ptr %s1579  %v2 = sext <4 x i16> %v to <4 x i32>1580  ret <4 x i32> %v21581}1582 1583define <4 x i32> @load_zext_v4i16_to_v4i32_with_unfolded_offset(ptr %p) {1584; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_unfolded_offset:1585; CHECK:         .functype load_zext_v4i16_to_v4i32_with_unfolded_offset (i32) -> (v128)1586; CHECK-NEXT:  # %bb.0:1587; CHECK-NEXT:    local.get 01588; CHECK-NEXT:    i32.const 161589; CHECK-NEXT:    i32.add1590; CHECK-NEXT:    i32x4.load16x4_u 01591; CHECK-NEXT:    # fallthrough-return1592  %q = ptrtoint ptr %p to i321593  %r = add nsw i32 %q, 161594  %s = inttoptr i32 %r to ptr1595  %v = load <4 x i16>, ptr %s1596  %v2 = zext <4 x i16> %v to <4 x i32>1597  ret <4 x i32> %v21598}1599 1600define <4 x i32> @load_sext_v4i8_to_v4i32_with_unfolded_offset(ptr %p) {1601; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_unfolded_offset:1602; CHECK:         .functype load_sext_v4i8_to_v4i32_with_unfolded_offset (i32) -> (v128)1603; CHECK-NEXT:  # %bb.0:1604; CHECK-NEXT:    local.get 01605; CHECK-NEXT:    i32.const 161606; CHECK-NEXT:    i32.add1607; CHECK-NEXT:    v128.load32_zero 01608; CHECK-NEXT:    i16x8.extend_low_i8x16_s1609; CHECK-NEXT:    i32x4.extend_low_i16x8_s1610; CHECK-NEXT:    # fallthrough-return1611  %q = ptrtoint ptr %p to i321612  %r = add nsw i32 %q, 161613  %s = inttoptr i32 %r to ptr1614  %v = load <4 x i8>, ptr %s1615  %v2 = sext <4 x i8> %v to <4 x i32>1616  ret <4 x i32> %v21617}1618 1619define <4 x i32> @load_zext_v4i8_to_v4i32_with_unfolded_offset(ptr %p) {1620; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_unfolded_offset:1621; CHECK:         .functype load_zext_v4i8_to_v4i32_with_unfolded_offset (i32) -> (v128)1622; CHECK-NEXT:  # %bb.0:1623; CHECK-NEXT:    local.get 01624; CHECK-NEXT:    i32.const 161625; CHECK-NEXT:    i32.add1626; CHECK-NEXT:    v128.load32_zero 01627; CHECK-NEXT:    i16x8.extend_low_i8x16_u1628; CHECK-NEXT:    i32x4.extend_low_i16x8_u1629; CHECK-NEXT:    # fallthrough-return1630  %q = ptrtoint ptr %p to i321631  %r = add nsw i32 %q, 161632  %s = inttoptr i32 %r to ptr1633  %v = load <4 x i8>, ptr %s1634  %v2 = zext <4 x i8> %v to <4 x i32>1635  ret <4 x i32> %v21636}1637 1638define <4 x i16> @load_ext_v4i32_with_unfolded_offset(ptr %p) {1639; CHECK-LABEL: load_ext_v4i32_with_unfolded_offset:1640; CHECK:         .functype load_ext_v4i32_with_unfolded_offset (i32) -> (v128)1641; CHECK-NEXT:  # %bb.0:1642; CHECK-NEXT:    local.get 01643; CHECK-NEXT:    i32.const 161644; CHECK-NEXT:    i32.add1645; CHECK-NEXT:    v128.load64_zero 01646; CHECK-NEXT:    # fallthrough-return1647  %q = ptrtoint ptr %p to i321648  %r = add nsw i32 %q, 161649  %s = inttoptr i32 %r to ptr1650  %v = load <4 x i16>, ptr %s1651  ret <4 x i16> %v1652}1653 1654define <4 x i32> @load_v4i32_with_unfolded_gep_offset(ptr %p) {1655; CHECK-LABEL: load_v4i32_with_unfolded_gep_offset:1656; CHECK:         .functype load_v4i32_with_unfolded_gep_offset (i32) -> (v128)1657; CHECK-NEXT:  # %bb.0:1658; CHECK-NEXT:    local.get 01659; CHECK-NEXT:    i32.const 161660; CHECK-NEXT:    i32.add1661; CHECK-NEXT:    v128.load 01662; CHECK-NEXT:    # fallthrough-return1663  %s = getelementptr <4 x i32>, ptr %p, i32 11664  %v = load <4 x i32>, ptr %s1665  ret <4 x i32> %v1666}1667 1668define <4 x i32> @load_splat_v4i32_with_unfolded_gep_offset(ptr %p) {1669; CHECK-LABEL: load_splat_v4i32_with_unfolded_gep_offset:1670; CHECK:         .functype load_splat_v4i32_with_unfolded_gep_offset (i32) -> (v128)1671; CHECK-NEXT:  # %bb.0:1672; CHECK-NEXT:    local.get 01673; CHECK-NEXT:    i32.const 41674; CHECK-NEXT:    i32.add1675; CHECK-NEXT:    v128.load32_splat 01676; CHECK-NEXT:    # fallthrough-return1677  %s = getelementptr i32, ptr %p, i32 11678  %e = load i32, ptr %s1679  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01680  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1681  ret <4 x i32> %v21682}1683 1684define <4 x i32> @load_sext_v4i16_to_v4i32_with_unfolded_gep_offset(ptr %p) {1685; CHECK-LABEL: load_sext_v4i16_to_v4i32_with_unfolded_gep_offset:1686; CHECK:         .functype load_sext_v4i16_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1687; CHECK-NEXT:  # %bb.0:1688; CHECK-NEXT:    local.get 01689; CHECK-NEXT:    i32.const 81690; CHECK-NEXT:    i32.add1691; CHECK-NEXT:    i32x4.load16x4_s 01692; CHECK-NEXT:    # fallthrough-return1693  %s = getelementptr <4 x i16>, ptr %p, i32 11694  %v = load <4 x i16>, ptr %s1695  %v2 = sext <4 x i16> %v to <4 x i32>1696  ret <4 x i32> %v21697}1698 1699define <4 x i32> @load_zext_v4i16_to_v4i32_with_unfolded_gep_offset(ptr %p) {1700; CHECK-LABEL: load_zext_v4i16_to_v4i32_with_unfolded_gep_offset:1701; CHECK:         .functype load_zext_v4i16_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1702; CHECK-NEXT:  # %bb.0:1703; CHECK-NEXT:    local.get 01704; CHECK-NEXT:    i32.const 81705; CHECK-NEXT:    i32.add1706; CHECK-NEXT:    i32x4.load16x4_u 01707; CHECK-NEXT:    # fallthrough-return1708  %s = getelementptr <4 x i16>, ptr %p, i32 11709  %v = load <4 x i16>, ptr %s1710  %v2 = zext <4 x i16> %v to <4 x i32>1711  ret <4 x i32> %v21712}1713 1714define <4 x i32> @load_sext_v4i8_to_v4i32_with_unfolded_gep_offset(ptr %p) {1715; CHECK-LABEL: load_sext_v4i8_to_v4i32_with_unfolded_gep_offset:1716; CHECK:         .functype load_sext_v4i8_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1717; CHECK-NEXT:  # %bb.0:1718; CHECK-NEXT:    local.get 01719; CHECK-NEXT:    i32.const 41720; CHECK-NEXT:    i32.add1721; CHECK-NEXT:    v128.load32_zero 01722; CHECK-NEXT:    i16x8.extend_low_i8x16_s1723; CHECK-NEXT:    i32x4.extend_low_i16x8_s1724; CHECK-NEXT:    # fallthrough-return1725  %s = getelementptr <4 x i8>, ptr %p, i32 11726  %v = load <4 x i8>, ptr %s1727  %v2 = sext <4 x i8> %v to <4 x i32>1728  ret <4 x i32> %v21729}1730 1731define <4 x i32> @load_zext_v4i8_to_v4i32_with_unfolded_gep_offset(ptr %p) {1732; CHECK-LABEL: load_zext_v4i8_to_v4i32_with_unfolded_gep_offset:1733; CHECK:         .functype load_zext_v4i8_to_v4i32_with_unfolded_gep_offset (i32) -> (v128)1734; CHECK-NEXT:  # %bb.0:1735; CHECK-NEXT:    local.get 01736; CHECK-NEXT:    i32.const 41737; CHECK-NEXT:    i32.add1738; CHECK-NEXT:    v128.load32_zero 01739; CHECK-NEXT:    i16x8.extend_low_i8x16_u1740; CHECK-NEXT:    i32x4.extend_low_i16x8_u1741; CHECK-NEXT:    # fallthrough-return1742  %s = getelementptr <4 x i8>, ptr %p, i32 11743  %v = load <4 x i8>, ptr %s1744  %v2 = zext <4 x i8> %v to <4 x i32>1745  ret <4 x i32> %v21746}1747 1748define <4 x i16> @load_ext_v4i32_with_unfolded_gep_offset(ptr %p) {1749; CHECK-LABEL: load_ext_v4i32_with_unfolded_gep_offset:1750; CHECK:         .functype load_ext_v4i32_with_unfolded_gep_offset (i32) -> (v128)1751; CHECK-NEXT:  # %bb.0:1752; CHECK-NEXT:    local.get 01753; CHECK-NEXT:    i32.const 81754; CHECK-NEXT:    i32.add1755; CHECK-NEXT:    v128.load64_zero 01756; CHECK-NEXT:    # fallthrough-return1757  %s = getelementptr <4 x i16>, ptr %p, i32 11758  %v = load <4 x i16>, ptr %s1759  ret <4 x i16> %v1760}1761 1762define <4 x i32> @load_v4i32_from_numeric_address() {1763; CHECK-LABEL: load_v4i32_from_numeric_address:1764; CHECK:         .functype load_v4i32_from_numeric_address () -> (v128)1765; CHECK-NEXT:  # %bb.0:1766; CHECK-NEXT:    i32.const 01767; CHECK-NEXT:    v128.load 321768; CHECK-NEXT:    # fallthrough-return1769  %s = inttoptr i32 32 to ptr1770  %v = load <4 x i32>, ptr %s1771  ret <4 x i32> %v1772}1773 1774define <4 x i32> @load_splat_v4i32_from_numeric_address() {1775; CHECK-LABEL: load_splat_v4i32_from_numeric_address:1776; CHECK:         .functype load_splat_v4i32_from_numeric_address () -> (v128)1777; CHECK-NEXT:  # %bb.0:1778; CHECK-NEXT:    i32.const 01779; CHECK-NEXT:    v128.load32_splat 321780; CHECK-NEXT:    # fallthrough-return1781  %s = inttoptr i32 32 to ptr1782  %e = load i32, ptr %s1783  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01784  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1785  ret <4 x i32> %v21786}1787 1788define <4 x i32> @load_sext_v4i16_to_v4i32_from_numeric_address() {1789; CHECK-LABEL: load_sext_v4i16_to_v4i32_from_numeric_address:1790; CHECK:         .functype load_sext_v4i16_to_v4i32_from_numeric_address () -> (v128)1791; CHECK-NEXT:  # %bb.0:1792; CHECK-NEXT:    i32.const 01793; CHECK-NEXT:    i32x4.load16x4_s 321794; CHECK-NEXT:    # fallthrough-return1795  %s = inttoptr i32 32 to ptr1796  %v = load <4 x i16>, ptr %s1797  %v2 = sext <4 x i16> %v to <4 x i32>1798  ret <4 x i32> %v21799}1800 1801define <4 x i32> @load_zext_v4i16_to_v4i32_from_numeric_address() {1802; CHECK-LABEL: load_zext_v4i16_to_v4i32_from_numeric_address:1803; CHECK:         .functype load_zext_v4i16_to_v4i32_from_numeric_address () -> (v128)1804; CHECK-NEXT:  # %bb.0:1805; CHECK-NEXT:    i32.const 01806; CHECK-NEXT:    i32x4.load16x4_u 321807; CHECK-NEXT:    # fallthrough-return1808  %s = inttoptr i32 32 to ptr1809  %v = load <4 x i16>, ptr %s1810  %v2 = zext <4 x i16> %v to <4 x i32>1811  ret <4 x i32> %v21812}1813 1814define <4 x i32> @load_sext_v4i8_to_v4i32_from_numeric_address() {1815; CHECK-LABEL: load_sext_v4i8_to_v4i32_from_numeric_address:1816; CHECK:         .functype load_sext_v4i8_to_v4i32_from_numeric_address () -> (v128)1817; CHECK-NEXT:  # %bb.0:1818; CHECK-NEXT:    i32.const 01819; CHECK-NEXT:    v128.load32_zero 321820; CHECK-NEXT:    i16x8.extend_low_i8x16_s1821; CHECK-NEXT:    i32x4.extend_low_i16x8_s1822; CHECK-NEXT:    # fallthrough-return1823  %s = inttoptr i32 32 to ptr1824  %v = load <4 x i8>, ptr %s1825  %v2 = sext <4 x i8> %v to <4 x i32>1826  ret <4 x i32> %v21827}1828 1829define <4 x i32> @load_zext_v4i8_to_v4i32_from_numeric_address() {1830; CHECK-LABEL: load_zext_v4i8_to_v4i32_from_numeric_address:1831; CHECK:         .functype load_zext_v4i8_to_v4i32_from_numeric_address () -> (v128)1832; CHECK-NEXT:  # %bb.0:1833; CHECK-NEXT:    i32.const 01834; CHECK-NEXT:    v128.load32_zero 321835; CHECK-NEXT:    i16x8.extend_low_i8x16_u1836; CHECK-NEXT:    i32x4.extend_low_i16x8_u1837; CHECK-NEXT:    # fallthrough-return1838  %s = inttoptr i32 32 to ptr1839  %v = load <4 x i8>, ptr %s1840  %v2 = zext <4 x i8> %v to <4 x i32>1841  ret <4 x i32> %v21842}1843 1844define <4 x i16> @load_ext_v4i32_from_numeric_address() {1845; CHECK-LABEL: load_ext_v4i32_from_numeric_address:1846; CHECK:         .functype load_ext_v4i32_from_numeric_address () -> (v128)1847; CHECK-NEXT:  # %bb.0:1848; CHECK-NEXT:    i32.const 01849; CHECK-NEXT:    v128.load64_zero 321850; CHECK-NEXT:    # fallthrough-return1851  %s = inttoptr i32 32 to ptr1852  %v = load <4 x i16>, ptr %s1853  ret <4 x i16> %v1854}1855 1856@gv_v4i32 = global <4 x i32> <i32 42, i32 42, i32 42, i32 42>1857define <4 x i32> @load_v4i32_from_global_address() {1858; CHECK-LABEL: load_v4i32_from_global_address:1859; CHECK:         .functype load_v4i32_from_global_address () -> (v128)1860; CHECK-NEXT:  # %bb.0:1861; CHECK-NEXT:    i32.const 01862; CHECK-NEXT:    v128.load gv_v4i321863; CHECK-NEXT:    # fallthrough-return1864  %v = load <4 x i32>, ptr @gv_v4i321865  ret <4 x i32> %v1866}1867 1868@gv_i32 = global i32 421869define <4 x i32> @load_splat_v4i32_from_global_address() {1870; CHECK-LABEL: load_splat_v4i32_from_global_address:1871; CHECK:         .functype load_splat_v4i32_from_global_address () -> (v128)1872; CHECK-NEXT:  # %bb.0:1873; CHECK-NEXT:    i32.const 01874; CHECK-NEXT:    v128.load32_splat gv_i321875; CHECK-NEXT:    # fallthrough-return1876  %e = load i32, ptr @gv_i321877  %v1 = insertelement <4 x i32> undef, i32 %e, i32 01878  %v2 = shufflevector <4 x i32> %v1, <4 x i32> undef, <4 x i32> zeroinitializer1879  ret <4 x i32> %v21880}1881 1882@gv_v4i16 = global <4 x i16> <i16 42, i16 42, i16 42, i16 42>1883define <4 x i32> @load_sext_v4i16_to_v4i32_from_global_address() {1884; CHECK-LABEL: load_sext_v4i16_to_v4i32_from_global_address:1885; CHECK:         .functype load_sext_v4i16_to_v4i32_from_global_address () -> (v128)1886; CHECK-NEXT:  # %bb.0:1887; CHECK-NEXT:    i32.const 01888; CHECK-NEXT:    i32x4.load16x4_s gv_v4i161889; CHECK-NEXT:    # fallthrough-return1890  %v = load <4 x i16>, ptr @gv_v4i161891  %v2 = sext <4 x i16> %v to <4 x i32>1892  ret <4 x i32> %v21893}1894 1895define <4 x i32> @load_zext_v4i16_to_v4i32_from_global_address() {1896; CHECK-LABEL: load_zext_v4i16_to_v4i32_from_global_address:1897; CHECK:         .functype load_zext_v4i16_to_v4i32_from_global_address () -> (v128)1898; CHECK-NEXT:  # %bb.0:1899; CHECK-NEXT:    i32.const 01900; CHECK-NEXT:    i32x4.load16x4_u gv_v4i161901; CHECK-NEXT:    # fallthrough-return1902  %v = load <4 x i16>, ptr @gv_v4i161903  %v2 = zext <4 x i16> %v to <4 x i32>1904  ret <4 x i32> %v21905}1906 1907@gv_v4i8 = global <4 x i8> <i8 42, i8 42, i8 42, i8 42>1908define <4 x i32> @load_sext_v4i8_to_v4i32_from_global_address() {1909; CHECK-LABEL: load_sext_v4i8_to_v4i32_from_global_address:1910; CHECK:         .functype load_sext_v4i8_to_v4i32_from_global_address () -> (v128)1911; CHECK-NEXT:  # %bb.0:1912; CHECK-NEXT:    i32.const 01913; CHECK-NEXT:    v128.load32_zero gv_v4i81914; CHECK-NEXT:    i16x8.extend_low_i8x16_s1915; CHECK-NEXT:    i32x4.extend_low_i16x8_s1916; CHECK-NEXT:    # fallthrough-return1917  %v = load <4 x i8>, ptr @gv_v4i81918  %v2 = sext <4 x i8> %v to <4 x i32>1919  ret <4 x i32> %v21920}1921 1922define <4 x i32> @load_zext_v4i8_to_v4i32_from_global_address() {1923; CHECK-LABEL: load_zext_v4i8_to_v4i32_from_global_address:1924; CHECK:         .functype load_zext_v4i8_to_v4i32_from_global_address () -> (v128)1925; CHECK-NEXT:  # %bb.0:1926; CHECK-NEXT:    i32.const 01927; CHECK-NEXT:    v128.load32_zero gv_v4i81928; CHECK-NEXT:    i16x8.extend_low_i8x16_u1929; CHECK-NEXT:    i32x4.extend_low_i16x8_u1930; CHECK-NEXT:    # fallthrough-return1931  %v = load <4 x i8>, ptr @gv_v4i81932  %v2 = zext <4 x i8> %v to <4 x i32>1933  ret <4 x i32> %v21934}1935 1936define <4 x i16> @load_ext_v4i32_from_global_address() {1937; CHECK-LABEL: load_ext_v4i32_from_global_address:1938; CHECK:         .functype load_ext_v4i32_from_global_address () -> (v128)1939; CHECK-NEXT:  # %bb.0:1940; CHECK-NEXT:    i32.const 01941; CHECK-NEXT:    v128.load64_zero gv_v4i161942; CHECK-NEXT:    # fallthrough-return1943  %v = load <4 x i16>, ptr @gv_v4i161944  ret <4 x i16> %v1945}1946 1947define void @store_v4i32(<4 x i32> %v, ptr %p) {1948; CHECK-LABEL: store_v4i32:1949; CHECK:         .functype store_v4i32 (v128, i32) -> ()1950; CHECK-NEXT:  # %bb.0:1951; CHECK-NEXT:    local.get 11952; CHECK-NEXT:    local.get 01953; CHECK-NEXT:    v128.store 01954; CHECK-NEXT:    # fallthrough-return1955  store <4 x i32> %v , ptr %p1956  ret void1957}1958 1959define void @store_narrowing_v4i32(<4 x i16> %v, ptr %p) {1960; CHECK-LABEL: store_narrowing_v4i32:1961; CHECK:         .functype store_narrowing_v4i32 (v128, i32) -> ()1962; CHECK-NEXT:  # %bb.0:1963; CHECK-NEXT:    local.get 11964; CHECK-NEXT:    local.get 01965; CHECK-NEXT:    v128.store64_lane 0, 01966; CHECK-NEXT:    # fallthrough-return1967  store <4 x i16> %v , ptr %p1968  ret void1969}1970 1971define void @store_v4i32_with_folded_offset(<4 x i32> %v, ptr %p) {1972; CHECK-LABEL: store_v4i32_with_folded_offset:1973; CHECK:         .functype store_v4i32_with_folded_offset (v128, i32) -> ()1974; CHECK-NEXT:  # %bb.0:1975; CHECK-NEXT:    local.get 11976; CHECK-NEXT:    local.get 01977; CHECK-NEXT:    v128.store 161978; CHECK-NEXT:    # fallthrough-return1979  %q = ptrtoint ptr %p to i321980  %r = add nuw i32 %q, 161981  %s = inttoptr i32 %r to ptr1982  store <4 x i32> %v , ptr %s1983  ret void1984}1985 1986define void @store_narrowing_v4i32_with_folded_offset(<4 x i16> %v, ptr %p) {1987; CHECK-LABEL: store_narrowing_v4i32_with_folded_offset:1988; CHECK:         .functype store_narrowing_v4i32_with_folded_offset (v128, i32) -> ()1989; CHECK-NEXT:  # %bb.0:1990; CHECK-NEXT:    local.get 11991; CHECK-NEXT:    local.get 01992; CHECK-NEXT:    v128.store64_lane 16, 01993; CHECK-NEXT:    # fallthrough-return1994  %q = ptrtoint ptr %p to i321995  %r = add nuw i32 %q, 161996  %s = inttoptr i32 %r to ptr1997  store <4 x i16> %v , ptr %s1998  ret void1999}2000 2001define void @store_v4i32_with_folded_gep_offset(<4 x i32> %v, ptr %p) {2002; CHECK-LABEL: store_v4i32_with_folded_gep_offset:2003; CHECK:         .functype store_v4i32_with_folded_gep_offset (v128, i32) -> ()2004; CHECK-NEXT:  # %bb.0:2005; CHECK-NEXT:    local.get 12006; CHECK-NEXT:    local.get 02007; CHECK-NEXT:    v128.store 162008; CHECK-NEXT:    # fallthrough-return2009  %s = getelementptr inbounds <4 x i32>, ptr %p, i32 12010  store <4 x i32> %v , ptr %s2011  ret void2012}2013 2014define void @store_narrowing_v4i32_with_folded_gep_offset(<4 x i16> %v, ptr %p) {2015; CHECK-LABEL: store_narrowing_v4i32_with_folded_gep_offset:2016; CHECK:         .functype store_narrowing_v4i32_with_folded_gep_offset (v128, i32) -> ()2017; CHECK-NEXT:  # %bb.0:2018; CHECK-NEXT:    local.get 12019; CHECK-NEXT:    local.get 02020; CHECK-NEXT:    v128.store64_lane 8, 02021; CHECK-NEXT:    # fallthrough-return2022  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 12023  store <4 x i16> %v , ptr %s2024  ret void2025}2026 2027define void @store_v4i32_with_unfolded_gep_negative_offset(<4 x i32> %v, ptr %p) {2028; CHECK-LABEL: store_v4i32_with_unfolded_gep_negative_offset:2029; CHECK:         .functype store_v4i32_with_unfolded_gep_negative_offset (v128, i32) -> ()2030; CHECK-NEXT:  # %bb.0:2031; CHECK-NEXT:    local.get 12032; CHECK-NEXT:    i32.const -162033; CHECK-NEXT:    i32.add2034; CHECK-NEXT:    local.get 02035; CHECK-NEXT:    v128.store 02036; CHECK-NEXT:    # fallthrough-return2037  %s = getelementptr inbounds <4 x i32>, ptr %p, i32 -12038  store <4 x i32> %v , ptr %s2039  ret void2040}2041 2042define void @store_narrowing_v4i32_with_unfolded_gep_negative_offset(<4 x i16> %v, ptr %p) {2043; CHECK-LABEL: store_narrowing_v4i32_with_unfolded_gep_negative_offset:2044; CHECK:         .functype store_narrowing_v4i32_with_unfolded_gep_negative_offset (v128, i32) -> ()2045; CHECK-NEXT:  # %bb.0:2046; CHECK-NEXT:    local.get 12047; CHECK-NEXT:    i32.const -82048; CHECK-NEXT:    i32.add2049; CHECK-NEXT:    local.get 02050; CHECK-NEXT:    v128.store64_lane 0, 02051; CHECK-NEXT:    # fallthrough-return2052  %s = getelementptr inbounds <4 x i16>, ptr %p, i32 -12053  store <4 x i16> %v , ptr %s2054  ret void2055}2056 2057define void @store_v4i32_with_unfolded_offset(<4 x i32> %v, ptr %p) {2058; CHECK-LABEL: store_v4i32_with_unfolded_offset:2059; CHECK:         .functype store_v4i32_with_unfolded_offset (v128, i32) -> ()2060; CHECK-NEXT:  # %bb.0:2061; CHECK-NEXT:    local.get 12062; CHECK-NEXT:    i32.const 162063; CHECK-NEXT:    i32.add2064; CHECK-NEXT:    local.get 02065; CHECK-NEXT:    v128.store 02066; CHECK-NEXT:    # fallthrough-return2067  %q = ptrtoint ptr %p to i322068  %r = add nsw i32 %q, 162069  %s = inttoptr i32 %r to ptr2070  store <4 x i32> %v , ptr %s2071  ret void2072}2073 2074define void @store_narrowing_v4i32_with_unfolded_offset(<4 x i16> %v, ptr %p) {2075; CHECK-LABEL: store_narrowing_v4i32_with_unfolded_offset:2076; CHECK:         .functype store_narrowing_v4i32_with_unfolded_offset (v128, i32) -> ()2077; CHECK-NEXT:  # %bb.0:2078; CHECK-NEXT:    local.get 12079; CHECK-NEXT:    i32.const 162080; CHECK-NEXT:    i32.add2081; CHECK-NEXT:    local.get 02082; CHECK-NEXT:    v128.store64_lane 0, 02083; CHECK-NEXT:    # fallthrough-return2084  %q = ptrtoint ptr %p to i322085  %r = add nsw i32 %q, 162086  %s = inttoptr i32 %r to ptr2087  store <4 x i16> %v , ptr %s2088  ret void2089}2090 2091define void @store_v4i32_with_unfolded_gep_offset(<4 x i32> %v, ptr %p) {2092; CHECK-LABEL: store_v4i32_with_unfolded_gep_offset:2093; CHECK:         .functype store_v4i32_with_unfolded_gep_offset (v128, i32) -> ()2094; CHECK-NEXT:  # %bb.0:2095; CHECK-NEXT:    local.get 12096; CHECK-NEXT:    i32.const 162097; CHECK-NEXT:    i32.add2098; CHECK-NEXT:    local.get 02099; CHECK-NEXT:    v128.store 02100; CHECK-NEXT:    # fallthrough-return2101  %s = getelementptr <4 x i32>, ptr %p, i32 12102  store <4 x i32> %v , ptr %s2103  ret void2104}2105 2106define void @store_narrowing_v4i32_with_unfolded_gep_offset(<4 x i16> %v, ptr %p) {2107; CHECK-LABEL: store_narrowing_v4i32_with_unfolded_gep_offset:2108; CHECK:         .functype store_narrowing_v4i32_with_unfolded_gep_offset (v128, i32) -> ()2109; CHECK-NEXT:  # %bb.0:2110; CHECK-NEXT:    local.get 12111; CHECK-NEXT:    i32.const 82112; CHECK-NEXT:    i32.add2113; CHECK-NEXT:    local.get 02114; CHECK-NEXT:    v128.store64_lane 0, 02115; CHECK-NEXT:    # fallthrough-return2116  %s = getelementptr <4 x i16>, ptr %p, i32 12117  store <4 x i16> %v , ptr %s2118  ret void2119}2120 2121define void @store_v4i32_to_numeric_address(<4 x i32> %v) {2122; CHECK-LABEL: store_v4i32_to_numeric_address:2123; CHECK:         .functype store_v4i32_to_numeric_address (v128) -> ()2124; CHECK-NEXT:  # %bb.0:2125; CHECK-NEXT:    i32.const 02126; CHECK-NEXT:    local.get 02127; CHECK-NEXT:    v128.store 322128; CHECK-NEXT:    # fallthrough-return2129  %s = inttoptr i32 32 to ptr2130  store <4 x i32> %v , ptr %s2131  ret void2132}2133 2134define void @store_narrowing_v4i32_to_numeric_address(<4 x i16> %v) {2135; CHECK-LABEL: store_narrowing_v4i32_to_numeric_address:2136; CHECK:         .functype store_narrowing_v4i32_to_numeric_address (v128) -> ()2137; CHECK-NEXT:  # %bb.0:2138; CHECK-NEXT:    i32.const 02139; CHECK-NEXT:    local.get 02140; CHECK-NEXT:    v128.store64_lane 32, 02141; CHECK-NEXT:    # fallthrough-return2142  %s = inttoptr i32 32 to ptr2143  store <4 x i16> %v , ptr %s2144  ret void2145}2146 2147define void @store_v4i32_to_global_address(<4 x i32> %v) {2148; CHECK-LABEL: store_v4i32_to_global_address:2149; CHECK:         .functype store_v4i32_to_global_address (v128) -> ()2150; CHECK-NEXT:  # %bb.0:2151; CHECK-NEXT:    i32.const 02152; CHECK-NEXT:    local.get 02153; CHECK-NEXT:    v128.store gv_v4i322154; CHECK-NEXT:    # fallthrough-return2155  store <4 x i32> %v , ptr @gv_v4i322156  ret void2157}2158 2159define void @store_narrowing_v4i32_to_global_address(<4 x i16> %v) {2160; CHECK-LABEL: store_narrowing_v4i32_to_global_address:2161; CHECK:         .functype store_narrowing_v4i32_to_global_address (v128) -> ()2162; CHECK-NEXT:  # %bb.0:2163; CHECK-NEXT:    i32.const 02164; CHECK-NEXT:    local.get 02165; CHECK-NEXT:    v128.store64_lane gv_v4i16, 02166; CHECK-NEXT:    # fallthrough-return2167  store <4 x i16> %v , ptr @gv_v4i162168  ret void2169}2170 2171; ==============================================================================2172; 2 x i642173; ==============================================================================2174define <2 x i64> @load_v2i64(ptr %p) {2175; CHECK-LABEL: load_v2i64:2176; CHECK:         .functype load_v2i64 (i32) -> (v128)2177; CHECK-NEXT:  # %bb.0:2178; CHECK-NEXT:    local.get 02179; CHECK-NEXT:    v128.load 02180; CHECK-NEXT:    # fallthrough-return2181  %v = load <2 x i64>, ptr %p2182  ret <2 x i64> %v2183}2184 2185define <2 x i64> @load_splat_v2i64(ptr %p) {2186; CHECK-LABEL: load_splat_v2i64:2187; CHECK:         .functype load_splat_v2i64 (i32) -> (v128)2188; CHECK-NEXT:  # %bb.0:2189; CHECK-NEXT:    local.get 02190; CHECK-NEXT:    v128.load64_splat 02191; CHECK-NEXT:    # fallthrough-return2192  %e = load i64, ptr %p2193  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02194  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2195  ret <2 x i64> %v22196}2197 2198define <2 x i64> @load_sext_v2i64(ptr %p) {2199; CHECK-LABEL: load_sext_v2i64:2200; CHECK:         .functype load_sext_v2i64 (i32) -> (v128)2201; CHECK-NEXT:  # %bb.0:2202; CHECK-NEXT:    local.get 02203; CHECK-NEXT:    i64x2.load32x2_s 02204; CHECK-NEXT:    # fallthrough-return2205  %v = load <2 x i32>, ptr %p2206  %v2 = sext <2 x i32> %v to <2 x i64>2207  ret <2 x i64> %v22208}2209 2210define <2 x i64> @load_zext_v2i64(ptr %p) {2211; CHECK-LABEL: load_zext_v2i64:2212; CHECK:         .functype load_zext_v2i64 (i32) -> (v128)2213; CHECK-NEXT:  # %bb.0:2214; CHECK-NEXT:    local.get 02215; CHECK-NEXT:    i64x2.load32x2_u 02216; CHECK-NEXT:    # fallthrough-return2217  %v = load <2 x i32>, ptr %p2218  %v2 = zext <2 x i32> %v to <2 x i64>2219  ret <2 x i64> %v22220}2221 2222define <2 x i32> @load_ext_v2i64(ptr %p) {2223; CHECK-LABEL: load_ext_v2i64:2224; CHECK:         .functype load_ext_v2i64 (i32) -> (v128)2225; CHECK-NEXT:  # %bb.0:2226; CHECK-NEXT:    local.get 02227; CHECK-NEXT:    v128.load64_zero 02228; CHECK-NEXT:    # fallthrough-return2229  %v = load <2 x i32>, ptr %p2230  ret <2 x i32> %v2231}2232 2233define <2 x i64> @load_v2i64_with_folded_offset(ptr %p) {2234; CHECK-LABEL: load_v2i64_with_folded_offset:2235; CHECK:         .functype load_v2i64_with_folded_offset (i32) -> (v128)2236; CHECK-NEXT:  # %bb.0:2237; CHECK-NEXT:    local.get 02238; CHECK-NEXT:    v128.load 162239; CHECK-NEXT:    # fallthrough-return2240  %q = ptrtoint ptr %p to i322241  %r = add nuw i32 %q, 162242  %s = inttoptr i32 %r to ptr2243  %v = load <2 x i64>, ptr %s2244  ret <2 x i64> %v2245}2246 2247define <2 x i64> @load_splat_v2i64_with_folded_offset(ptr %p) {2248; CHECK-LABEL: load_splat_v2i64_with_folded_offset:2249; CHECK:         .functype load_splat_v2i64_with_folded_offset (i32) -> (v128)2250; CHECK-NEXT:  # %bb.0:2251; CHECK-NEXT:    local.get 02252; CHECK-NEXT:    v128.load64_splat 162253; CHECK-NEXT:    # fallthrough-return2254  %q = ptrtoint ptr %p to i322255  %r = add nuw i32 %q, 162256  %s = inttoptr i32 %r to ptr2257  %e = load i64, ptr %s2258  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02259  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2260  ret <2 x i64> %v22261}2262 2263define <2 x i64> @load_sext_v2i64_with_folded_offset(ptr %p) {2264; CHECK-LABEL: load_sext_v2i64_with_folded_offset:2265; CHECK:         .functype load_sext_v2i64_with_folded_offset (i32) -> (v128)2266; CHECK-NEXT:  # %bb.0:2267; CHECK-NEXT:    local.get 02268; CHECK-NEXT:    i64x2.load32x2_s 162269; CHECK-NEXT:    # fallthrough-return2270  %q = ptrtoint ptr %p to i322271  %r = add nuw i32 %q, 162272  %s = inttoptr i32 %r to ptr2273  %v = load <2 x i32>, ptr %s2274  %v2 = sext <2 x i32> %v to <2 x i64>2275  ret <2 x i64> %v22276}2277 2278define <2 x i64> @load_zext_v2i64_with_folded_offset(ptr %p) {2279; CHECK-LABEL: load_zext_v2i64_with_folded_offset:2280; CHECK:         .functype load_zext_v2i64_with_folded_offset (i32) -> (v128)2281; CHECK-NEXT:  # %bb.0:2282; CHECK-NEXT:    local.get 02283; CHECK-NEXT:    i64x2.load32x2_u 162284; CHECK-NEXT:    # fallthrough-return2285  %q = ptrtoint ptr %p to i322286  %r = add nuw i32 %q, 162287  %s = inttoptr i32 %r to ptr2288  %v = load <2 x i32>, ptr %s2289  %v2 = zext <2 x i32> %v to <2 x i64>2290  ret <2 x i64> %v22291}2292 2293define <2 x i32> @load_ext_v2i64_with_folded_offset(ptr %p) {2294; CHECK-LABEL: load_ext_v2i64_with_folded_offset:2295; CHECK:         .functype load_ext_v2i64_with_folded_offset (i32) -> (v128)2296; CHECK-NEXT:  # %bb.0:2297; CHECK-NEXT:    local.get 02298; CHECK-NEXT:    v128.load64_zero 162299; CHECK-NEXT:    # fallthrough-return2300  %q = ptrtoint ptr %p to i322301  %r = add nuw i32 %q, 162302  %s = inttoptr i32 %r to ptr2303  %v = load <2 x i32>, ptr %s2304  ret <2 x i32> %v2305}2306 2307define <2 x i64> @load_v2i64_with_folded_gep_offset(ptr %p) {2308; CHECK-LABEL: load_v2i64_with_folded_gep_offset:2309; CHECK:         .functype load_v2i64_with_folded_gep_offset (i32) -> (v128)2310; CHECK-NEXT:  # %bb.0:2311; CHECK-NEXT:    local.get 02312; CHECK-NEXT:    v128.load 162313; CHECK-NEXT:    # fallthrough-return2314  %s = getelementptr inbounds <2 x i64>, ptr %p, i32 12315  %v = load <2 x i64>, ptr %s2316  ret <2 x i64> %v2317}2318 2319define <2 x i64> @load_splat_v2i64_with_folded_gep_offset(ptr %p) {2320; CHECK-LABEL: load_splat_v2i64_with_folded_gep_offset:2321; CHECK:         .functype load_splat_v2i64_with_folded_gep_offset (i32) -> (v128)2322; CHECK-NEXT:  # %bb.0:2323; CHECK-NEXT:    local.get 02324; CHECK-NEXT:    v128.load64_splat 82325; CHECK-NEXT:    # fallthrough-return2326  %s = getelementptr inbounds i64, ptr %p, i32 12327  %e = load i64, ptr %s2328  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02329  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2330  ret <2 x i64> %v22331}2332 2333define <2 x i64> @load_sext_v2i64_with_folded_gep_offset(ptr %p) {2334; CHECK-LABEL: load_sext_v2i64_with_folded_gep_offset:2335; CHECK:         .functype load_sext_v2i64_with_folded_gep_offset (i32) -> (v128)2336; CHECK-NEXT:  # %bb.0:2337; CHECK-NEXT:    local.get 02338; CHECK-NEXT:    i64x2.load32x2_s 82339; CHECK-NEXT:    # fallthrough-return2340  %s = getelementptr inbounds <2 x i32>, ptr %p, i32 12341  %v = load <2 x i32>, ptr %s2342  %v2 = sext <2 x i32> %v to <2 x i64>2343  ret <2 x i64> %v22344}2345 2346define <2 x i64> @load_zext_v2i64_with_folded_gep_offset(ptr %p) {2347; CHECK-LABEL: load_zext_v2i64_with_folded_gep_offset:2348; CHECK:         .functype load_zext_v2i64_with_folded_gep_offset (i32) -> (v128)2349; CHECK-NEXT:  # %bb.0:2350; CHECK-NEXT:    local.get 02351; CHECK-NEXT:    i64x2.load32x2_u 82352; CHECK-NEXT:    # fallthrough-return2353  %s = getelementptr inbounds <2 x i32>, ptr %p, i32 12354  %v = load <2 x i32>, ptr %s2355  %v2 = zext <2 x i32> %v to <2 x i64>2356  ret <2 x i64> %v22357}2358 2359define <2 x i32> @load_ext_v2i64_with_folded_gep_offset(ptr %p) {2360; CHECK-LABEL: load_ext_v2i64_with_folded_gep_offset:2361; CHECK:         .functype load_ext_v2i64_with_folded_gep_offset (i32) -> (v128)2362; CHECK-NEXT:  # %bb.0:2363; CHECK-NEXT:    local.get 02364; CHECK-NEXT:    v128.load64_zero 82365; CHECK-NEXT:    # fallthrough-return2366  %s = getelementptr inbounds <2 x i32>, ptr %p, i32 12367  %v = load <2 x i32>, ptr %s2368  ret <2 x i32> %v2369}2370 2371define <2 x i64> @load_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2372; CHECK-LABEL: load_v2i64_with_unfolded_gep_negative_offset:2373; CHECK:         .functype load_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2374; CHECK-NEXT:  # %bb.0:2375; CHECK-NEXT:    local.get 02376; CHECK-NEXT:    i32.const -162377; CHECK-NEXT:    i32.add2378; CHECK-NEXT:    v128.load 02379; CHECK-NEXT:    # fallthrough-return2380  %s = getelementptr inbounds <2 x i64>, ptr %p, i32 -12381  %v = load <2 x i64>, ptr %s2382  ret <2 x i64> %v2383}2384 2385define <2 x i64> @load_splat_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2386; CHECK-LABEL: load_splat_v2i64_with_unfolded_gep_negative_offset:2387; CHECK:         .functype load_splat_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2388; CHECK-NEXT:  # %bb.0:2389; CHECK-NEXT:    local.get 02390; CHECK-NEXT:    i32.const -82391; CHECK-NEXT:    i32.add2392; CHECK-NEXT:    v128.load64_splat 02393; CHECK-NEXT:    # fallthrough-return2394  %s = getelementptr inbounds i64, ptr %p, i32 -12395  %e = load i64, ptr %s2396  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02397  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2398  ret <2 x i64> %v22399}2400 2401define <2 x i64> @load_sext_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2402; CHECK-LABEL: load_sext_v2i64_with_unfolded_gep_negative_offset:2403; CHECK:         .functype load_sext_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2404; CHECK-NEXT:  # %bb.0:2405; CHECK-NEXT:    local.get 02406; CHECK-NEXT:    i32.const -82407; CHECK-NEXT:    i32.add2408; CHECK-NEXT:    i64x2.load32x2_s 02409; CHECK-NEXT:    # fallthrough-return2410  %s = getelementptr inbounds <2 x i32>, ptr %p, i32 -12411  %v = load <2 x i32>, ptr %s2412  %v2 = sext <2 x i32> %v to <2 x i64>2413  ret <2 x i64> %v22414}2415 2416define <2 x i64> @load_zext_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2417; CHECK-LABEL: load_zext_v2i64_with_unfolded_gep_negative_offset:2418; CHECK:         .functype load_zext_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2419; CHECK-NEXT:  # %bb.0:2420; CHECK-NEXT:    local.get 02421; CHECK-NEXT:    i32.const -82422; CHECK-NEXT:    i32.add2423; CHECK-NEXT:    i64x2.load32x2_u 02424; CHECK-NEXT:    # fallthrough-return2425  %s = getelementptr inbounds <2 x i32>, ptr %p, i32 -12426  %v = load <2 x i32>, ptr %s2427  %v2 = zext <2 x i32> %v to <2 x i64>2428  ret <2 x i64> %v22429}2430 2431define <2 x i32> @load_ext_v2i64_with_unfolded_gep_negative_offset(ptr %p) {2432; CHECK-LABEL: load_ext_v2i64_with_unfolded_gep_negative_offset:2433; CHECK:         .functype load_ext_v2i64_with_unfolded_gep_negative_offset (i32) -> (v128)2434; CHECK-NEXT:  # %bb.0:2435; CHECK-NEXT:    local.get 02436; CHECK-NEXT:    i32.const -82437; CHECK-NEXT:    i32.add2438; CHECK-NEXT:    v128.load64_zero 02439; CHECK-NEXT:    # fallthrough-return2440  %s = getelementptr inbounds <2 x i32>, ptr %p, i32 -12441  %v = load <2 x i32>, ptr %s2442  ret <2 x i32> %v2443}2444 2445define <2 x i64> @load_v2i64_with_unfolded_offset(ptr %p) {2446; CHECK-LABEL: load_v2i64_with_unfolded_offset:2447; CHECK:         .functype load_v2i64_with_unfolded_offset (i32) -> (v128)2448; CHECK-NEXT:  # %bb.0:2449; CHECK-NEXT:    local.get 02450; CHECK-NEXT:    i32.const 162451; CHECK-NEXT:    i32.add2452; CHECK-NEXT:    v128.load 02453; CHECK-NEXT:    # fallthrough-return2454  %q = ptrtoint ptr %p to i322455  %r = add nsw i32 %q, 162456  %s = inttoptr i32 %r to ptr2457  %v = load <2 x i64>, ptr %s2458  ret <2 x i64> %v2459}2460 2461define <2 x i64> @load_splat_v2i64_with_unfolded_offset(ptr %p) {2462; CHECK-LABEL: load_splat_v2i64_with_unfolded_offset:2463; CHECK:         .functype load_splat_v2i64_with_unfolded_offset (i32) -> (v128)2464; CHECK-NEXT:  # %bb.0:2465; CHECK-NEXT:    local.get 02466; CHECK-NEXT:    i32.const 162467; CHECK-NEXT:    i32.add2468; CHECK-NEXT:    v128.load64_splat 02469; CHECK-NEXT:    # fallthrough-return2470  %q = ptrtoint ptr %p to i322471  %r = add nsw i32 %q, 162472  %s = inttoptr i32 %r to ptr2473  %e = load i64, ptr %s2474  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02475  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2476  ret <2 x i64> %v22477}2478 2479define <2 x i64> @load_sext_v2i64_with_unfolded_offset(ptr %p) {2480; CHECK-LABEL: load_sext_v2i64_with_unfolded_offset:2481; CHECK:         .functype load_sext_v2i64_with_unfolded_offset (i32) -> (v128)2482; CHECK-NEXT:  # %bb.0:2483; CHECK-NEXT:    local.get 02484; CHECK-NEXT:    i32.const 162485; CHECK-NEXT:    i32.add2486; CHECK-NEXT:    i64x2.load32x2_s 02487; CHECK-NEXT:    # fallthrough-return2488  %q = ptrtoint ptr %p to i322489  %r = add nsw i32 %q, 162490  %s = inttoptr i32 %r to ptr2491  %v = load <2 x i32>, ptr %s2492  %v2 = sext <2 x i32> %v to <2 x i64>2493  ret <2 x i64> %v22494}2495 2496define <2 x i64> @load_zext_v2i64_with_unfolded_offset(ptr %p) {2497; CHECK-LABEL: load_zext_v2i64_with_unfolded_offset:2498; CHECK:         .functype load_zext_v2i64_with_unfolded_offset (i32) -> (v128)2499; CHECK-NEXT:  # %bb.0:2500; CHECK-NEXT:    local.get 02501; CHECK-NEXT:    i32.const 162502; CHECK-NEXT:    i32.add2503; CHECK-NEXT:    i64x2.load32x2_u 02504; CHECK-NEXT:    # fallthrough-return2505  %q = ptrtoint ptr %p to i322506  %r = add nsw i32 %q, 162507  %s = inttoptr i32 %r to ptr2508  %v = load <2 x i32>, ptr %s2509  %v2 = zext <2 x i32> %v to <2 x i64>2510  ret <2 x i64> %v22511}2512 2513define <2 x i32> @load_ext_v2i64_with_unfolded_offset(ptr %p) {2514; CHECK-LABEL: load_ext_v2i64_with_unfolded_offset:2515; CHECK:         .functype load_ext_v2i64_with_unfolded_offset (i32) -> (v128)2516; CHECK-NEXT:  # %bb.0:2517; CHECK-NEXT:    local.get 02518; CHECK-NEXT:    i32.const 162519; CHECK-NEXT:    i32.add2520; CHECK-NEXT:    v128.load64_zero 02521; CHECK-NEXT:    # fallthrough-return2522  %q = ptrtoint ptr %p to i322523  %r = add nsw i32 %q, 162524  %s = inttoptr i32 %r to ptr2525  %v = load <2 x i32>, ptr %s2526  ret <2 x i32> %v2527}2528 2529define <2 x i64> @load_v2i64_with_unfolded_gep_offset(ptr %p) {2530; CHECK-LABEL: load_v2i64_with_unfolded_gep_offset:2531; CHECK:         .functype load_v2i64_with_unfolded_gep_offset (i32) -> (v128)2532; CHECK-NEXT:  # %bb.0:2533; CHECK-NEXT:    local.get 02534; CHECK-NEXT:    i32.const 162535; CHECK-NEXT:    i32.add2536; CHECK-NEXT:    v128.load 02537; CHECK-NEXT:    # fallthrough-return2538  %s = getelementptr <2 x i64>, ptr %p, i32 12539  %v = load <2 x i64>, ptr %s2540  ret <2 x i64> %v2541}2542 2543define <2 x i64> @load_splat_v2i64_with_unfolded_gep_offset(ptr %p) {2544; CHECK-LABEL: load_splat_v2i64_with_unfolded_gep_offset:2545; CHECK:         .functype load_splat_v2i64_with_unfolded_gep_offset (i32) -> (v128)2546; CHECK-NEXT:  # %bb.0:2547; CHECK-NEXT:    local.get 02548; CHECK-NEXT:    i32.const 82549; CHECK-NEXT:    i32.add2550; CHECK-NEXT:    v128.load64_splat 02551; CHECK-NEXT:    # fallthrough-return2552  %s = getelementptr i64, ptr %p, i32 12553  %e = load i64, ptr %s2554  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02555  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2556  ret <2 x i64> %v22557}2558 2559define <2 x i64> @load_sext_v2i64_with_unfolded_gep_offset(ptr %p) {2560; CHECK-LABEL: load_sext_v2i64_with_unfolded_gep_offset:2561; CHECK:         .functype load_sext_v2i64_with_unfolded_gep_offset (i32) -> (v128)2562; CHECK-NEXT:  # %bb.0:2563; CHECK-NEXT:    local.get 02564; CHECK-NEXT:    i32.const 82565; CHECK-NEXT:    i32.add2566; CHECK-NEXT:    i64x2.load32x2_s 02567; CHECK-NEXT:    # fallthrough-return2568  %s = getelementptr <2 x i32>, ptr %p, i32 12569  %v = load <2 x i32>, ptr %s2570  %v2 = sext <2 x i32> %v to <2 x i64>2571  ret <2 x i64> %v22572}2573 2574define <2 x i64> @load_zext_v2i64_with_unfolded_gep_offset(ptr %p) {2575; CHECK-LABEL: load_zext_v2i64_with_unfolded_gep_offset:2576; CHECK:         .functype load_zext_v2i64_with_unfolded_gep_offset (i32) -> (v128)2577; CHECK-NEXT:  # %bb.0:2578; CHECK-NEXT:    local.get 02579; CHECK-NEXT:    i32.const 82580; CHECK-NEXT:    i32.add2581; CHECK-NEXT:    i64x2.load32x2_u 02582; CHECK-NEXT:    # fallthrough-return2583  %s = getelementptr <2 x i32>, ptr %p, i32 12584  %v = load <2 x i32>, ptr %s2585  %v2 = zext <2 x i32> %v to <2 x i64>2586  ret <2 x i64> %v22587}2588 2589define <2 x i32> @load_ext_v2i64_with_unfolded_gep_offset(ptr %p) {2590; CHECK-LABEL: load_ext_v2i64_with_unfolded_gep_offset:2591; CHECK:         .functype load_ext_v2i64_with_unfolded_gep_offset (i32) -> (v128)2592; CHECK-NEXT:  # %bb.0:2593; CHECK-NEXT:    local.get 02594; CHECK-NEXT:    i32.const 82595; CHECK-NEXT:    i32.add2596; CHECK-NEXT:    v128.load64_zero 02597; CHECK-NEXT:    # fallthrough-return2598  %s = getelementptr <2 x i32>, ptr %p, i32 12599  %v = load <2 x i32>, ptr %s2600  ret <2 x i32> %v2601}2602 2603define <2 x i64> @load_v2i64_from_numeric_address() {2604; CHECK-LABEL: load_v2i64_from_numeric_address:2605; CHECK:         .functype load_v2i64_from_numeric_address () -> (v128)2606; CHECK-NEXT:  # %bb.0:2607; CHECK-NEXT:    i32.const 02608; CHECK-NEXT:    v128.load 322609; CHECK-NEXT:    # fallthrough-return2610  %s = inttoptr i32 32 to ptr2611  %v = load <2 x i64>, ptr %s2612  ret <2 x i64> %v2613}2614 2615define <2 x i64> @load_splat_v2i64_from_numeric_address() {2616; CHECK-LABEL: load_splat_v2i64_from_numeric_address:2617; CHECK:         .functype load_splat_v2i64_from_numeric_address () -> (v128)2618; CHECK-NEXT:  # %bb.0:2619; CHECK-NEXT:    i32.const 02620; CHECK-NEXT:    v128.load64_splat 322621; CHECK-NEXT:    # fallthrough-return2622  %s = inttoptr i32 32 to ptr2623  %e = load i64, ptr %s2624  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02625  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2626  ret <2 x i64> %v22627}2628 2629define <2 x i64> @load_sext_v2i64_from_numeric_address() {2630; CHECK-LABEL: load_sext_v2i64_from_numeric_address:2631; CHECK:         .functype load_sext_v2i64_from_numeric_address () -> (v128)2632; CHECK-NEXT:  # %bb.0:2633; CHECK-NEXT:    i32.const 02634; CHECK-NEXT:    i64x2.load32x2_s 322635; CHECK-NEXT:    # fallthrough-return2636  %s = inttoptr i32 32 to ptr2637  %v = load <2 x i32>, ptr %s2638  %v2 = sext <2 x i32> %v to <2 x i64>2639  ret <2 x i64> %v22640}2641 2642define <2 x i64> @load_zext_v2i64_from_numeric_address() {2643; CHECK-LABEL: load_zext_v2i64_from_numeric_address:2644; CHECK:         .functype load_zext_v2i64_from_numeric_address () -> (v128)2645; CHECK-NEXT:  # %bb.0:2646; CHECK-NEXT:    i32.const 02647; CHECK-NEXT:    i64x2.load32x2_u 322648; CHECK-NEXT:    # fallthrough-return2649  %s = inttoptr i32 32 to ptr2650  %v = load <2 x i32>, ptr %s2651  %v2 = zext <2 x i32> %v to <2 x i64>2652  ret <2 x i64> %v22653}2654 2655define <2 x i32> @load_ext_v2i64_from_numeric_address() {2656; CHECK-LABEL: load_ext_v2i64_from_numeric_address:2657; CHECK:         .functype load_ext_v2i64_from_numeric_address () -> (v128)2658; CHECK-NEXT:  # %bb.0:2659; CHECK-NEXT:    i32.const 02660; CHECK-NEXT:    v128.load64_zero 322661; CHECK-NEXT:    # fallthrough-return2662  %s = inttoptr i32 32 to ptr2663  %v = load <2 x i32>, ptr %s2664  ret <2 x i32> %v2665}2666 2667@gv_v2i64 = global <2 x i64> <i64 42, i64 42>2668define <2 x i64> @load_v2i64_from_global_address() {2669; CHECK-LABEL: load_v2i64_from_global_address:2670; CHECK:         .functype load_v2i64_from_global_address () -> (v128)2671; CHECK-NEXT:  # %bb.0:2672; CHECK-NEXT:    i32.const 02673; CHECK-NEXT:    v128.load gv_v2i642674; CHECK-NEXT:    # fallthrough-return2675  %v = load <2 x i64>, ptr @gv_v2i642676  ret <2 x i64> %v2677}2678 2679@gv_i64 = global i64 422680define <2 x i64> @load_splat_v2i64_from_global_address() {2681; CHECK-LABEL: load_splat_v2i64_from_global_address:2682; CHECK:         .functype load_splat_v2i64_from_global_address () -> (v128)2683; CHECK-NEXT:  # %bb.0:2684; CHECK-NEXT:    i32.const 02685; CHECK-NEXT:    v128.load64_splat gv_i642686; CHECK-NEXT:    # fallthrough-return2687  %e = load i64, ptr @gv_i642688  %v1 = insertelement <2 x i64> undef, i64 %e, i32 02689  %v2 = shufflevector <2 x i64> %v1, <2 x i64> undef, <2 x i32> zeroinitializer2690  ret <2 x i64> %v22691}2692 2693@gv_v2i32 = global <2 x i32> <i32 42, i32 42>2694define <2 x i64> @load_sext_v2i64_from_global_address() {2695; CHECK-LABEL: load_sext_v2i64_from_global_address:2696; CHECK:         .functype load_sext_v2i64_from_global_address () -> (v128)2697; CHECK-NEXT:  # %bb.0:2698; CHECK-NEXT:    i32.const 02699; CHECK-NEXT:    i64x2.load32x2_s gv_v2i322700; CHECK-NEXT:    # fallthrough-return2701  %v = load <2 x i32>, ptr @gv_v2i322702  %v2 = sext <2 x i32> %v to <2 x i64>2703  ret <2 x i64> %v22704}2705 2706define <2 x i64> @load_zext_v2i64_from_global_address() {2707; CHECK-LABEL: load_zext_v2i64_from_global_address:2708; CHECK:         .functype load_zext_v2i64_from_global_address () -> (v128)2709; CHECK-NEXT:  # %bb.0:2710; CHECK-NEXT:    i32.const 02711; CHECK-NEXT:    i64x2.load32x2_u gv_v2i322712; CHECK-NEXT:    # fallthrough-return2713  %v = load <2 x i32>, ptr @gv_v2i322714  %v2 = zext <2 x i32> %v to <2 x i64>2715  ret <2 x i64> %v22716}2717 2718define <2 x i32> @load_ext_v2i64_from_global_address() {2719; CHECK-LABEL: load_ext_v2i64_from_global_address:2720; CHECK:         .functype load_ext_v2i64_from_global_address () -> (v128)2721; CHECK-NEXT:  # %bb.0:2722; CHECK-NEXT:    i32.const 02723; CHECK-NEXT:    v128.load64_zero gv_v2i322724; CHECK-NEXT:    # fallthrough-return2725  %v = load <2 x i32>, ptr @gv_v2i322726  ret <2 x i32> %v2727}2728 2729define void @store_v2i64(<2 x i64> %v, ptr %p) {2730; CHECK-LABEL: store_v2i64:2731; CHECK:         .functype store_v2i64 (v128, i32) -> ()2732; CHECK-NEXT:  # %bb.0:2733; CHECK-NEXT:    local.get 12734; CHECK-NEXT:    local.get 02735; CHECK-NEXT:    v128.store 02736; CHECK-NEXT:    # fallthrough-return2737  store <2 x i64> %v , ptr %p2738  ret void2739}2740 2741define void @store_v2i64_with_folded_offset(<2 x i64> %v, ptr %p) {2742; CHECK-LABEL: store_v2i64_with_folded_offset:2743; CHECK:         .functype store_v2i64_with_folded_offset (v128, i32) -> ()2744; CHECK-NEXT:  # %bb.0:2745; CHECK-NEXT:    local.get 12746; CHECK-NEXT:    local.get 02747; CHECK-NEXT:    v128.store 162748; CHECK-NEXT:    # fallthrough-return2749  %q = ptrtoint ptr %p to i322750  %r = add nuw i32 %q, 162751  %s = inttoptr i32 %r to ptr2752  store <2 x i64> %v , ptr %s2753  ret void2754}2755 2756define void @store_v2i64_with_folded_gep_offset(<2 x i64> %v, ptr %p) {2757; CHECK-LABEL: store_v2i64_with_folded_gep_offset:2758; CHECK:         .functype store_v2i64_with_folded_gep_offset (v128, i32) -> ()2759; CHECK-NEXT:  # %bb.0:2760; CHECK-NEXT:    local.get 12761; CHECK-NEXT:    local.get 02762; CHECK-NEXT:    v128.store 162763; CHECK-NEXT:    # fallthrough-return2764  %s = getelementptr inbounds <2 x i64>, ptr %p, i32 12765  store <2 x i64> %v , ptr %s2766  ret void2767}2768 2769define void @store_v2i64_with_unfolded_gep_negative_offset(<2 x i64> %v, ptr %p) {2770; CHECK-LABEL: store_v2i64_with_unfolded_gep_negative_offset:2771; CHECK:         .functype store_v2i64_with_unfolded_gep_negative_offset (v128, i32) -> ()2772; CHECK-NEXT:  # %bb.0:2773; CHECK-NEXT:    local.get 12774; CHECK-NEXT:    i32.const -162775; CHECK-NEXT:    i32.add2776; CHECK-NEXT:    local.get 02777; CHECK-NEXT:    v128.store 02778; CHECK-NEXT:    # fallthrough-return2779  %s = getelementptr inbounds <2 x i64>, ptr %p, i32 -12780  store <2 x i64> %v , ptr %s2781  ret void2782}2783 2784define void @store_v2i64_with_unfolded_offset(<2 x i64> %v, ptr %p) {2785; CHECK-LABEL: store_v2i64_with_unfolded_offset:2786; CHECK:         .functype store_v2i64_with_unfolded_offset (v128, i32) -> ()2787; CHECK-NEXT:  # %bb.0:2788; CHECK-NEXT:    local.get 12789; CHECK-NEXT:    i32.const 162790; CHECK-NEXT:    i32.add2791; CHECK-NEXT:    local.get 02792; CHECK-NEXT:    v128.store 02793; CHECK-NEXT:    # fallthrough-return2794  %q = ptrtoint ptr %p to i322795  %r = add nsw i32 %q, 162796  %s = inttoptr i32 %r to ptr2797  store <2 x i64> %v , ptr %s2798  ret void2799}2800 2801define void @store_v2i64_with_unfolded_gep_offset(<2 x i64> %v, ptr %p) {2802; CHECK-LABEL: store_v2i64_with_unfolded_gep_offset:2803; CHECK:         .functype store_v2i64_with_unfolded_gep_offset (v128, i32) -> ()2804; CHECK-NEXT:  # %bb.0:2805; CHECK-NEXT:    local.get 12806; CHECK-NEXT:    i32.const 162807; CHECK-NEXT:    i32.add2808; CHECK-NEXT:    local.get 02809; CHECK-NEXT:    v128.store 02810; CHECK-NEXT:    # fallthrough-return2811  %s = getelementptr <2 x i64>, ptr %p, i32 12812  store <2 x i64> %v , ptr %s2813  ret void2814}2815 2816define void @store_v2i64_to_numeric_address(<2 x i64> %v) {2817; CHECK-LABEL: store_v2i64_to_numeric_address:2818; CHECK:         .functype store_v2i64_to_numeric_address (v128) -> ()2819; CHECK-NEXT:  # %bb.0:2820; CHECK-NEXT:    i32.const 02821; CHECK-NEXT:    local.get 02822; CHECK-NEXT:    v128.store 322823; CHECK-NEXT:    # fallthrough-return2824  %s = inttoptr i32 32 to ptr2825  store <2 x i64> %v , ptr %s2826  ret void2827}2828 2829define void @store_v2i64_to_global_address(<2 x i64> %v) {2830; CHECK-LABEL: store_v2i64_to_global_address:2831; CHECK:         .functype store_v2i64_to_global_address (v128) -> ()2832; CHECK-NEXT:  # %bb.0:2833; CHECK-NEXT:    i32.const 02834; CHECK-NEXT:    local.get 02835; CHECK-NEXT:    v128.store gv_v2i642836; CHECK-NEXT:    # fallthrough-return2837  store <2 x i64> %v , ptr @gv_v2i642838  ret void2839}2840 2841; ==============================================================================2842; 4 x float2843; ==============================================================================2844define <4 x float> @load_v4f32(ptr %p) {2845; CHECK-LABEL: load_v4f32:2846; CHECK:         .functype load_v4f32 (i32) -> (v128)2847; CHECK-NEXT:  # %bb.0:2848; CHECK-NEXT:    local.get 02849; CHECK-NEXT:    v128.load 02850; CHECK-NEXT:    # fallthrough-return2851  %v = load <4 x float>, ptr %p2852  ret <4 x float> %v2853}2854 2855define <4 x float> @load_splat_v4f32(ptr %p) {2856; CHECK-LABEL: load_splat_v4f32:2857; CHECK:         .functype load_splat_v4f32 (i32) -> (v128)2858; CHECK-NEXT:  # %bb.0:2859; CHECK-NEXT:    local.get 02860; CHECK-NEXT:    v128.load32_splat 02861; CHECK-NEXT:    # fallthrough-return2862  %e = load float, ptr %p2863  %v1 = insertelement <4 x float> undef, float %e, i32 02864  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2865  ret <4 x float> %v22866}2867 2868define <4 x float> @load_v4f32_with_folded_offset(ptr %p) {2869; CHECK-LABEL: load_v4f32_with_folded_offset:2870; CHECK:         .functype load_v4f32_with_folded_offset (i32) -> (v128)2871; CHECK-NEXT:  # %bb.0:2872; CHECK-NEXT:    local.get 02873; CHECK-NEXT:    v128.load 162874; CHECK-NEXT:    # fallthrough-return2875  %q = ptrtoint ptr %p to i322876  %r = add nuw i32 %q, 162877  %s = inttoptr i32 %r to ptr2878  %v = load <4 x float>, ptr %s2879  ret <4 x float> %v2880}2881 2882define <4 x float> @load_splat_v4f32_with_folded_offset(ptr %p) {2883; CHECK-LABEL: load_splat_v4f32_with_folded_offset:2884; CHECK:         .functype load_splat_v4f32_with_folded_offset (i32) -> (v128)2885; CHECK-NEXT:  # %bb.0:2886; CHECK-NEXT:    local.get 02887; CHECK-NEXT:    v128.load32_splat 162888; CHECK-NEXT:    # fallthrough-return2889  %q = ptrtoint ptr %p to i322890  %r = add nuw i32 %q, 162891  %s = inttoptr i32 %r to ptr2892  %e = load float, ptr %s2893  %v1 = insertelement <4 x float> undef, float %e, i32 02894  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2895  ret <4 x float> %v22896}2897 2898define <4 x float> @load_v4f32_with_folded_gep_offset(ptr %p) {2899; CHECK-LABEL: load_v4f32_with_folded_gep_offset:2900; CHECK:         .functype load_v4f32_with_folded_gep_offset (i32) -> (v128)2901; CHECK-NEXT:  # %bb.0:2902; CHECK-NEXT:    local.get 02903; CHECK-NEXT:    v128.load 162904; CHECK-NEXT:    # fallthrough-return2905  %s = getelementptr inbounds <4 x float>, ptr %p, i32 12906  %v = load <4 x float>, ptr %s2907  ret <4 x float> %v2908}2909 2910define <4 x float> @load_splat_v4f32_with_folded_gep_offset(ptr %p) {2911; CHECK-LABEL: load_splat_v4f32_with_folded_gep_offset:2912; CHECK:         .functype load_splat_v4f32_with_folded_gep_offset (i32) -> (v128)2913; CHECK-NEXT:  # %bb.0:2914; CHECK-NEXT:    local.get 02915; CHECK-NEXT:    v128.load32_splat 42916; CHECK-NEXT:    # fallthrough-return2917  %s = getelementptr inbounds float, ptr %p, i32 12918  %e = load float, ptr %s2919  %v1 = insertelement <4 x float> undef, float %e, i32 02920  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2921  ret <4 x float> %v22922}2923 2924define <4 x float> @load_v4f32_with_unfolded_gep_negative_offset(ptr %p) {2925; CHECK-LABEL: load_v4f32_with_unfolded_gep_negative_offset:2926; CHECK:         .functype load_v4f32_with_unfolded_gep_negative_offset (i32) -> (v128)2927; CHECK-NEXT:  # %bb.0:2928; CHECK-NEXT:    local.get 02929; CHECK-NEXT:    i32.const -162930; CHECK-NEXT:    i32.add2931; CHECK-NEXT:    v128.load 02932; CHECK-NEXT:    # fallthrough-return2933  %s = getelementptr inbounds <4 x float>, ptr %p, i32 -12934  %v = load <4 x float>, ptr %s2935  ret <4 x float> %v2936}2937 2938define <4 x float> @load_splat_v4f32_with_unfolded_gep_negative_offset(ptr %p) {2939; CHECK-LABEL: load_splat_v4f32_with_unfolded_gep_negative_offset:2940; CHECK:         .functype load_splat_v4f32_with_unfolded_gep_negative_offset (i32) -> (v128)2941; CHECK-NEXT:  # %bb.0:2942; CHECK-NEXT:    local.get 02943; CHECK-NEXT:    i32.const -42944; CHECK-NEXT:    i32.add2945; CHECK-NEXT:    v128.load32_splat 02946; CHECK-NEXT:    # fallthrough-return2947  %s = getelementptr inbounds float, ptr %p, i32 -12948  %e = load float, ptr %s2949  %v1 = insertelement <4 x float> undef, float %e, i32 02950  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2951  ret <4 x float> %v22952}2953 2954define <4 x float> @load_v4f32_with_unfolded_offset(ptr %p) {2955; CHECK-LABEL: load_v4f32_with_unfolded_offset:2956; CHECK:         .functype load_v4f32_with_unfolded_offset (i32) -> (v128)2957; CHECK-NEXT:  # %bb.0:2958; CHECK-NEXT:    local.get 02959; CHECK-NEXT:    i32.const 162960; CHECK-NEXT:    i32.add2961; CHECK-NEXT:    v128.load 02962; CHECK-NEXT:    # fallthrough-return2963  %q = ptrtoint ptr %p to i322964  %r = add nsw i32 %q, 162965  %s = inttoptr i32 %r to ptr2966  %v = load <4 x float>, ptr %s2967  ret <4 x float> %v2968}2969 2970define <4 x float> @load_splat_v4f32_with_unfolded_offset(ptr %p) {2971; CHECK-LABEL: load_splat_v4f32_with_unfolded_offset:2972; CHECK:         .functype load_splat_v4f32_with_unfolded_offset (i32) -> (v128)2973; CHECK-NEXT:  # %bb.0:2974; CHECK-NEXT:    local.get 02975; CHECK-NEXT:    i32.const 162976; CHECK-NEXT:    i32.add2977; CHECK-NEXT:    v128.load32_splat 02978; CHECK-NEXT:    # fallthrough-return2979  %q = ptrtoint ptr %p to i322980  %r = add nsw i32 %q, 162981  %s = inttoptr i32 %r to ptr2982  %e = load float, ptr %s2983  %v1 = insertelement <4 x float> undef, float %e, i32 02984  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer2985  ret <4 x float> %v22986}2987 2988define <4 x float> @load_v4f32_with_unfolded_gep_offset(ptr %p) {2989; CHECK-LABEL: load_v4f32_with_unfolded_gep_offset:2990; CHECK:         .functype load_v4f32_with_unfolded_gep_offset (i32) -> (v128)2991; CHECK-NEXT:  # %bb.0:2992; CHECK-NEXT:    local.get 02993; CHECK-NEXT:    i32.const 162994; CHECK-NEXT:    i32.add2995; CHECK-NEXT:    v128.load 02996; CHECK-NEXT:    # fallthrough-return2997  %s = getelementptr <4 x float>, ptr %p, i32 12998  %v = load <4 x float>, ptr %s2999  ret <4 x float> %v3000}3001 3002define <4 x float> @load_splat_v4f32_with_unfolded_gep_offset(ptr %p) {3003; CHECK-LABEL: load_splat_v4f32_with_unfolded_gep_offset:3004; CHECK:         .functype load_splat_v4f32_with_unfolded_gep_offset (i32) -> (v128)3005; CHECK-NEXT:  # %bb.0:3006; CHECK-NEXT:    local.get 03007; CHECK-NEXT:    i32.const 43008; CHECK-NEXT:    i32.add3009; CHECK-NEXT:    v128.load32_splat 03010; CHECK-NEXT:    # fallthrough-return3011  %s = getelementptr float, ptr %p, i32 13012  %e = load float, ptr %s3013  %v1 = insertelement <4 x float> undef, float %e, i32 03014  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer3015  ret <4 x float> %v23016}3017 3018define <4 x float> @load_v4f32_from_numeric_address() {3019; CHECK-LABEL: load_v4f32_from_numeric_address:3020; CHECK:         .functype load_v4f32_from_numeric_address () -> (v128)3021; CHECK-NEXT:  # %bb.0:3022; CHECK-NEXT:    i32.const 03023; CHECK-NEXT:    v128.load 323024; CHECK-NEXT:    # fallthrough-return3025  %s = inttoptr i32 32 to ptr3026  %v = load <4 x float>, ptr %s3027  ret <4 x float> %v3028}3029 3030define <4 x float> @load_splat_v4f32_from_numeric_address() {3031; CHECK-LABEL: load_splat_v4f32_from_numeric_address:3032; CHECK:         .functype load_splat_v4f32_from_numeric_address () -> (v128)3033; CHECK-NEXT:  # %bb.0:3034; CHECK-NEXT:    i32.const 03035; CHECK-NEXT:    v128.load32_splat 323036; CHECK-NEXT:    # fallthrough-return3037  %s = inttoptr i32 32 to ptr3038  %e = load float, ptr %s3039  %v1 = insertelement <4 x float> undef, float %e, i32 03040  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer3041  ret <4 x float> %v23042}3043 3044@gv_v4f32 = global <4 x float> <float 42., float 42., float 42., float 42.>3045define <4 x float> @load_v4f32_from_global_address() {3046; CHECK-LABEL: load_v4f32_from_global_address:3047; CHECK:         .functype load_v4f32_from_global_address () -> (v128)3048; CHECK-NEXT:  # %bb.0:3049; CHECK-NEXT:    i32.const 03050; CHECK-NEXT:    v128.load gv_v4f323051; CHECK-NEXT:    # fallthrough-return3052  %v = load <4 x float>, ptr @gv_v4f323053  ret <4 x float> %v3054}3055 3056@gv_f32 = global float 42.3057define <4 x float> @load_splat_v4f32_from_global_address() {3058; CHECK-LABEL: load_splat_v4f32_from_global_address:3059; CHECK:         .functype load_splat_v4f32_from_global_address () -> (v128)3060; CHECK-NEXT:  # %bb.0:3061; CHECK-NEXT:    i32.const 03062; CHECK-NEXT:    v128.load32_splat gv_f323063; CHECK-NEXT:    # fallthrough-return3064  %e = load float, ptr @gv_f323065  %v1 = insertelement <4 x float> undef, float %e, i32 03066  %v2 = shufflevector <4 x float> %v1, <4 x float> undef, <4 x i32> zeroinitializer3067  ret <4 x float> %v23068}3069 3070define void @store_v4f32(<4 x float> %v, ptr %p) {3071; CHECK-LABEL: store_v4f32:3072; CHECK:         .functype store_v4f32 (v128, i32) -> ()3073; CHECK-NEXT:  # %bb.0:3074; CHECK-NEXT:    local.get 13075; CHECK-NEXT:    local.get 03076; CHECK-NEXT:    v128.store 03077; CHECK-NEXT:    # fallthrough-return3078  store <4 x float> %v , ptr %p3079  ret void3080}3081 3082define void @store_v4f32_with_folded_offset(<4 x float> %v, ptr %p) {3083; CHECK-LABEL: store_v4f32_with_folded_offset:3084; CHECK:         .functype store_v4f32_with_folded_offset (v128, i32) -> ()3085; CHECK-NEXT:  # %bb.0:3086; CHECK-NEXT:    local.get 13087; CHECK-NEXT:    local.get 03088; CHECK-NEXT:    v128.store 163089; CHECK-NEXT:    # fallthrough-return3090  %q = ptrtoint ptr %p to i323091  %r = add nuw i32 %q, 163092  %s = inttoptr i32 %r to ptr3093  store <4 x float> %v , ptr %s3094  ret void3095}3096 3097define void @store_v4f32_with_folded_gep_offset(<4 x float> %v, ptr %p) {3098; CHECK-LABEL: store_v4f32_with_folded_gep_offset:3099; CHECK:         .functype store_v4f32_with_folded_gep_offset (v128, i32) -> ()3100; CHECK-NEXT:  # %bb.0:3101; CHECK-NEXT:    local.get 13102; CHECK-NEXT:    local.get 03103; CHECK-NEXT:    v128.store 163104; CHECK-NEXT:    # fallthrough-return3105  %s = getelementptr inbounds <4 x float>, ptr %p, i32 13106  store <4 x float> %v , ptr %s3107  ret void3108}3109 3110define void @store_v4f32_with_unfolded_gep_negative_offset(<4 x float> %v, ptr %p) {3111; CHECK-LABEL: store_v4f32_with_unfolded_gep_negative_offset:3112; CHECK:         .functype store_v4f32_with_unfolded_gep_negative_offset (v128, i32) -> ()3113; CHECK-NEXT:  # %bb.0:3114; CHECK-NEXT:    local.get 13115; CHECK-NEXT:    i32.const -163116; CHECK-NEXT:    i32.add3117; CHECK-NEXT:    local.get 03118; CHECK-NEXT:    v128.store 03119; CHECK-NEXT:    # fallthrough-return3120  %s = getelementptr inbounds <4 x float>, ptr %p, i32 -13121  store <4 x float> %v , ptr %s3122  ret void3123}3124 3125define void @store_v4f32_with_unfolded_offset(<4 x float> %v, ptr %p) {3126; CHECK-LABEL: store_v4f32_with_unfolded_offset:3127; CHECK:         .functype store_v4f32_with_unfolded_offset (v128, i32) -> ()3128; CHECK-NEXT:  # %bb.0:3129; CHECK-NEXT:    local.get 13130; CHECK-NEXT:    i32.const 163131; CHECK-NEXT:    i32.add3132; CHECK-NEXT:    local.get 03133; CHECK-NEXT:    v128.store 03134; CHECK-NEXT:    # fallthrough-return3135  %q = ptrtoint ptr %p to i323136  %r = add nsw i32 %q, 163137  %s = inttoptr i32 %r to ptr3138  store <4 x float> %v , ptr %s3139  ret void3140}3141 3142define void @store_v4f32_with_unfolded_gep_offset(<4 x float> %v, ptr %p) {3143; CHECK-LABEL: store_v4f32_with_unfolded_gep_offset:3144; CHECK:         .functype store_v4f32_with_unfolded_gep_offset (v128, i32) -> ()3145; CHECK-NEXT:  # %bb.0:3146; CHECK-NEXT:    local.get 13147; CHECK-NEXT:    i32.const 163148; CHECK-NEXT:    i32.add3149; CHECK-NEXT:    local.get 03150; CHECK-NEXT:    v128.store 03151; CHECK-NEXT:    # fallthrough-return3152  %s = getelementptr <4 x float>, ptr %p, i32 13153  store <4 x float> %v , ptr %s3154  ret void3155}3156 3157define void @store_v4f32_to_numeric_address(<4 x float> %v) {3158; CHECK-LABEL: store_v4f32_to_numeric_address:3159; CHECK:         .functype store_v4f32_to_numeric_address (v128) -> ()3160; CHECK-NEXT:  # %bb.0:3161; CHECK-NEXT:    i32.const 03162; CHECK-NEXT:    local.get 03163; CHECK-NEXT:    v128.store 323164; CHECK-NEXT:    # fallthrough-return3165  %s = inttoptr i32 32 to ptr3166  store <4 x float> %v , ptr %s3167  ret void3168}3169 3170define void @store_v4f32_to_global_address(<4 x float> %v) {3171; CHECK-LABEL: store_v4f32_to_global_address:3172; CHECK:         .functype store_v4f32_to_global_address (v128) -> ()3173; CHECK-NEXT:  # %bb.0:3174; CHECK-NEXT:    i32.const 03175; CHECK-NEXT:    local.get 03176; CHECK-NEXT:    v128.store gv_v4f323177; CHECK-NEXT:    # fallthrough-return3178  store <4 x float> %v , ptr @gv_v4f323179  ret void3180}3181 3182; ==============================================================================3183; 2 x double3184; ==============================================================================3185define <2 x double> @load_v2f64(ptr %p) {3186; CHECK-LABEL: load_v2f64:3187; CHECK:         .functype load_v2f64 (i32) -> (v128)3188; CHECK-NEXT:  # %bb.0:3189; CHECK-NEXT:    local.get 03190; CHECK-NEXT:    v128.load 03191; CHECK-NEXT:    # fallthrough-return3192  %v = load <2 x double>, ptr %p3193  ret <2 x double> %v3194}3195 3196define <2 x double> @load_splat_v2f64(ptr %p) {3197; CHECK-LABEL: load_splat_v2f64:3198; CHECK:         .functype load_splat_v2f64 (i32) -> (v128)3199; CHECK-NEXT:  # %bb.0:3200; CHECK-NEXT:    local.get 03201; CHECK-NEXT:    v128.load64_splat 03202; CHECK-NEXT:    # fallthrough-return3203  %e = load double, ptr %p3204  %v1 = insertelement <2 x double> undef, double %e, i32 03205  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3206  ret <2 x double> %v23207}3208 3209define <2 x double> @load_promote_v2f64(ptr %p) {3210; CHECK-LABEL: load_promote_v2f64:3211; CHECK:         .functype load_promote_v2f64 (i32) -> (v128)3212; CHECK-NEXT:  # %bb.0:3213; CHECK-NEXT:    local.get 03214; CHECK-NEXT:    v128.load64_zero 03215; CHECK-NEXT:    f64x2.promote_low_f32x43216; CHECK-NEXT:    # fallthrough-return3217  %e = load <2 x float>, ptr %p3218  %v = fpext <2 x float> %e to <2 x double>3219  ret <2 x double> %v3220}3221 3222define <2 x double> @load_v2f64_with_folded_offset(ptr %p) {3223; CHECK-LABEL: load_v2f64_with_folded_offset:3224; CHECK:         .functype load_v2f64_with_folded_offset (i32) -> (v128)3225; CHECK-NEXT:  # %bb.0:3226; CHECK-NEXT:    local.get 03227; CHECK-NEXT:    v128.load 163228; CHECK-NEXT:    # fallthrough-return3229  %q = ptrtoint ptr %p to i323230  %r = add nuw i32 %q, 163231  %s = inttoptr i32 %r to ptr3232  %v = load <2 x double>, ptr %s3233  ret <2 x double> %v3234}3235 3236define <2 x double> @load_splat_v2f64_with_folded_offset(ptr %p) {3237; CHECK-LABEL: load_splat_v2f64_with_folded_offset:3238; CHECK:         .functype load_splat_v2f64_with_folded_offset (i32) -> (v128)3239; CHECK-NEXT:  # %bb.0:3240; CHECK-NEXT:    local.get 03241; CHECK-NEXT:    v128.load64_splat 163242; CHECK-NEXT:    # fallthrough-return3243  %q = ptrtoint ptr %p to i323244  %r = add nuw i32 %q, 163245  %s = inttoptr i32 %r to ptr3246  %e = load double, ptr %s3247  %v1 = insertelement <2 x double> undef, double %e, i32 03248  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3249  ret <2 x double> %v23250}3251 3252define <2 x double> @load_promote_v2f64_with_folded_offset(ptr %p) {3253; CHECK-LABEL: load_promote_v2f64_with_folded_offset:3254; CHECK:         .functype load_promote_v2f64_with_folded_offset (i32) -> (v128)3255; CHECK-NEXT:  # %bb.0:3256; CHECK-NEXT:    local.get 03257; CHECK-NEXT:    i32.const 163258; CHECK-NEXT:    i32.add3259; CHECK-NEXT:    v128.load64_zero 03260; CHECK-NEXT:    f64x2.promote_low_f32x43261; CHECK-NEXT:    # fallthrough-return3262  %q = ptrtoint ptr %p to i323263  %r = add nuw i32 %q, 163264  %s = inttoptr i32 %r to ptr3265  %e = load <2 x float>, ptr %s3266  %v = fpext <2 x float> %e to <2 x double>3267  ret <2 x double> %v3268}3269 3270define <2 x double> @load_v2f64_with_folded_gep_offset(ptr %p) {3271; CHECK-LABEL: load_v2f64_with_folded_gep_offset:3272; CHECK:         .functype load_v2f64_with_folded_gep_offset (i32) -> (v128)3273; CHECK-NEXT:  # %bb.0:3274; CHECK-NEXT:    local.get 03275; CHECK-NEXT:    v128.load 163276; CHECK-NEXT:    # fallthrough-return3277  %s = getelementptr inbounds <2 x double>, ptr %p, i32 13278  %v = load <2 x double>, ptr %s3279  ret <2 x double> %v3280}3281 3282define <2 x double> @load_splat_v2f64_with_folded_gep_offset(ptr %p) {3283; CHECK-LABEL: load_splat_v2f64_with_folded_gep_offset:3284; CHECK:         .functype load_splat_v2f64_with_folded_gep_offset (i32) -> (v128)3285; CHECK-NEXT:  # %bb.0:3286; CHECK-NEXT:    local.get 03287; CHECK-NEXT:    v128.load64_splat 83288; CHECK-NEXT:    # fallthrough-return3289  %s = getelementptr inbounds double, ptr %p, i32 13290  %e = load double, ptr %s3291  %v1 = insertelement <2 x double> undef, double %e, i32 03292  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3293  ret <2 x double> %v23294}3295 3296define <2 x double> @load_promote_v2f64_with_folded_gep_offset(ptr %p) {3297; CHECK-LABEL: load_promote_v2f64_with_folded_gep_offset:3298; CHECK:         .functype load_promote_v2f64_with_folded_gep_offset (i32) -> (v128)3299; CHECK-NEXT:  # %bb.0:3300; CHECK-NEXT:    local.get 03301; CHECK-NEXT:    i32.const 83302; CHECK-NEXT:    i32.add3303; CHECK-NEXT:    v128.load64_zero 03304; CHECK-NEXT:    f64x2.promote_low_f32x43305; CHECK-NEXT:    # fallthrough-return3306  %s = getelementptr inbounds <2 x float>, ptr %p, i32 13307  %e = load <2 x float>, ptr %s3308  %v = fpext <2 x float> %e to <2 x double>3309  ret <2 x double> %v3310}3311 3312define <2 x double> @load_v2f64_with_unfolded_gep_negative_offset(ptr %p) {3313; CHECK-LABEL: load_v2f64_with_unfolded_gep_negative_offset:3314; CHECK:         .functype load_v2f64_with_unfolded_gep_negative_offset (i32) -> (v128)3315; CHECK-NEXT:  # %bb.0:3316; CHECK-NEXT:    local.get 03317; CHECK-NEXT:    i32.const -163318; CHECK-NEXT:    i32.add3319; CHECK-NEXT:    v128.load 03320; CHECK-NEXT:    # fallthrough-return3321  %s = getelementptr inbounds <2 x double>, ptr %p, i32 -13322  %v = load <2 x double>, ptr %s3323  ret <2 x double> %v3324}3325 3326define <2 x double> @load_splat_v2f64_with_unfolded_gep_negative_offset(ptr %p) {3327; CHECK-LABEL: load_splat_v2f64_with_unfolded_gep_negative_offset:3328; CHECK:         .functype load_splat_v2f64_with_unfolded_gep_negative_offset (i32) -> (v128)3329; CHECK-NEXT:  # %bb.0:3330; CHECK-NEXT:    local.get 03331; CHECK-NEXT:    i32.const -83332; CHECK-NEXT:    i32.add3333; CHECK-NEXT:    v128.load64_splat 03334; CHECK-NEXT:    # fallthrough-return3335  %s = getelementptr inbounds double, ptr %p, i32 -13336  %e = load double, ptr %s3337  %v1 = insertelement <2 x double> undef, double %e, i32 03338  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3339  ret <2 x double> %v23340}3341 3342define <2 x double> @load_promote_v2f64_with_unfolded_gep_negative_offset(ptr %p) {3343; CHECK-LABEL: load_promote_v2f64_with_unfolded_gep_negative_offset:3344; CHECK:         .functype load_promote_v2f64_with_unfolded_gep_negative_offset (i32) -> (v128)3345; CHECK-NEXT:  # %bb.0:3346; CHECK-NEXT:    local.get 03347; CHECK-NEXT:    i32.const -83348; CHECK-NEXT:    i32.add3349; CHECK-NEXT:    v128.load64_zero 03350; CHECK-NEXT:    f64x2.promote_low_f32x43351; CHECK-NEXT:    # fallthrough-return3352  %s = getelementptr inbounds <2 x float>, ptr %p, i32 -13353  %e = load <2 x float>, ptr %s3354  %v = fpext <2 x float> %e to <2 x double>3355  ret <2 x double> %v3356}3357 3358define <2 x double> @load_v2f64_with_unfolded_offset(ptr %p) {3359; CHECK-LABEL: load_v2f64_with_unfolded_offset:3360; CHECK:         .functype load_v2f64_with_unfolded_offset (i32) -> (v128)3361; CHECK-NEXT:  # %bb.0:3362; CHECK-NEXT:    local.get 03363; CHECK-NEXT:    i32.const 163364; CHECK-NEXT:    i32.add3365; CHECK-NEXT:    v128.load 03366; CHECK-NEXT:    # fallthrough-return3367  %q = ptrtoint ptr %p to i323368  %r = add nsw i32 %q, 163369  %s = inttoptr i32 %r to ptr3370  %v = load <2 x double>, ptr %s3371  ret <2 x double> %v3372}3373 3374define <2 x double> @load_splat_v2f64_with_unfolded_offset(ptr %p) {3375; CHECK-LABEL: load_splat_v2f64_with_unfolded_offset:3376; CHECK:         .functype load_splat_v2f64_with_unfolded_offset (i32) -> (v128)3377; CHECK-NEXT:  # %bb.0:3378; CHECK-NEXT:    local.get 03379; CHECK-NEXT:    i32.const 163380; CHECK-NEXT:    i32.add3381; CHECK-NEXT:    v128.load64_splat 03382; CHECK-NEXT:    # fallthrough-return3383  %q = ptrtoint ptr %p to i323384  %r = add nsw i32 %q, 163385  %s = inttoptr i32 %r to ptr3386  %e = load double, ptr %s3387  %v1 = insertelement <2 x double> undef, double %e, i32 03388  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3389  ret <2 x double> %v23390}3391 3392define <2 x double> @load_promote_v2f64_with_unfolded_offset(ptr %p) {3393; CHECK-LABEL: load_promote_v2f64_with_unfolded_offset:3394; CHECK:         .functype load_promote_v2f64_with_unfolded_offset (i32) -> (v128)3395; CHECK-NEXT:  # %bb.0:3396; CHECK-NEXT:    local.get 03397; CHECK-NEXT:    i32.const 163398; CHECK-NEXT:    i32.add3399; CHECK-NEXT:    v128.load64_zero 03400; CHECK-NEXT:    f64x2.promote_low_f32x43401; CHECK-NEXT:    # fallthrough-return3402  %q = ptrtoint ptr %p to i323403  %r = add nsw i32 %q, 163404  %s = inttoptr i32 %r to ptr3405  %e = load <2 x float>, ptr %s3406  %v = fpext <2 x float> %e to <2 x double>3407  ret <2 x double> %v3408}3409 3410define <2 x double> @load_v2f64_with_unfolded_gep_offset(ptr %p) {3411; CHECK-LABEL: load_v2f64_with_unfolded_gep_offset:3412; CHECK:         .functype load_v2f64_with_unfolded_gep_offset (i32) -> (v128)3413; CHECK-NEXT:  # %bb.0:3414; CHECK-NEXT:    local.get 03415; CHECK-NEXT:    i32.const 163416; CHECK-NEXT:    i32.add3417; CHECK-NEXT:    v128.load 03418; CHECK-NEXT:    # fallthrough-return3419  %s = getelementptr <2 x double>, ptr %p, i32 13420  %v = load <2 x double>, ptr %s3421  ret <2 x double> %v3422}3423 3424define <2 x double> @load_splat_v2f64_with_unfolded_gep_offset(ptr %p) {3425; CHECK-LABEL: load_splat_v2f64_with_unfolded_gep_offset:3426; CHECK:         .functype load_splat_v2f64_with_unfolded_gep_offset (i32) -> (v128)3427; CHECK-NEXT:  # %bb.0:3428; CHECK-NEXT:    local.get 03429; CHECK-NEXT:    i32.const 83430; CHECK-NEXT:    i32.add3431; CHECK-NEXT:    v128.load64_splat 03432; CHECK-NEXT:    # fallthrough-return3433  %s = getelementptr double, ptr %p, i32 13434  %e = load double, ptr %s3435  %v1 = insertelement <2 x double> undef, double %e, i32 03436  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3437  ret <2 x double> %v23438}3439 3440define <2 x double> @load_promote_v2f64_with_unfolded_gep_offset(ptr %p) {3441; CHECK-LABEL: load_promote_v2f64_with_unfolded_gep_offset:3442; CHECK:         .functype load_promote_v2f64_with_unfolded_gep_offset (i32) -> (v128)3443; CHECK-NEXT:  # %bb.0:3444; CHECK-NEXT:    local.get 03445; CHECK-NEXT:    i32.const 83446; CHECK-NEXT:    i32.add3447; CHECK-NEXT:    v128.load64_zero 03448; CHECK-NEXT:    f64x2.promote_low_f32x43449; CHECK-NEXT:    # fallthrough-return3450  %s = getelementptr <2 x float>, ptr %p, i32 13451  %e = load <2 x float>, ptr %s3452  %v = fpext <2 x float> %e to <2 x double>3453  ret <2 x double> %v3454}3455 3456define <2 x double> @load_v2f64_from_numeric_address() {3457; CHECK-LABEL: load_v2f64_from_numeric_address:3458; CHECK:         .functype load_v2f64_from_numeric_address () -> (v128)3459; CHECK-NEXT:  # %bb.0:3460; CHECK-NEXT:    i32.const 03461; CHECK-NEXT:    v128.load 323462; CHECK-NEXT:    # fallthrough-return3463  %s = inttoptr i32 32 to ptr3464  %v = load <2 x double>, ptr %s3465  ret <2 x double> %v3466}3467 3468define <2 x double> @load_splat_v2f64_from_numeric_address() {3469; CHECK-LABEL: load_splat_v2f64_from_numeric_address:3470; CHECK:         .functype load_splat_v2f64_from_numeric_address () -> (v128)3471; CHECK-NEXT:  # %bb.0:3472; CHECK-NEXT:    i32.const 03473; CHECK-NEXT:    v128.load64_splat 323474; CHECK-NEXT:    # fallthrough-return3475  %s = inttoptr i32 32 to ptr3476  %e = load double, ptr %s3477  %v1 = insertelement <2 x double> undef, double %e, i32 03478  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3479  ret <2 x double> %v23480}3481 3482define <2 x double> @load_promote_v2f64_from_numeric_address() {3483; CHECK-LABEL: load_promote_v2f64_from_numeric_address:3484; CHECK:         .functype load_promote_v2f64_from_numeric_address () -> (v128)3485; CHECK-NEXT:  # %bb.0:3486; CHECK-NEXT:    i32.const 323487; CHECK-NEXT:    v128.load64_zero 03488; CHECK-NEXT:    f64x2.promote_low_f32x43489; CHECK-NEXT:    # fallthrough-return3490  %s = inttoptr i32 32 to ptr3491  %e = load <2 x float>, ptr %s3492  %v = fpext <2 x float> %e to <2 x double>3493  ret <2 x double> %v3494}3495 3496@gv_v2f64 = global <2 x double> <double 42., double 42.>3497define <2 x double> @load_v2f64_from_global_address() {3498; CHECK-LABEL: load_v2f64_from_global_address:3499; CHECK:         .functype load_v2f64_from_global_address () -> (v128)3500; CHECK-NEXT:  # %bb.0:3501; CHECK-NEXT:    i32.const 03502; CHECK-NEXT:    v128.load gv_v2f643503; CHECK-NEXT:    # fallthrough-return3504  %v = load <2 x double>, ptr @gv_v2f643505  ret <2 x double> %v3506}3507 3508@gv_f64 = global double 42.3509define <2 x double> @load_splat_v2f64_from_global_address() {3510; CHECK-LABEL: load_splat_v2f64_from_global_address:3511; CHECK:         .functype load_splat_v2f64_from_global_address () -> (v128)3512; CHECK-NEXT:  # %bb.0:3513; CHECK-NEXT:    i32.const 03514; CHECK-NEXT:    v128.load64_splat gv_f643515; CHECK-NEXT:    # fallthrough-return3516  %e = load double, ptr @gv_f643517  %v1 = insertelement <2 x double> undef, double %e, i32 03518  %v2 = shufflevector <2 x double> %v1, <2 x double> undef, <2 x i32> zeroinitializer3519  ret <2 x double> %v23520}3521 3522@gv_v2f32 = global <2 x float> <float 42., float 42.>3523define <2 x double> @load_promote_v2f64_from_global_address() {3524; CHECK-LABEL: load_promote_v2f64_from_global_address:3525; CHECK:         .functype load_promote_v2f64_from_global_address () -> (v128)3526; CHECK-NEXT:  # %bb.0:3527; CHECK-NEXT:    i32.const gv_v2f323528; CHECK-NEXT:    v128.load64_zero 03529; CHECK-NEXT:    f64x2.promote_low_f32x43530; CHECK-NEXT:    # fallthrough-return3531  %e = load <2 x float>, ptr @gv_v2f323532  %v = fpext <2 x float> %e to <2 x double>3533  ret <2 x double> %v3534}3535 3536define void @store_v2f64(<2 x double> %v, ptr %p) {3537; CHECK-LABEL: store_v2f64:3538; CHECK:         .functype store_v2f64 (v128, i32) -> ()3539; CHECK-NEXT:  # %bb.0:3540; CHECK-NEXT:    local.get 13541; CHECK-NEXT:    local.get 03542; CHECK-NEXT:    v128.store 03543; CHECK-NEXT:    # fallthrough-return3544  store <2 x double> %v , ptr %p3545  ret void3546}3547 3548define void @store_v2f64_with_folded_offset(<2 x double> %v, ptr %p) {3549; CHECK-LABEL: store_v2f64_with_folded_offset:3550; CHECK:         .functype store_v2f64_with_folded_offset (v128, i32) -> ()3551; CHECK-NEXT:  # %bb.0:3552; CHECK-NEXT:    local.get 13553; CHECK-NEXT:    local.get 03554; CHECK-NEXT:    v128.store 163555; CHECK-NEXT:    # fallthrough-return3556  %q = ptrtoint ptr %p to i323557  %r = add nuw i32 %q, 163558  %s = inttoptr i32 %r to ptr3559  store <2 x double> %v , ptr %s3560  ret void3561}3562 3563define void @store_v2f64_with_folded_gep_offset(<2 x double> %v, ptr %p) {3564; CHECK-LABEL: store_v2f64_with_folded_gep_offset:3565; CHECK:         .functype store_v2f64_with_folded_gep_offset (v128, i32) -> ()3566; CHECK-NEXT:  # %bb.0:3567; CHECK-NEXT:    local.get 13568; CHECK-NEXT:    local.get 03569; CHECK-NEXT:    v128.store 163570; CHECK-NEXT:    # fallthrough-return3571  %s = getelementptr inbounds <2 x double>, ptr %p, i32 13572  store <2 x double> %v , ptr %s3573  ret void3574}3575 3576define void @store_v2f64_with_unfolded_gep_negative_offset(<2 x double> %v, ptr %p) {3577; CHECK-LABEL: store_v2f64_with_unfolded_gep_negative_offset:3578; CHECK:         .functype store_v2f64_with_unfolded_gep_negative_offset (v128, i32) -> ()3579; CHECK-NEXT:  # %bb.0:3580; CHECK-NEXT:    local.get 13581; CHECK-NEXT:    i32.const -163582; CHECK-NEXT:    i32.add3583; CHECK-NEXT:    local.get 03584; CHECK-NEXT:    v128.store 03585; CHECK-NEXT:    # fallthrough-return3586  %s = getelementptr inbounds <2 x double>, ptr %p, i32 -13587  store <2 x double> %v , ptr %s3588  ret void3589}3590 3591define void @store_v2f64_with_unfolded_offset(<2 x double> %v, ptr %p) {3592; CHECK-LABEL: store_v2f64_with_unfolded_offset:3593; CHECK:         .functype store_v2f64_with_unfolded_offset (v128, i32) -> ()3594; CHECK-NEXT:  # %bb.0:3595; CHECK-NEXT:    local.get 13596; CHECK-NEXT:    i32.const 163597; CHECK-NEXT:    i32.add3598; CHECK-NEXT:    local.get 03599; CHECK-NEXT:    v128.store 03600; CHECK-NEXT:    # fallthrough-return3601  %q = ptrtoint ptr %p to i323602  %r = add nsw i32 %q, 163603  %s = inttoptr i32 %r to ptr3604  store <2 x double> %v , ptr %s3605  ret void3606}3607 3608define void @store_v2f64_with_unfolded_gep_offset(<2 x double> %v, ptr %p) {3609; CHECK-LABEL: store_v2f64_with_unfolded_gep_offset:3610; CHECK:         .functype store_v2f64_with_unfolded_gep_offset (v128, i32) -> ()3611; CHECK-NEXT:  # %bb.0:3612; CHECK-NEXT:    local.get 13613; CHECK-NEXT:    i32.const 163614; CHECK-NEXT:    i32.add3615; CHECK-NEXT:    local.get 03616; CHECK-NEXT:    v128.store 03617; CHECK-NEXT:    # fallthrough-return3618  %s = getelementptr <2 x double>, ptr %p, i32 13619  store <2 x double> %v , ptr %s3620  ret void3621}3622 3623define void @store_v2f64_to_numeric_address(<2 x double> %v) {3624; CHECK-LABEL: store_v2f64_to_numeric_address:3625; CHECK:         .functype store_v2f64_to_numeric_address (v128) -> ()3626; CHECK-NEXT:  # %bb.0:3627; CHECK-NEXT:    i32.const 03628; CHECK-NEXT:    local.get 03629; CHECK-NEXT:    v128.store 323630; CHECK-NEXT:    # fallthrough-return3631  %s = inttoptr i32 32 to ptr3632  store <2 x double> %v , ptr %s3633  ret void3634}3635 3636define void @store_v2f64_to_global_address(<2 x double> %v) {3637; CHECK-LABEL: store_v2f64_to_global_address:3638; CHECK:         .functype store_v2f64_to_global_address (v128) -> ()3639; CHECK-NEXT:  # %bb.0:3640; CHECK-NEXT:    i32.const 03641; CHECK-NEXT:    local.get 03642; CHECK-NEXT:    v128.store gv_v2f643643; CHECK-NEXT:    # fallthrough-return3644  store <2 x double> %v , ptr @gv_v2f643645  ret void3646}3647