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