brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.4 KiB · a499354 Raw
537 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s3 4; Test that the logic to choose between v128.const vector5; initialization and splat vector initialization and to optimize the6; choice of splat value works correctly.7 8target triple = "wasm32-unknown-unknown"9 10define <8 x i16> @same_const_one_replaced_i16x8(i16 %x) {11; CHECK-LABEL: same_const_one_replaced_i16x8:12; CHECK:         .functype same_const_one_replaced_i16x8 (i32) -> (v128)13; CHECK-NEXT:  # %bb.0:14; CHECK-NEXT:    v128.const $push0=, 42, 42, 42, 42, 42, 0, 42, 4215; CHECK-NEXT:    i16x8.replace_lane $push1=, $pop0, 5, $016; CHECK-NEXT:    return $pop117  %v = insertelement18    <8 x i16> <i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42, i16 42>,19    i16 %x,20    i32 521  ret <8 x i16> %v22}23 24define <8 x i16> @different_const_one_replaced_i16x8(i16 %x) {25; CHECK-LABEL: different_const_one_replaced_i16x8:26; CHECK:         .functype different_const_one_replaced_i16x8 (i32) -> (v128)27; CHECK-NEXT:  # %bb.0:28; CHECK-NEXT:    v128.const $push0=, 1, 65534, 3, 65532, 5, 0, 7, 6552829; CHECK-NEXT:    i16x8.replace_lane $push1=, $pop0, 5, $030; CHECK-NEXT:    return $pop131  %v = insertelement32    <8 x i16> <i16 1, i16 -2, i16 3, i16 -4, i16 5, i16 -6, i16 7, i16 -8>,33    i16 %x,34    i32 535  ret <8 x i16> %v36}37 38define <4 x float> @same_const_one_replaced_f32x4(float %x) {39; CHECK-LABEL: same_const_one_replaced_f32x4:40; CHECK:         .functype same_const_one_replaced_f32x4 (f32) -> (v128)41; CHECK-NEXT:  # %bb.0:42; CHECK-NEXT:    v128.const $push0=, 0x1.5p5, 0x1.5p5, 0x0p0, 0x1.5p543; CHECK-NEXT:    f32x4.replace_lane $push1=, $pop0, 2, $044; CHECK-NEXT:    return $pop145  %v = insertelement46    <4 x float> <float 42., float 42., float 42., float 42.>,47    float %x,48    i32 249  ret <4 x float> %v50}51 52define <4 x float> @different_const_one_replaced_f32x4(float %x) {53; CHECK-LABEL: different_const_one_replaced_f32x4:54; CHECK:         .functype different_const_one_replaced_f32x4 (f32) -> (v128)55; CHECK-NEXT:  # %bb.0:56; CHECK-NEXT:    v128.const $push0=, 0x1p0, 0x1p1, 0x0p0, 0x1p257; CHECK-NEXT:    f32x4.replace_lane $push1=, $pop0, 2, $058; CHECK-NEXT:    return $pop159  %v = insertelement60    <4 x float> <float 1., float 2., float 3., float 4.>,61    float %x,62    i32 263  ret <4 x float> %v64}65 66define <4 x i32> @splat_common_const_i32x4() {67; CHECK-LABEL: splat_common_const_i32x4:68; CHECK:         .functype splat_common_const_i32x4 () -> (v128)69; CHECK-NEXT:  # %bb.0:70; CHECK-NEXT:    v128.const $push0=, 0, 3, 3, 171; CHECK-NEXT:    return $pop072  ret <4 x i32> <i32 undef, i32 3, i32 3, i32 1>73}74 75define <8 x i16> @splat_common_arg_i16x8(i16 %a, i16 %b, i16 %c) {76; CHECK-LABEL: splat_common_arg_i16x8:77; CHECK:         .functype splat_common_arg_i16x8 (i32, i32, i32) -> (v128)78; CHECK-NEXT:  # %bb.0:79; CHECK-NEXT:    i16x8.splat $push0=, $280; CHECK-NEXT:    i16x8.replace_lane $push1=, $pop0, 0, $181; CHECK-NEXT:    i16x8.replace_lane $push2=, $pop1, 2, $082; CHECK-NEXT:    i16x8.replace_lane $push3=, $pop2, 4, $183; CHECK-NEXT:    i16x8.replace_lane $push4=, $pop3, 7, $184; CHECK-NEXT:    return $pop485  %v0 = insertelement <8 x i16> undef, i16 %b, i32 086  %v1 = insertelement <8 x i16> %v0, i16 %c, i32 187  %v2 = insertelement <8 x i16> %v1, i16 %a, i32 288  %v3 = insertelement <8 x i16> %v2, i16 %c, i32 389  %v4 = insertelement <8 x i16> %v3, i16 %b, i32 490  %v5 = insertelement <8 x i16> %v4, i16 %c, i32 591  %v6 = insertelement <8 x i16> %v5, i16 %c, i32 692  %v7 = insertelement <8 x i16> %v6, i16 %b, i32 793  ret <8 x i16> %v794}95 96define <16 x i8> @swizzle_one_i8x16(<16 x i8> %src, <16 x i8> %mask) {97; CHECK-LABEL: swizzle_one_i8x16:98; CHECK:         .functype swizzle_one_i8x16 (v128, v128) -> (v128)99; CHECK-NEXT:  # %bb.0:100; CHECK-NEXT:    global.get $push5=, __stack_pointer101; CHECK-NEXT:    i32.const $push6=, 16102; CHECK-NEXT:    i32.sub $push8=, $pop5, $pop6103; CHECK-NEXT:    local.tee $push7=, $2=, $pop8104; CHECK-NEXT:    v128.store 0($pop7), $0105; CHECK-NEXT:    i8x16.extract_lane_u $push0=, $1, 0106; CHECK-NEXT:    i32.const $push1=, 15107; CHECK-NEXT:    i32.and $push2=, $pop0, $pop1108; CHECK-NEXT:    i32.or $push3=, $2, $pop2109; CHECK-NEXT:    v128.load8_splat $push4=, 0($pop3)110; CHECK-NEXT:    return $pop4111  %m0 = extractelement <16 x i8> %mask, i32 0112  %s0 = extractelement <16 x i8> %src, i8 %m0113  %v0 = insertelement <16 x i8> undef, i8 %s0, i32 0114  ret <16 x i8> %v0115}116 117define <16 x i8> @swizzle_all_i8x16(<16 x i8> %src, <16 x i8> %mask) {118; CHECK-LABEL: swizzle_all_i8x16:119; CHECK:         .functype swizzle_all_i8x16 (v128, v128) -> (v128)120; CHECK-NEXT:  # %bb.0:121; CHECK-NEXT:    global.get $push65=, __stack_pointer122; CHECK-NEXT:    i32.const $push66=, 16123; CHECK-NEXT:    i32.sub $push83=, $pop65, $pop66124; CHECK-NEXT:    local.tee $push82=, $2=, $pop83125; CHECK-NEXT:    v128.store 0($pop82), $0126; CHECK-NEXT:    i8x16.extract_lane_u $push61=, $1, 15127; CHECK-NEXT:    i32.const $push1=, 15128; CHECK-NEXT:    i32.and $push62=, $pop61, $pop1129; CHECK-NEXT:    i32.or $push63=, $2, $pop62130; CHECK-NEXT:    i8x16.extract_lane_u $push57=, $1, 14131; CHECK-NEXT:    i32.const $push81=, 15132; CHECK-NEXT:    i32.and $push58=, $pop57, $pop81133; CHECK-NEXT:    i32.or $push59=, $2, $pop58134; CHECK-NEXT:    i8x16.extract_lane_u $push53=, $1, 13135; CHECK-NEXT:    i32.const $push80=, 15136; CHECK-NEXT:    i32.and $push54=, $pop53, $pop80137; CHECK-NEXT:    i32.or $push55=, $2, $pop54138; CHECK-NEXT:    i8x16.extract_lane_u $push49=, $1, 12139; CHECK-NEXT:    i32.const $push79=, 15140; CHECK-NEXT:    i32.and $push50=, $pop49, $pop79141; CHECK-NEXT:    i32.or $push51=, $2, $pop50142; CHECK-NEXT:    i8x16.extract_lane_u $push45=, $1, 11143; CHECK-NEXT:    i32.const $push78=, 15144; CHECK-NEXT:    i32.and $push46=, $pop45, $pop78145; CHECK-NEXT:    i32.or $push47=, $2, $pop46146; CHECK-NEXT:    i8x16.extract_lane_u $push41=, $1, 10147; CHECK-NEXT:    i32.const $push77=, 15148; CHECK-NEXT:    i32.and $push42=, $pop41, $pop77149; CHECK-NEXT:    i32.or $push43=, $2, $pop42150; CHECK-NEXT:    i8x16.extract_lane_u $push37=, $1, 9151; CHECK-NEXT:    i32.const $push76=, 15152; CHECK-NEXT:    i32.and $push38=, $pop37, $pop76153; CHECK-NEXT:    i32.or $push39=, $2, $pop38154; CHECK-NEXT:    i8x16.extract_lane_u $push33=, $1, 8155; CHECK-NEXT:    i32.const $push75=, 15156; CHECK-NEXT:    i32.and $push34=, $pop33, $pop75157; CHECK-NEXT:    i32.or $push35=, $2, $pop34158; CHECK-NEXT:    i8x16.extract_lane_u $push29=, $1, 7159; CHECK-NEXT:    i32.const $push74=, 15160; CHECK-NEXT:    i32.and $push30=, $pop29, $pop74161; CHECK-NEXT:    i32.or $push31=, $2, $pop30162; CHECK-NEXT:    i8x16.extract_lane_u $push25=, $1, 6163; CHECK-NEXT:    i32.const $push73=, 15164; CHECK-NEXT:    i32.and $push26=, $pop25, $pop73165; CHECK-NEXT:    i32.or $push27=, $2, $pop26166; CHECK-NEXT:    i8x16.extract_lane_u $push21=, $1, 5167; CHECK-NEXT:    i32.const $push72=, 15168; CHECK-NEXT:    i32.and $push22=, $pop21, $pop72169; CHECK-NEXT:    i32.or $push23=, $2, $pop22170; CHECK-NEXT:    i8x16.extract_lane_u $push17=, $1, 4171; CHECK-NEXT:    i32.const $push71=, 15172; CHECK-NEXT:    i32.and $push18=, $pop17, $pop71173; CHECK-NEXT:    i32.or $push19=, $2, $pop18174; CHECK-NEXT:    i8x16.extract_lane_u $push13=, $1, 3175; CHECK-NEXT:    i32.const $push70=, 15176; CHECK-NEXT:    i32.and $push14=, $pop13, $pop70177; CHECK-NEXT:    i32.or $push15=, $2, $pop14178; CHECK-NEXT:    i8x16.extract_lane_u $push9=, $1, 2179; CHECK-NEXT:    i32.const $push69=, 15180; CHECK-NEXT:    i32.and $push10=, $pop9, $pop69181; CHECK-NEXT:    i32.or $push11=, $2, $pop10182; CHECK-NEXT:    i8x16.extract_lane_u $push0=, $1, 1183; CHECK-NEXT:    i32.const $push68=, 15184; CHECK-NEXT:    i32.and $push2=, $pop0, $pop68185; CHECK-NEXT:    i32.or $push3=, $2, $pop2186; CHECK-NEXT:    i8x16.extract_lane_u $push4=, $1, 0187; CHECK-NEXT:    i32.const $push67=, 15188; CHECK-NEXT:    i32.and $push5=, $pop4, $pop67189; CHECK-NEXT:    i32.or $push6=, $2, $pop5190; CHECK-NEXT:    v128.load8_splat $push7=, 0($pop6)191; CHECK-NEXT:    v128.load8_lane $push8=, 0($pop3), $pop7, 1192; CHECK-NEXT:    v128.load8_lane $push12=, 0($pop11), $pop8, 2193; CHECK-NEXT:    v128.load8_lane $push16=, 0($pop15), $pop12, 3194; CHECK-NEXT:    v128.load8_lane $push20=, 0($pop19), $pop16, 4195; CHECK-NEXT:    v128.load8_lane $push24=, 0($pop23), $pop20, 5196; CHECK-NEXT:    v128.load8_lane $push28=, 0($pop27), $pop24, 6197; CHECK-NEXT:    v128.load8_lane $push32=, 0($pop31), $pop28, 7198; CHECK-NEXT:    v128.load8_lane $push36=, 0($pop35), $pop32, 8199; CHECK-NEXT:    v128.load8_lane $push40=, 0($pop39), $pop36, 9200; CHECK-NEXT:    v128.load8_lane $push44=, 0($pop43), $pop40, 10201; CHECK-NEXT:    v128.load8_lane $push48=, 0($pop47), $pop44, 11202; CHECK-NEXT:    v128.load8_lane $push52=, 0($pop51), $pop48, 12203; CHECK-NEXT:    v128.load8_lane $push56=, 0($pop55), $pop52, 13204; CHECK-NEXT:    v128.load8_lane $push60=, 0($pop59), $pop56, 14205; CHECK-NEXT:    v128.load8_lane $push64=, 0($pop63), $pop60, 15206; CHECK-NEXT:    return $pop64207  %m0 = extractelement <16 x i8> %mask, i32 0208  %s0 = extractelement <16 x i8> %src, i8 %m0209  %v0 = insertelement <16 x i8> undef, i8 %s0, i32 0210  %m1 = extractelement <16 x i8> %mask, i32 1211  %s1 = extractelement <16 x i8> %src, i8 %m1212  %v1 = insertelement <16 x i8> %v0, i8 %s1, i32 1213  %m2 = extractelement <16 x i8> %mask, i32 2214  %s2 = extractelement <16 x i8> %src, i8 %m2215  %v2 = insertelement <16 x i8> %v1, i8 %s2, i32 2216  %m3 = extractelement <16 x i8> %mask, i32 3217  %s3 = extractelement <16 x i8> %src, i8 %m3218  %v3 = insertelement <16 x i8> %v2, i8 %s3, i32 3219  %m4 = extractelement <16 x i8> %mask, i32 4220  %s4 = extractelement <16 x i8> %src, i8 %m4221  %v4 = insertelement <16 x i8> %v3, i8 %s4, i32 4222  %m5 = extractelement <16 x i8> %mask, i32 5223  %s5 = extractelement <16 x i8> %src, i8 %m5224  %v5 = insertelement <16 x i8> %v4, i8 %s5, i32 5225  %m6 = extractelement <16 x i8> %mask, i32 6226  %s6 = extractelement <16 x i8> %src, i8 %m6227  %v6 = insertelement <16 x i8> %v5, i8 %s6, i32 6228  %m7 = extractelement <16 x i8> %mask, i32 7229  %s7 = extractelement <16 x i8> %src, i8 %m7230  %v7 = insertelement <16 x i8> %v6, i8 %s7, i32 7231  %m8 = extractelement <16 x i8> %mask, i32 8232  %s8 = extractelement <16 x i8> %src, i8 %m8233  %v8 = insertelement <16 x i8> %v7, i8 %s8, i32 8234  %m9 = extractelement <16 x i8> %mask, i32 9235  %s9 = extractelement <16 x i8> %src, i8 %m9236  %v9 = insertelement <16 x i8> %v8, i8 %s9, i32 9237  %m10 = extractelement <16 x i8> %mask, i32 10238  %s10 = extractelement <16 x i8> %src, i8 %m10239  %v10 = insertelement <16 x i8> %v9, i8 %s10, i32 10240  %m11 = extractelement <16 x i8> %mask, i32 11241  %s11 = extractelement <16 x i8> %src, i8 %m11242  %v11 = insertelement <16 x i8> %v10, i8 %s11, i32 11243  %m12 = extractelement <16 x i8> %mask, i32 12244  %s12 = extractelement <16 x i8> %src, i8 %m12245  %v12 = insertelement <16 x i8> %v11, i8 %s12, i32 12246  %m13 = extractelement <16 x i8> %mask, i32 13247  %s13 = extractelement <16 x i8> %src, i8 %m13248  %v13 = insertelement <16 x i8> %v12, i8 %s13, i32 13249  %m14 = extractelement <16 x i8> %mask, i32 14250  %s14 = extractelement <16 x i8> %src, i8 %m14251  %v14 = insertelement <16 x i8> %v13, i8 %s14, i32 14252  %m15 = extractelement <16 x i8> %mask, i32 15253  %s15 = extractelement <16 x i8> %src, i8 %m15254  %v15 = insertelement <16 x i8> %v14, i8 %s15, i32 15255  ret <16 x i8> %v15256}257 258; Ensure we don't us swizzle259define <8 x i16> @swizzle_one_i16x8(<8 x i16> %src, <8 x i16> %mask) {260; CHECK-LABEL: swizzle_one_i16x8:261; CHECK:         .functype swizzle_one_i16x8 (v128, v128) -> (v128)262; CHECK-NEXT:  # %bb.0:263; CHECK-NEXT:    global.get $push7=, __stack_pointer264; CHECK-NEXT:    i32.const $push8=, 16265; CHECK-NEXT:    i32.sub $push10=, $pop7, $pop8266; CHECK-NEXT:    local.tee $push9=, $2=, $pop10267; CHECK-NEXT:    v128.store 0($pop9), $0268; CHECK-NEXT:    i16x8.extract_lane_u $push0=, $1, 0269; CHECK-NEXT:    i32.const $push1=, 7270; CHECK-NEXT:    i32.and $push2=, $pop0, $pop1271; CHECK-NEXT:    i32.const $push3=, 1272; CHECK-NEXT:    i32.shl $push4=, $pop2, $pop3273; CHECK-NEXT:    i32.or $push5=, $2, $pop4274; CHECK-NEXT:    v128.load16_splat $push6=, 0($pop5)275; CHECK-NEXT:    return $pop6276  %m0 = extractelement <8 x i16> %mask, i32 0277  %s0 = extractelement <8 x i16> %src, i16 %m0278  %v0 = insertelement <8 x i16> undef, i16 %s0, i32 0279  ret <8 x i16> %v0280}281 282define <4 x i32> @half_shuffle_i32x4(<4 x i32> %src) {283; CHECK-LABEL: half_shuffle_i32x4:284; CHECK:         .functype half_shuffle_i32x4 (v128) -> (v128)285; CHECK-NEXT:  # %bb.0:286; CHECK-NEXT:    i8x16.shuffle $push0=, $0, $0, 0, 1, 2, 3, 8, 9, 10, 11, 0, 1, 2, 3, 0, 1, 2, 3287; CHECK-NEXT:    i32.const $push1=, 0288; CHECK-NEXT:    i32x4.replace_lane $push2=, $pop0, 0, $pop1289; CHECK-NEXT:    i32.const $push3=, 3290; CHECK-NEXT:    i32x4.replace_lane $push4=, $pop2, 3, $pop3291; CHECK-NEXT:    return $pop4292  %s0 = extractelement <4 x i32> %src, i32 0293  %s2 = extractelement <4 x i32> %src, i32 2294  %v0 = insertelement <4 x i32> undef, i32 0, i32 0295  %v1 = insertelement <4 x i32> %v0, i32 %s2, i32 1296  %v2 = insertelement <4 x i32> %v1, i32 %s0, i32 2297  %v3 = insertelement <4 x i32> %v2, i32 3, i32 3298  ret <4 x i32> %v3299}300 301define <16 x i8> @mashup_swizzle_i8x16(<16 x i8> %src, <16 x i8> %mask, i8 %splatted) {302  ; swizzle 0303; CHECK-LABEL: mashup_swizzle_i8x16:304; CHECK:         .functype mashup_swizzle_i8x16 (v128, v128, i32) -> (v128)305; CHECK-NEXT:  # %bb.0:306; CHECK-NEXT:    global.get $push12=, __stack_pointer307; CHECK-NEXT:    i32.const $push13=, 16308; CHECK-NEXT:    i32.sub $push16=, $pop12, $pop13309; CHECK-NEXT:    local.tee $push15=, $3=, $pop16310; CHECK-NEXT:    v128.store 0($pop15), $0311; CHECK-NEXT:    i8x16.extract_lane_u $push7=, $1, 7312; CHECK-NEXT:    i32.const $push1=, 15313; CHECK-NEXT:    i32.and $push8=, $pop7, $pop1314; CHECK-NEXT:    i32.or $push9=, $3, $pop8315; CHECK-NEXT:    i8x16.extract_lane_u $push0=, $1, 0316; CHECK-NEXT:    i32.const $push14=, 15317; CHECK-NEXT:    i32.and $push2=, $pop0, $pop14318; CHECK-NEXT:    i32.or $push3=, $3, $pop2319; CHECK-NEXT:    v128.const $push4=, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0320; CHECK-NEXT:    v128.load8_lane $push5=, 0($pop3), $pop4, 0321; CHECK-NEXT:    i8x16.replace_lane $push6=, $pop5, 3, $2322; CHECK-NEXT:    v128.load8_lane $push10=, 0($pop9), $pop6, 7323; CHECK-NEXT:    i8x16.replace_lane $push11=, $pop10, 12, $2324; CHECK-NEXT:    return $pop11325  %m0 = extractelement <16 x i8> %mask, i32 0326  %s0 = extractelement <16 x i8> %src, i8 %m0327  %v0 = insertelement <16 x i8> undef, i8 %s0, i32 0328  ; swizzle 7329  %m1 = extractelement <16 x i8> %mask, i32 7330  %s1 = extractelement <16 x i8> %src, i8 %m1331  %v1 = insertelement <16 x i8> %v0, i8 %s1, i32 7332  ; splat 3333  %v2 = insertelement <16 x i8> %v1, i8 %splatted, i32 3334  ; splat 12335  %v3 = insertelement <16 x i8> %v2, i8 %splatted, i32 12336  ; const 4337  %v4 = insertelement <16 x i8> %v3, i8 42, i32 4338  ; const 14339  %v5 = insertelement <16 x i8> %v4, i8 42, i32 14340  ret <16 x i8> %v5341}342 343define <16 x i8> @mashup_const_i8x16(<16 x i8> %src, <16 x i8> %mask, i8 %splatted) {344  ; swizzle 0345; CHECK-LABEL: mashup_const_i8x16:346; CHECK:         .functype mashup_const_i8x16 (v128, v128, i32) -> (v128)347; CHECK-NEXT:  # %bb.0:348; CHECK-NEXT:    global.get $push8=, __stack_pointer349; CHECK-NEXT:    i32.const $push9=, 16350; CHECK-NEXT:    i32.sub $push11=, $pop8, $pop9351; CHECK-NEXT:    local.tee $push10=, $3=, $pop11352; CHECK-NEXT:    v128.store 0($pop10), $0353; CHECK-NEXT:    i8x16.extract_lane_u $push0=, $1, 0354; CHECK-NEXT:    i32.const $push1=, 15355; CHECK-NEXT:    i32.and $push2=, $pop0, $pop1356; CHECK-NEXT:    i32.or $push3=, $3, $pop2357; CHECK-NEXT:    v128.const $push4=, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0358; CHECK-NEXT:    v128.load8_lane $push5=, 0($pop3), $pop4, 0359; CHECK-NEXT:    i8x16.replace_lane $push6=, $pop5, 3, $2360; CHECK-NEXT:    i8x16.replace_lane $push7=, $pop6, 12, $2361; CHECK-NEXT:    return $pop7362  %m0 = extractelement <16 x i8> %mask, i32 0363  %s0 = extractelement <16 x i8> %src, i8 %m0364  %v0 = insertelement <16 x i8> undef, i8 %s0, i32 0365  ; splat 3366  %v1 = insertelement <16 x i8> %v0, i8 %splatted, i32 3367  ; splat 12368  %v2 = insertelement <16 x i8> %v1, i8 %splatted, i32 12369  ; const 4370  %v3 = insertelement <16 x i8> %v2, i8 42, i32 4371  ; const 14372  %v4 = insertelement <16 x i8> %v3, i8 42, i32 14373  ret <16 x i8> %v4374}375 376define <16 x i8> @mashup_splat_i8x16(<16 x i8> %src, <16 x i8> %mask, i8 %splatted) {377  ; swizzle 0378; CHECK-LABEL: mashup_splat_i8x16:379; CHECK:         .functype mashup_splat_i8x16 (v128, v128, i32) -> (v128)380; CHECK-NEXT:  # %bb.0:381; CHECK-NEXT:    global.get $push8=, __stack_pointer382; CHECK-NEXT:    i32.const $push9=, 16383; CHECK-NEXT:    i32.sub $push11=, $pop8, $pop9384; CHECK-NEXT:    local.tee $push10=, $3=, $pop11385; CHECK-NEXT:    v128.store 0($pop10), $0386; CHECK-NEXT:    i8x16.extract_lane_u $push0=, $1, 0387; CHECK-NEXT:    i32.const $push1=, 15388; CHECK-NEXT:    i32.and $push2=, $pop0, $pop1389; CHECK-NEXT:    i32.or $push3=, $3, $pop2390; CHECK-NEXT:    i8x16.splat $push4=, $2391; CHECK-NEXT:    v128.load8_lane $push5=, 0($pop3), $pop4, 0392; CHECK-NEXT:    i32.const $push6=, 42393; CHECK-NEXT:    i8x16.replace_lane $push7=, $pop5, 4, $pop6394; CHECK-NEXT:    return $pop7395  %m0 = extractelement <16 x i8> %mask, i32 0396  %s0 = extractelement <16 x i8> %src, i8 %m0397  %v0 = insertelement <16 x i8> undef, i8 %s0, i32 0398  ; splat 3399  %v1 = insertelement <16 x i8> %v0, i8 %splatted, i32 3400  ; splat 12401  %v2 = insertelement <16 x i8> %v1, i8 %splatted, i32 12402  ; const 4403  %v3 = insertelement <16 x i8> %v2, i8 42, i32 4404  ret <16 x i8> %v3405}406 407define <4 x float> @undef_const_insert_f32x4() {408; CHECK-LABEL: undef_const_insert_f32x4:409; CHECK:         .functype undef_const_insert_f32x4 () -> (v128)410; CHECK-NEXT:  # %bb.0:411; CHECK-NEXT:    v128.const $push0=, 0x1.5p5, 0x1.5p5, 0x1.5p5, 0x1.5p5412; CHECK-NEXT:    return $pop0413  %v = insertelement <4 x float> undef, float 42., i32 1414  ret <4 x float> %v415}416 417define <4 x i32> @undef_arg_insert_i32x4(i32 %x) {418; CHECK-LABEL: undef_arg_insert_i32x4:419; CHECK:         .functype undef_arg_insert_i32x4 (i32) -> (v128)420; CHECK-NEXT:  # %bb.0:421; CHECK-NEXT:    i32x4.splat $push0=, $0422; CHECK-NEXT:    return $pop0423  %v = insertelement <4 x i32> undef, i32 %x, i32 3424  ret <4 x i32> %v425}426 427define <16 x i8> @all_undef_i8x16() {428; CHECK-LABEL: all_undef_i8x16:429; CHECK:         .functype all_undef_i8x16 () -> (v128)430; CHECK-NEXT:  # %bb.0:431; CHECK-NEXT:    return $0432  %v = insertelement <16 x i8> undef, i8 undef, i32 4433  ret <16 x i8> %v434}435 436define <2 x double> @all_undef_f64x2() {437; CHECK-LABEL: all_undef_f64x2:438; CHECK:         .functype all_undef_f64x2 () -> (v128)439; CHECK-NEXT:  # %bb.0:440; CHECK-NEXT:    return $0441  ret <2 x double> undef442}443 444define <4 x i32> @load_zero_lane_i32x4(ptr %addr.a, ptr %addr.b, ptr %addr.c, ptr %addr.d) {445; CHECK-LABEL: load_zero_lane_i32x4:446; CHECK:         .functype load_zero_lane_i32x4 (i32, i32, i32, i32) -> (v128)447; CHECK-NEXT:  # %bb.0:448; CHECK-NEXT:    v128.load32_zero $push0=, 0($0)449; CHECK-NEXT:    v128.load32_lane $push1=, 0($1), $pop0, 1450; CHECK-NEXT:    v128.load32_lane $push2=, 0($2), $pop1, 2451; CHECK-NEXT:    v128.load32_lane $push3=, 0($3), $pop2, 3452; CHECK-NEXT:    return $pop3453  %a = load i32, ptr %addr.a454  %b = load i32, ptr %addr.b455  %c = load i32, ptr %addr.c456  %d = load i32, ptr %addr.d457  %v = insertelement <4 x i32> undef, i32 %a, i32 0458  %v.1 = insertelement <4 x i32> %v, i32 %b, i32 1459  %v.2 = insertelement <4 x i32> %v.1, i32 %c, i32 2460  %v.3 = insertelement <4 x i32> %v.2, i32 %d, i32 3461  ret <4 x i32> %v.3462}463 464define <2 x i64> @load_zero_lane_i64x2(ptr %addr.a, ptr %addr.b) {465; CHECK-LABEL: load_zero_lane_i64x2:466; CHECK:         .functype load_zero_lane_i64x2 (i32, i32) -> (v128)467; CHECK-NEXT:  # %bb.0:468; CHECK-NEXT:    v128.load64_zero $push0=, 0($0)469; CHECK-NEXT:    v128.load64_lane $push1=, 0($1), $pop0, 1470; CHECK-NEXT:    return $pop1471  %a = load i64, ptr %addr.a472  %b = load i64, ptr %addr.b473  %v = insertelement <2 x i64> undef, i64 %a, i32 0474  %v.1 = insertelement <2 x i64> %v, i64 %b, i32 1475  ret <2 x i64> %v.1476}477 478define <4 x float> @load_zero_lane_f32x4(ptr %addr.a, ptr %addr.b, ptr %addr.c, ptr %addr.d) {479; CHECK-LABEL: load_zero_lane_f32x4:480; CHECK:         .functype load_zero_lane_f32x4 (i32, i32, i32, i32) -> (v128)481; CHECK-NEXT:  # %bb.0:482; CHECK-NEXT:    v128.load32_zero $push0=, 0($0)483; CHECK-NEXT:    v128.load32_lane $push1=, 0($1), $pop0, 1484; CHECK-NEXT:    v128.load32_lane $push2=, 0($2), $pop1, 2485; CHECK-NEXT:    v128.load32_lane $push3=, 0($3), $pop2, 3486; CHECK-NEXT:    return $pop3487  %a = load float, ptr %addr.a488  %b = load float, ptr %addr.b489  %c = load float, ptr %addr.c490  %d = load float, ptr %addr.d491  %v = insertelement <4 x float> undef, float %a, i32 0492  %v.1 = insertelement <4 x float> %v, float %b, i32 1493  %v.2 = insertelement <4 x float> %v.1, float %c, i32 2494  %v.3 = insertelement <4 x float> %v.2, float %d, i32 3495  ret <4 x float> %v.3496}497 498define <4 x float> @load_zero_undef_lane_f32x4(ptr %addr.a, ptr %addr.b) {499; CHECK-LABEL: load_zero_undef_lane_f32x4:500; CHECK:         .functype load_zero_undef_lane_f32x4 (i32, i32) -> (v128)501; CHECK-NEXT:  # %bb.0:502; CHECK-NEXT:    v128.load32_splat $push0=, 0($0)503; CHECK-NEXT:    v128.load32_lane $push1=, 0($1), $pop0, 3504; CHECK-NEXT:    return $pop1505  %a = load float, ptr %addr.a506  %b = load float, ptr %addr.b507  %v = insertelement <4 x float> undef, float %a, i32 1508  %v.1 = insertelement <4 x float> %v, float %b, i32 3509  ret <4 x float> %v.1510}511 512define <2 x double> @load_zero_lane_f64x2(ptr %addr.a, ptr %addr.b) {513; CHECK-LABEL: load_zero_lane_f64x2:514; CHECK:         .functype load_zero_lane_f64x2 (i32, i32) -> (v128)515; CHECK-NEXT:  # %bb.0:516; CHECK-NEXT:    v128.load64_zero $push0=, 0($0)517; CHECK-NEXT:    v128.load64_lane $push1=, 0($1), $pop0, 1518; CHECK-NEXT:    return $pop1519  %a = load double, ptr %addr.a520  %b = load double, ptr %addr.b521  %v = insertelement <2 x double> undef, double %a, i32 0522  %v.1 = insertelement <2 x double> %v, double %b, i32 1523  ret <2 x double> %v.1524}525 526define <2 x i8> @pr165713() {527; CHECK-LABEL: pr165713:528; CHECK:         .functype pr165713 () -> (v128)529; CHECK-NEXT:  # %bb.0: # %entry530; CHECK-NEXT:    v128.const $push0=, 0, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0531; CHECK-NEXT:    return $pop0532entry:533  %shuffle3.i = shufflevector <32 x i32> zeroinitializer, <32 x i32> <i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 -62880201, i32 poison, i32 poison, i32 poison>, <2 x i32> <i32 17, i32 60>534  %conv.i = trunc <2 x i32> %shuffle3.i to <2 x i8>535  ret <2 x i8> %conv.i536}537