1918 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42;3; Test memory sanitizer instrumentation for Arm store with lane instructions.4; Note: st{2,3,4}lane uses Arm NEON but st1lane does not.5;6; RUN: opt < %s -passes=msan -S | FileCheck %s7;8; Forked from llvm/test/CodeGen/AArch64/arm64-st1.ll9 10target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"11target triple = "aarch64--linux-android9001"12 13define void @st1lane_16b(<16 x i8> %A, ptr %D) sanitize_memory {14; CHECK-LABEL: define void @st1lane_16b(15; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0:[0-9]+]] {16; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 817; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 818; CHECK-NEXT: call void @llvm.donothing()19; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 020; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 121; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP2]], i32 122; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 123; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 024; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1:![0-9]+]]25; CHECK: 3:26; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]27; CHECK-NEXT: unreachable28; CHECK: 4:29; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i6430; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 19351404648857631; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr32; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 133; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 134; CHECK-NEXT: ret void35;36 %ptr = getelementptr i8, ptr %D, i64 137 %tmp = extractelement <16 x i8> %A, i32 138 store i8 %tmp, ptr %ptr39 ret void40}41 42define void @st1lane0_16b(<16 x i8> %A, ptr %D) sanitize_memory {43; CHECK-LABEL: define void @st1lane0_16b(44; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {45; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 846; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 847; CHECK-NEXT: call void @llvm.donothing()48; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 049; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 150; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP2]], i32 051; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 052; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 053; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]54; CHECK: 3:55; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]56; CHECK-NEXT: unreachable57; CHECK: 4:58; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i6459; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 19351404648857660; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr61; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 162; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 163; CHECK-NEXT: ret void64;65 %ptr = getelementptr i8, ptr %D, i64 166 %tmp = extractelement <16 x i8> %A, i32 067 store i8 %tmp, ptr %ptr68 ret void69}70 71define void @st1lane0u_16b(<16 x i8> %A, ptr %D) sanitize_memory {72; CHECK-LABEL: define void @st1lane0u_16b(73; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {74; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 875; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 876; CHECK-NEXT: call void @llvm.donothing()77; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 078; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 -179; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP2]], i32 080; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 081; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 082; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]83; CHECK: 3:84; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]85; CHECK-NEXT: unreachable86; CHECK: 4:87; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i6488; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 19351404648857689; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr90; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 191; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 192; CHECK-NEXT: ret void93;94 %ptr = getelementptr i8, ptr %D, i64 -195 %tmp = extractelement <16 x i8> %A, i32 096 store i8 %tmp, ptr %ptr97 ret void98}99 100define void @st1lane_ro_16b(<16 x i8> %A, ptr %D, i64 %offset) sanitize_memory {101; CHECK-LABEL: define void @st1lane_ro_16b(102; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {103; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8104; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8105; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8106; CHECK-NEXT: call void @llvm.donothing()107; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]108; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]109; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP3]], i32 1110; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 1111; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0112; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]113; CHECK: 4:114; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]115; CHECK-NEXT: unreachable116; CHECK: 5:117; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64118; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576119; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr120; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1121; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1122; CHECK-NEXT: ret void123;124 %ptr = getelementptr i8, ptr %D, i64 %offset125 %tmp = extractelement <16 x i8> %A, i32 1126 store i8 %tmp, ptr %ptr127 ret void128}129 130define void @st1lane0_ro_16b(<16 x i8> %A, ptr %D, i64 %offset) sanitize_memory {131; CHECK-LABEL: define void @st1lane0_ro_16b(132; CHECK-SAME: <16 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {133; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8134; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8135; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 8136; CHECK-NEXT: call void @llvm.donothing()137; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]138; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]139; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <16 x i8> [[TMP3]], i32 0140; CHECK-NEXT: [[TMP:%.*]] = extractelement <16 x i8> [[A]], i32 0141; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0142; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]143; CHECK: 4:144; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]145; CHECK-NEXT: unreachable146; CHECK: 5:147; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64148; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576149; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr150; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1151; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1152; CHECK-NEXT: ret void153;154 %ptr = getelementptr i8, ptr %D, i64 %offset155 %tmp = extractelement <16 x i8> %A, i32 0156 store i8 %tmp, ptr %ptr157 ret void158}159 160define void @st1lane_8h(<8 x i16> %A, ptr %D) sanitize_memory {161; CHECK-LABEL: define void @st1lane_8h(162; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {163; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8164; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8165; CHECK-NEXT: call void @llvm.donothing()166; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0167; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1168; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP2]], i32 1169; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 1170; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0171; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]172; CHECK: 3:173; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]174; CHECK-NEXT: unreachable175; CHECK: 4:176; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64177; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576178; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr179; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2180; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2181; CHECK-NEXT: ret void182;183 %ptr = getelementptr i16, ptr %D, i64 1184 %tmp = extractelement <8 x i16> %A, i32 1185 store i16 %tmp, ptr %ptr186 ret void187}188 189define void @st1lane0_8h(<8 x i16> %A, ptr %D) sanitize_memory {190; CHECK-LABEL: define void @st1lane0_8h(191; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {192; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8193; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8194; CHECK-NEXT: call void @llvm.donothing()195; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0196; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1197; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP2]], i32 0198; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 0199; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0200; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]201; CHECK: 3:202; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]203; CHECK-NEXT: unreachable204; CHECK: 4:205; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64206; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576207; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr208; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2209; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2210; CHECK-NEXT: ret void211;212 %ptr = getelementptr i16, ptr %D, i64 1213 %tmp = extractelement <8 x i16> %A, i32 0214 store i16 %tmp, ptr %ptr215 ret void216}217 218define void @st1lane0u_8h(<8 x i16> %A, ptr %D) sanitize_memory {219; CHECK-LABEL: define void @st1lane0u_8h(220; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {221; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8222; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8223; CHECK-NEXT: call void @llvm.donothing()224; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0225; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 -1226; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP2]], i32 0227; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 0228; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0229; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]230; CHECK: 3:231; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]232; CHECK-NEXT: unreachable233; CHECK: 4:234; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64235; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576236; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr237; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 2238; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2239; CHECK-NEXT: ret void240;241 %ptr = getelementptr i16, ptr %D, i64 -1242 %tmp = extractelement <8 x i16> %A, i32 0243 store i16 %tmp, ptr %ptr244 ret void245}246 247define void @st1lane_ro_8h(<8 x i16> %A, ptr %D, i64 %offset) sanitize_memory {248; CHECK-LABEL: define void @st1lane_ro_8h(249; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {250; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8251; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8252; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8253; CHECK-NEXT: call void @llvm.donothing()254; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]255; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]256; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP3]], i32 1257; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 1258; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0259; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]260; CHECK: 4:261; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]262; CHECK-NEXT: unreachable263; CHECK: 5:264; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64265; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576266; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr267; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 2268; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2269; CHECK-NEXT: ret void270;271 %ptr = getelementptr i16, ptr %D, i64 %offset272 %tmp = extractelement <8 x i16> %A, i32 1273 store i16 %tmp, ptr %ptr274 ret void275}276 277define void @st1lane0_ro_8h(<8 x i16> %A, ptr %D, i64 %offset) sanitize_memory {278; CHECK-LABEL: define void @st1lane0_ro_8h(279; CHECK-SAME: <8 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {280; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8281; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8282; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 8283; CHECK-NEXT: call void @llvm.donothing()284; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]285; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]286; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i16> [[TMP3]], i32 0287; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i16> [[A]], i32 0288; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0289; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]290; CHECK: 4:291; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]292; CHECK-NEXT: unreachable293; CHECK: 5:294; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64295; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576296; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr297; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 2298; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 2299; CHECK-NEXT: ret void300;301 %ptr = getelementptr i16, ptr %D, i64 %offset302 %tmp = extractelement <8 x i16> %A, i32 0303 store i16 %tmp, ptr %ptr304 ret void305}306 307define void @st1lane_4s(<4 x i32> %A, ptr %D) sanitize_memory {308; CHECK-LABEL: define void @st1lane_4s(309; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {310; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8311; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8312; CHECK-NEXT: call void @llvm.donothing()313; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0314; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 1315; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 1316; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 1317; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0318; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]319; CHECK: 3:320; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]321; CHECK-NEXT: unreachable322; CHECK: 4:323; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64324; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576325; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr326; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4327; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4328; CHECK-NEXT: ret void329;330 %ptr = getelementptr i32, ptr %D, i64 1331 %tmp = extractelement <4 x i32> %A, i32 1332 store i32 %tmp, ptr %ptr333 ret void334}335 336define void @st1lane0_4s(<4 x i32> %A, ptr %D) sanitize_memory {337; CHECK-LABEL: define void @st1lane0_4s(338; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {339; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8340; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8341; CHECK-NEXT: call void @llvm.donothing()342; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0343; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 1344; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0345; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 0346; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0347; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]348; CHECK: 3:349; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]350; CHECK-NEXT: unreachable351; CHECK: 4:352; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64353; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576354; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr355; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4356; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4357; CHECK-NEXT: ret void358;359 %ptr = getelementptr i32, ptr %D, i64 1360 %tmp = extractelement <4 x i32> %A, i32 0361 store i32 %tmp, ptr %ptr362 ret void363}364 365define void @st1lane0u_4s(<4 x i32> %A, ptr %D) sanitize_memory {366; CHECK-LABEL: define void @st1lane0u_4s(367; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {368; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8369; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8370; CHECK-NEXT: call void @llvm.donothing()371; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0372; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 -1373; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0374; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 0375; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0376; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]377; CHECK: 3:378; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]379; CHECK-NEXT: unreachable380; CHECK: 4:381; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64382; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576383; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr384; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4385; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4386; CHECK-NEXT: ret void387;388 %ptr = getelementptr i32, ptr %D, i64 -1389 %tmp = extractelement <4 x i32> %A, i32 0390 store i32 %tmp, ptr %ptr391 ret void392}393 394define void @st1lane_ro_4s(<4 x i32> %A, ptr %D, i64 %offset) sanitize_memory {395; CHECK-LABEL: define void @st1lane_ro_4s(396; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {397; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8398; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8399; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8400; CHECK-NEXT: call void @llvm.donothing()401; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]402; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]403; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 1404; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 1405; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0406; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]407; CHECK: 4:408; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]409; CHECK-NEXT: unreachable410; CHECK: 5:411; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64412; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576413; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr414; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4415; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4416; CHECK-NEXT: ret void417;418 %ptr = getelementptr i32, ptr %D, i64 %offset419 %tmp = extractelement <4 x i32> %A, i32 1420 store i32 %tmp, ptr %ptr421 ret void422}423 424define void @st1lane0_ro_4s(<4 x i32> %A, ptr %D, i64 %offset) sanitize_memory {425; CHECK-LABEL: define void @st1lane0_ro_4s(426; CHECK-SAME: <4 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {427; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8428; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8429; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8430; CHECK-NEXT: call void @llvm.donothing()431; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]432; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]433; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 0434; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i32> [[A]], i32 0435; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0436; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]437; CHECK: 4:438; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]439; CHECK-NEXT: unreachable440; CHECK: 5:441; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64442; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576443; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr444; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4445; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 4446; CHECK-NEXT: ret void447;448 %ptr = getelementptr i32, ptr %D, i64 %offset449 %tmp = extractelement <4 x i32> %A, i32 0450 store i32 %tmp, ptr %ptr451 ret void452}453 454define void @st1lane_4s_float(<4 x float> %A, ptr %D) sanitize_memory {455; CHECK-LABEL: define void @st1lane_4s_float(456; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {457; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8458; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8459; CHECK-NEXT: call void @llvm.donothing()460; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0461; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 1462; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 1463; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 1464; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0465; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]466; CHECK: 3:467; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]468; CHECK-NEXT: unreachable469; CHECK: 4:470; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64471; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576472; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr473; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4474; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4475; CHECK-NEXT: ret void476;477 %ptr = getelementptr float, ptr %D, i64 1478 %tmp = extractelement <4 x float> %A, i32 1479 store float %tmp, ptr %ptr480 ret void481}482 483define void @st1lane0_4s_float(<4 x float> %A, ptr %D) sanitize_memory {484; CHECK-LABEL: define void @st1lane0_4s_float(485; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {486; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8487; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8488; CHECK-NEXT: call void @llvm.donothing()489; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0490; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 1491; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0492; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 0493; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0494; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]495; CHECK: 3:496; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]497; CHECK-NEXT: unreachable498; CHECK: 4:499; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64500; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576501; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr502; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4503; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4504; CHECK-NEXT: ret void505;506 %ptr = getelementptr float, ptr %D, i64 1507 %tmp = extractelement <4 x float> %A, i32 0508 store float %tmp, ptr %ptr509 ret void510}511 512define void @st1lane0u_4s_float(<4 x float> %A, ptr %D) sanitize_memory {513; CHECK-LABEL: define void @st1lane0u_4s_float(514; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {515; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8516; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8517; CHECK-NEXT: call void @llvm.donothing()518; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0519; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 -1520; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0521; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 0522; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0523; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]524; CHECK: 3:525; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]526; CHECK-NEXT: unreachable527; CHECK: 4:528; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64529; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576530; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr531; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 4532; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4533; CHECK-NEXT: ret void534;535 %ptr = getelementptr float, ptr %D, i64 -1536 %tmp = extractelement <4 x float> %A, i32 0537 store float %tmp, ptr %ptr538 ret void539}540 541define void @st1lane_ro_4s_float(<4 x float> %A, ptr %D, i64 %offset) sanitize_memory {542; CHECK-LABEL: define void @st1lane_ro_4s_float(543; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {544; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8545; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8546; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8547; CHECK-NEXT: call void @llvm.donothing()548; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]549; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]550; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 1551; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 1552; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0553; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]554; CHECK: 4:555; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]556; CHECK-NEXT: unreachable557; CHECK: 5:558; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64559; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576560; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr561; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4562; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4563; CHECK-NEXT: ret void564;565 %ptr = getelementptr float, ptr %D, i64 %offset566 %tmp = extractelement <4 x float> %A, i32 1567 store float %tmp, ptr %ptr568 ret void569}570 571define void @st1lane0_ro_4s_float(<4 x float> %A, ptr %D, i64 %offset) sanitize_memory {572; CHECK-LABEL: define void @st1lane0_ro_4s_float(573; CHECK-SAME: <4 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {574; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8575; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8576; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 8577; CHECK-NEXT: call void @llvm.donothing()578; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]579; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]580; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i32> [[TMP3]], i32 0581; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x float> [[A]], i32 0582; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0583; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]584; CHECK: 4:585; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]586; CHECK-NEXT: unreachable587; CHECK: 5:588; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64589; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576590; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr591; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 4592; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 4593; CHECK-NEXT: ret void594;595 %ptr = getelementptr float, ptr %D, i64 %offset596 %tmp = extractelement <4 x float> %A, i32 0597 store float %tmp, ptr %ptr598 ret void599}600 601define void @st1lane_2d(<2 x i64> %A, ptr %D) sanitize_memory {602; CHECK-LABEL: define void @st1lane_2d(603; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {604; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8605; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8606; CHECK-NEXT: call void @llvm.donothing()607; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0608; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 1609; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 1610; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 1611; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0612; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]613; CHECK: 3:614; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]615; CHECK-NEXT: unreachable616; CHECK: 4:617; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64618; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576619; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr620; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8621; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8622; CHECK-NEXT: ret void623;624 %ptr = getelementptr i64, ptr %D, i64 1625 %tmp = extractelement <2 x i64> %A, i32 1626 store i64 %tmp, ptr %ptr627 ret void628}629 630define void @st1lane0_2d(<2 x i64> %A, ptr %D) sanitize_memory {631; CHECK-LABEL: define void @st1lane0_2d(632; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {633; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8634; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8635; CHECK-NEXT: call void @llvm.donothing()636; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0637; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 1638; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0639; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 0640; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0641; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]642; CHECK: 3:643; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]644; CHECK-NEXT: unreachable645; CHECK: 4:646; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64647; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576648; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr649; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8650; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8651; CHECK-NEXT: ret void652;653 %ptr = getelementptr i64, ptr %D, i64 1654 %tmp = extractelement <2 x i64> %A, i32 0655 store i64 %tmp, ptr %ptr656 ret void657}658 659define void @st1lane0u_2d(<2 x i64> %A, ptr %D) sanitize_memory {660; CHECK-LABEL: define void @st1lane0u_2d(661; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {662; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8663; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8664; CHECK-NEXT: call void @llvm.donothing()665; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0666; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 -1667; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0668; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 0669; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0670; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]671; CHECK: 3:672; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]673; CHECK-NEXT: unreachable674; CHECK: 4:675; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64676; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576677; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr678; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8679; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8680; CHECK-NEXT: ret void681;682 %ptr = getelementptr i64, ptr %D, i64 -1683 %tmp = extractelement <2 x i64> %A, i32 0684 store i64 %tmp, ptr %ptr685 ret void686}687 688define void @st1lane_ro_2d(<2 x i64> %A, ptr %D, i64 %offset) sanitize_memory {689; CHECK-LABEL: define void @st1lane_ro_2d(690; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {691; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8692; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8693; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8694; CHECK-NEXT: call void @llvm.donothing()695; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]696; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 [[OFFSET]]697; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 1698; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 1699; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0700; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]701; CHECK: 4:702; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]703; CHECK-NEXT: unreachable704; CHECK: 5:705; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64706; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576707; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr708; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8709; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8710; CHECK-NEXT: ret void711;712 %ptr = getelementptr i64, ptr %D, i64 %offset713 %tmp = extractelement <2 x i64> %A, i32 1714 store i64 %tmp, ptr %ptr715 ret void716}717 718define void @st1lane0_ro_2d(<2 x i64> %A, ptr %D, i64 %offset) sanitize_memory {719; CHECK-LABEL: define void @st1lane0_ro_2d(720; CHECK-SAME: <2 x i64> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {721; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8722; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8723; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8724; CHECK-NEXT: call void @llvm.donothing()725; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]726; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 [[OFFSET]]727; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 0728; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i64> [[A]], i32 0729; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0730; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]731; CHECK: 4:732; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]733; CHECK-NEXT: unreachable734; CHECK: 5:735; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64736; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576737; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr738; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8739; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 8740; CHECK-NEXT: ret void741;742 %ptr = getelementptr i64, ptr %D, i64 %offset743 %tmp = extractelement <2 x i64> %A, i32 0744 store i64 %tmp, ptr %ptr745 ret void746}747 748define void @st1lane_2d_double(<2 x double> %A, ptr %D) sanitize_memory {749; CHECK-LABEL: define void @st1lane_2d_double(750; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {751; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8752; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8753; CHECK-NEXT: call void @llvm.donothing()754; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0755; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 1756; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 1757; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 1758; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0759; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]760; CHECK: 3:761; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]762; CHECK-NEXT: unreachable763; CHECK: 4:764; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64765; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576766; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr767; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8768; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8769; CHECK-NEXT: ret void770;771 %ptr = getelementptr double, ptr %D, i64 1772 %tmp = extractelement <2 x double> %A, i32 1773 store double %tmp, ptr %ptr774 ret void775}776 777define void @st1lane0_2d_double(<2 x double> %A, ptr %D) sanitize_memory {778; CHECK-LABEL: define void @st1lane0_2d_double(779; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {780; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8781; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8782; CHECK-NEXT: call void @llvm.donothing()783; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0784; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 1785; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0786; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 0787; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0788; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]789; CHECK: 3:790; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]791; CHECK-NEXT: unreachable792; CHECK: 4:793; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64794; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576795; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr796; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8797; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8798; CHECK-NEXT: ret void799;800 %ptr = getelementptr double, ptr %D, i64 1801 %tmp = extractelement <2 x double> %A, i32 0802 store double %tmp, ptr %ptr803 ret void804}805 806define void @st1lane0u_2d_double(<2 x double> %A, ptr %D) sanitize_memory {807; CHECK-LABEL: define void @st1lane0u_2d_double(808; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {809; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8810; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8811; CHECK-NEXT: call void @llvm.donothing()812; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0813; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 -1814; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP2]], i32 0815; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 0816; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0817; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]818; CHECK: 3:819; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]820; CHECK-NEXT: unreachable821; CHECK: 4:822; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64823; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576824; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr825; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 8826; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8827; CHECK-NEXT: ret void828;829 %ptr = getelementptr double, ptr %D, i64 -1830 %tmp = extractelement <2 x double> %A, i32 0831 store double %tmp, ptr %ptr832 ret void833}834 835define void @st1lane_ro_2d_double(<2 x double> %A, ptr %D, i64 %offset) sanitize_memory {836; CHECK-LABEL: define void @st1lane_ro_2d_double(837; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {838; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8839; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8840; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8841; CHECK-NEXT: call void @llvm.donothing()842; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]843; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 [[OFFSET]]844; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 1845; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 1846; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0847; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]848; CHECK: 4:849; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]850; CHECK-NEXT: unreachable851; CHECK: 5:852; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64853; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576854; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr855; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8856; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8857; CHECK-NEXT: ret void858;859 %ptr = getelementptr double, ptr %D, i64 %offset860 %tmp = extractelement <2 x double> %A, i32 1861 store double %tmp, ptr %ptr862 ret void863}864 865define void @st1lane0_ro_2d_double(<2 x double> %A, ptr %D, i64 %offset) sanitize_memory {866; CHECK-LABEL: define void @st1lane0_ro_2d_double(867; CHECK-SAME: <2 x double> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {868; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8869; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 8870; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 8871; CHECK-NEXT: call void @llvm.donothing()872; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]873; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 [[OFFSET]]874; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i64> [[TMP3]], i32 0875; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x double> [[A]], i32 0876; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0877; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]878; CHECK: 4:879; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]880; CHECK-NEXT: unreachable881; CHECK: 5:882; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64883; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576884; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr885; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 8886; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 8887; CHECK-NEXT: ret void888;889 %ptr = getelementptr double, ptr %D, i64 %offset890 %tmp = extractelement <2 x double> %A, i32 0891 store double %tmp, ptr %ptr892 ret void893}894 895define void @st1lane_8b(<8 x i8> %A, ptr %D) sanitize_memory {896; CHECK-LABEL: define void @st1lane_8b(897; CHECK-SAME: <8 x i8> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {898; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 8899; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8900; CHECK-NEXT: call void @llvm.donothing()901; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0902; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 1903; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i8> [[TMP2]], i32 1904; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i8> [[A]], i32 1905; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0906; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]907; CHECK: 3:908; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]909; CHECK-NEXT: unreachable910; CHECK: 4:911; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i64912; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 193514046488576913; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr914; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP7]], align 1915; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1916; CHECK-NEXT: ret void917;918 %ptr = getelementptr i8, ptr %D, i64 1919 %tmp = extractelement <8 x i8> %A, i32 1920 store i8 %tmp, ptr %ptr921 ret void922}923 924define void @st1lane_ro_8b(<8 x i8> %A, ptr %D, i64 %offset) sanitize_memory {925; CHECK-LABEL: define void @st1lane_ro_8b(926; CHECK-SAME: <8 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {927; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 8928; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8929; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8930; CHECK-NEXT: call void @llvm.donothing()931; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]932; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]933; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i8> [[TMP3]], i32 1934; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i8> [[A]], i32 1935; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0936; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]937; CHECK: 4:938; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]939; CHECK-NEXT: unreachable940; CHECK: 5:941; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64942; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576943; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr944; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1945; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1946; CHECK-NEXT: ret void947;948 %ptr = getelementptr i8, ptr %D, i64 %offset949 %tmp = extractelement <8 x i8> %A, i32 1950 store i8 %tmp, ptr %ptr951 ret void952}953 954define void @st1lane0_ro_8b(<8 x i8> %A, ptr %D, i64 %offset) sanitize_memory {955; CHECK-LABEL: define void @st1lane0_ro_8b(956; CHECK-SAME: <8 x i8> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {957; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 8958; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 8959; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i8>, ptr @__msan_param_tls, align 8960; CHECK-NEXT: call void @llvm.donothing()961; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]962; CHECK-NEXT: [[PTR:%.*]] = getelementptr i8, ptr [[D]], i64 [[OFFSET]]963; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <8 x i8> [[TMP3]], i32 0964; CHECK-NEXT: [[TMP:%.*]] = extractelement <8 x i8> [[A]], i32 0965; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0966; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]967; CHECK: 4:968; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]969; CHECK-NEXT: unreachable970; CHECK: 5:971; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64972; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576973; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr974; CHECK-NEXT: store i8 [[_MSPROP1]], ptr [[TMP8]], align 1975; CHECK-NEXT: store i8 [[TMP]], ptr [[PTR]], align 1976; CHECK-NEXT: ret void977;978 %ptr = getelementptr i8, ptr %D, i64 %offset979 %tmp = extractelement <8 x i8> %A, i32 0980 store i8 %tmp, ptr %ptr981 ret void982}983 984define void @st1lane_4h(<4 x i16> %A, ptr %D) sanitize_memory {985; CHECK-LABEL: define void @st1lane_4h(986; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {987; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 8988; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 8989; CHECK-NEXT: call void @llvm.donothing()990; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 0991; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 1992; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP2]], i32 1993; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 1994; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 0995; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]996; CHECK: 3:997; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]998; CHECK-NEXT: unreachable999; CHECK: 4:1000; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641001; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761002; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1003; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 21004; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 21005; CHECK-NEXT: ret void1006;1007 %ptr = getelementptr i16, ptr %D, i64 11008 %tmp = extractelement <4 x i16> %A, i32 11009 store i16 %tmp, ptr %ptr1010 ret void1011}1012 1013define void @st1lane0_4h(<4 x i16> %A, ptr %D) sanitize_memory {1014; CHECK-LABEL: define void @st1lane0_4h(1015; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1016; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81017; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 81018; CHECK-NEXT: call void @llvm.donothing()1019; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01020; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 11021; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP2]], i32 01022; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 01023; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01024; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1025; CHECK: 3:1026; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1027; CHECK-NEXT: unreachable1028; CHECK: 4:1029; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641030; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761031; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1032; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 21033; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 21034; CHECK-NEXT: ret void1035;1036 %ptr = getelementptr i16, ptr %D, i64 11037 %tmp = extractelement <4 x i16> %A, i32 01038 store i16 %tmp, ptr %ptr1039 ret void1040}1041 1042define void @st1lane0u_4h(<4 x i16> %A, ptr %D) sanitize_memory {1043; CHECK-LABEL: define void @st1lane0u_4h(1044; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1045; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81046; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 81047; CHECK-NEXT: call void @llvm.donothing()1048; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01049; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 -11050; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP2]], i32 01051; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 01052; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01053; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1054; CHECK: 3:1055; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1056; CHECK-NEXT: unreachable1057; CHECK: 4:1058; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641059; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761060; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1061; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP7]], align 21062; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 21063; CHECK-NEXT: ret void1064;1065 %ptr = getelementptr i16, ptr %D, i64 -11066 %tmp = extractelement <4 x i16> %A, i32 01067 store i16 %tmp, ptr %ptr1068 ret void1069}1070 1071define void @st1lane_ro_4h(<4 x i16> %A, ptr %D, i64 %offset) sanitize_memory {1072; CHECK-LABEL: define void @st1lane_ro_4h(1073; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1074; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81075; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81076; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 81077; CHECK-NEXT: call void @llvm.donothing()1078; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1079; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]1080; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP3]], i32 11081; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 11082; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01083; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1084; CHECK: 4:1085; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1086; CHECK-NEXT: unreachable1087; CHECK: 5:1088; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641089; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761090; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1091; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 21092; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 21093; CHECK-NEXT: ret void1094;1095 %ptr = getelementptr i16, ptr %D, i64 %offset1096 %tmp = extractelement <4 x i16> %A, i32 11097 store i16 %tmp, ptr %ptr1098 ret void1099}1100 1101define void @st1lane0_ro_4h(<4 x i16> %A, ptr %D, i64 %offset) sanitize_memory {1102; CHECK-LABEL: define void @st1lane0_ro_4h(1103; CHECK-SAME: <4 x i16> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1104; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81105; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81106; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i16>, ptr @__msan_param_tls, align 81107; CHECK-NEXT: call void @llvm.donothing()1108; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1109; CHECK-NEXT: [[PTR:%.*]] = getelementptr i16, ptr [[D]], i64 [[OFFSET]]1110; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <4 x i16> [[TMP3]], i32 01111; CHECK-NEXT: [[TMP:%.*]] = extractelement <4 x i16> [[A]], i32 01112; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01113; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1114; CHECK: 4:1115; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1116; CHECK-NEXT: unreachable1117; CHECK: 5:1118; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641119; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761120; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1121; CHECK-NEXT: store i16 [[_MSPROP1]], ptr [[TMP8]], align 21122; CHECK-NEXT: store i16 [[TMP]], ptr [[PTR]], align 21123; CHECK-NEXT: ret void1124;1125 %ptr = getelementptr i16, ptr %D, i64 %offset1126 %tmp = extractelement <4 x i16> %A, i32 01127 store i16 %tmp, ptr %ptr1128 ret void1129}1130 1131define void @st1lane_2s(<2 x i32> %A, ptr %D) sanitize_memory {1132; CHECK-LABEL: define void @st1lane_2s(1133; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1134; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81135; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81136; CHECK-NEXT: call void @llvm.donothing()1137; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01138; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 11139; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 11140; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 11141; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01142; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1143; CHECK: 3:1144; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1145; CHECK-NEXT: unreachable1146; CHECK: 4:1147; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641148; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761149; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1150; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 41151; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 41152; CHECK-NEXT: ret void1153;1154 %ptr = getelementptr i32, ptr %D, i64 11155 %tmp = extractelement <2 x i32> %A, i32 11156 store i32 %tmp, ptr %ptr1157 ret void1158}1159 1160define void @st1lane0_2s(<2 x i32> %A, ptr %D) sanitize_memory {1161; CHECK-LABEL: define void @st1lane0_2s(1162; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1163; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81164; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81165; CHECK-NEXT: call void @llvm.donothing()1166; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01167; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 11168; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 01169; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 01170; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01171; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1172; CHECK: 3:1173; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1174; CHECK-NEXT: unreachable1175; CHECK: 4:1176; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641177; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761178; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1179; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 41180; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 41181; CHECK-NEXT: ret void1182;1183 %ptr = getelementptr i32, ptr %D, i64 11184 %tmp = extractelement <2 x i32> %A, i32 01185 store i32 %tmp, ptr %ptr1186 ret void1187}1188 1189define void @st1lane0u_2s(<2 x i32> %A, ptr %D) sanitize_memory {1190; CHECK-LABEL: define void @st1lane0u_2s(1191; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1192; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81193; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81194; CHECK-NEXT: call void @llvm.donothing()1195; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01196; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 -11197; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 01198; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 01199; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01200; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1201; CHECK: 3:1202; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1203; CHECK-NEXT: unreachable1204; CHECK: 4:1205; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641206; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761207; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1208; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 41209; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 41210; CHECK-NEXT: ret void1211;1212 %ptr = getelementptr i32, ptr %D, i64 -11213 %tmp = extractelement <2 x i32> %A, i32 01214 store i32 %tmp, ptr %ptr1215 ret void1216}1217 1218define void @st1lane_ro_2s(<2 x i32> %A, ptr %D, i64 %offset) sanitize_memory {1219; CHECK-LABEL: define void @st1lane_ro_2s(1220; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1221; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81222; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81223; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81224; CHECK-NEXT: call void @llvm.donothing()1225; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1226; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]1227; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 11228; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 11229; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01230; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1231; CHECK: 4:1232; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1233; CHECK-NEXT: unreachable1234; CHECK: 5:1235; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641236; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761237; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1238; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 41239; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 41240; CHECK-NEXT: ret void1241;1242 %ptr = getelementptr i32, ptr %D, i64 %offset1243 %tmp = extractelement <2 x i32> %A, i32 11244 store i32 %tmp, ptr %ptr1245 ret void1246}1247 1248define void @st1lane0_ro_2s(<2 x i32> %A, ptr %D, i64 %offset) sanitize_memory {1249; CHECK-LABEL: define void @st1lane0_ro_2s(1250; CHECK-SAME: <2 x i32> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1251; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81252; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81253; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81254; CHECK-NEXT: call void @llvm.donothing()1255; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1256; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, ptr [[D]], i64 [[OFFSET]]1257; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 01258; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x i32> [[A]], i32 01259; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01260; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1261; CHECK: 4:1262; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1263; CHECK-NEXT: unreachable1264; CHECK: 5:1265; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641266; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761267; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1268; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 41269; CHECK-NEXT: store i32 [[TMP]], ptr [[PTR]], align 41270; CHECK-NEXT: ret void1271;1272 %ptr = getelementptr i32, ptr %D, i64 %offset1273 %tmp = extractelement <2 x i32> %A, i32 01274 store i32 %tmp, ptr %ptr1275 ret void1276}1277 1278define void @st1lane_2s_float(<2 x float> %A, ptr %D) sanitize_memory {1279; CHECK-LABEL: define void @st1lane_2s_float(1280; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1281; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81282; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81283; CHECK-NEXT: call void @llvm.donothing()1284; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01285; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 11286; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 11287; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 11288; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01289; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1290; CHECK: 3:1291; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1292; CHECK-NEXT: unreachable1293; CHECK: 4:1294; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641295; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761296; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1297; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 41298; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 41299; CHECK-NEXT: ret void1300;1301 %ptr = getelementptr float, ptr %D, i64 11302 %tmp = extractelement <2 x float> %A, i32 11303 store float %tmp, ptr %ptr1304 ret void1305}1306 1307define void @st1lane0_2s_float(<2 x float> %A, ptr %D) sanitize_memory {1308; CHECK-LABEL: define void @st1lane0_2s_float(1309; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1310; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81311; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81312; CHECK-NEXT: call void @llvm.donothing()1313; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01314; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 11315; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 01316; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 01317; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01318; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1319; CHECK: 3:1320; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1321; CHECK-NEXT: unreachable1322; CHECK: 4:1323; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641324; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761325; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1326; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 41327; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 41328; CHECK-NEXT: ret void1329;1330 %ptr = getelementptr float, ptr %D, i64 11331 %tmp = extractelement <2 x float> %A, i32 01332 store float %tmp, ptr %ptr1333 ret void1334}1335 1336define void @st1lane0u_2s_float(<2 x float> %A, ptr %D) sanitize_memory {1337; CHECK-LABEL: define void @st1lane0u_2s_float(1338; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1339; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81340; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81341; CHECK-NEXT: call void @llvm.donothing()1342; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01343; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 -11344; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP2]], i32 01345; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 01346; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01347; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1348; CHECK: 3:1349; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1350; CHECK-NEXT: unreachable1351; CHECK: 4:1352; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641353; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761354; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1355; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP7]], align 41356; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 41357; CHECK-NEXT: ret void1358;1359 %ptr = getelementptr float, ptr %D, i64 -11360 %tmp = extractelement <2 x float> %A, i32 01361 store float %tmp, ptr %ptr1362 ret void1363}1364 1365define void @st1lane_ro_2s_float(<2 x float> %A, ptr %D, i64 %offset) sanitize_memory {1366; CHECK-LABEL: define void @st1lane_ro_2s_float(1367; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1368; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81369; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81370; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81371; CHECK-NEXT: call void @llvm.donothing()1372; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1373; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]1374; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 11375; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 11376; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01377; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1378; CHECK: 4:1379; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1380; CHECK-NEXT: unreachable1381; CHECK: 5:1382; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641383; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761384; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1385; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 41386; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 41387; CHECK-NEXT: ret void1388;1389 %ptr = getelementptr float, ptr %D, i64 %offset1390 %tmp = extractelement <2 x float> %A, i32 11391 store float %tmp, ptr %ptr1392 ret void1393}1394 1395define void @st1lane0_ro_2s_float(<2 x float> %A, ptr %D, i64 %offset) sanitize_memory {1396; CHECK-LABEL: define void @st1lane0_ro_2s_float(1397; CHECK-SAME: <2 x float> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1398; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81399; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81400; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i32>, ptr @__msan_param_tls, align 81401; CHECK-NEXT: call void @llvm.donothing()1402; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1403; CHECK-NEXT: [[PTR:%.*]] = getelementptr float, ptr [[D]], i64 [[OFFSET]]1404; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <2 x i32> [[TMP3]], i32 01405; CHECK-NEXT: [[TMP:%.*]] = extractelement <2 x float> [[A]], i32 01406; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01407; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1408; CHECK: 4:1409; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1410; CHECK-NEXT: unreachable1411; CHECK: 5:1412; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641413; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761414; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1415; CHECK-NEXT: store i32 [[_MSPROP1]], ptr [[TMP8]], align 41416; CHECK-NEXT: store float [[TMP]], ptr [[PTR]], align 41417; CHECK-NEXT: ret void1418;1419 %ptr = getelementptr float, ptr %D, i64 %offset1420 %tmp = extractelement <2 x float> %A, i32 01421 store float %tmp, ptr %ptr1422 ret void1423}1424 1425define void @st1lane0_1d(<1 x i64> %A, ptr %D) sanitize_memory {1426; CHECK-LABEL: define void @st1lane0_1d(1427; CHECK-SAME: <1 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1428; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81429; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 81430; CHECK-NEXT: call void @llvm.donothing()1431; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01432; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 11433; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 01434; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x i64> [[A]], i32 01435; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01436; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1437; CHECK: 3:1438; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1439; CHECK-NEXT: unreachable1440; CHECK: 4:1441; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641442; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761443; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1444; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 81445; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 81446; CHECK-NEXT: ret void1447;1448 %ptr = getelementptr i64, ptr %D, i64 11449 %tmp = extractelement <1 x i64> %A, i32 01450 store i64 %tmp, ptr %ptr1451 ret void1452}1453 1454define void @st1lane0u_1d(<1 x i64> %A, ptr %D) sanitize_memory {1455; CHECK-LABEL: define void @st1lane0u_1d(1456; CHECK-SAME: <1 x i64> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1457; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81458; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 81459; CHECK-NEXT: call void @llvm.donothing()1460; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01461; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 -11462; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 01463; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x i64> [[A]], i32 01464; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01465; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1466; CHECK: 3:1467; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1468; CHECK-NEXT: unreachable1469; CHECK: 4:1470; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641471; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761472; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1473; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 81474; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 81475; CHECK-NEXT: ret void1476;1477 %ptr = getelementptr i64, ptr %D, i64 -11478 %tmp = extractelement <1 x i64> %A, i32 01479 store i64 %tmp, ptr %ptr1480 ret void1481}1482 1483define void @st1lane0_ro_1d(<1 x i64> %A, ptr %D, i64 %offset) sanitize_memory {1484; CHECK-LABEL: define void @st1lane0_ro_1d(1485; CHECK-SAME: <1 x i64> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1486; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81487; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81488; CHECK-NEXT: [[TMP3:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 81489; CHECK-NEXT: call void @llvm.donothing()1490; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1491; CHECK-NEXT: [[PTR:%.*]] = getelementptr i64, ptr [[D]], i64 [[OFFSET]]1492; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP3]], i32 01493; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x i64> [[A]], i32 01494; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01495; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1496; CHECK: 4:1497; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1498; CHECK-NEXT: unreachable1499; CHECK: 5:1500; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641501; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761502; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1503; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 81504; CHECK-NEXT: store i64 [[TMP]], ptr [[PTR]], align 81505; CHECK-NEXT: ret void1506;1507 %ptr = getelementptr i64, ptr %D, i64 %offset1508 %tmp = extractelement <1 x i64> %A, i32 01509 store i64 %tmp, ptr %ptr1510 ret void1511}1512 1513define void @st1lane0_1d_double(<1 x double> %A, ptr %D) sanitize_memory {1514; CHECK-LABEL: define void @st1lane0_1d_double(1515; CHECK-SAME: <1 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1516; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81517; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 81518; CHECK-NEXT: call void @llvm.donothing()1519; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01520; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 11521; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 01522; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x double> [[A]], i32 01523; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01524; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1525; CHECK: 3:1526; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1527; CHECK-NEXT: unreachable1528; CHECK: 4:1529; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641530; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761531; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1532; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 81533; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 81534; CHECK-NEXT: ret void1535;1536 %ptr = getelementptr double, ptr %D, i64 11537 %tmp = extractelement <1 x double> %A, i32 01538 store double %tmp, ptr %ptr1539 ret void1540}1541 1542define void @st1lane0u_1d_double(<1 x double> %A, ptr %D) sanitize_memory {1543; CHECK-LABEL: define void @st1lane0u_1d_double(1544; CHECK-SAME: <1 x double> [[A:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1545; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81546; CHECK-NEXT: [[TMP2:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 81547; CHECK-NEXT: call void @llvm.donothing()1548; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], 01549; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 -11550; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP2]], i32 01551; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x double> [[A]], i32 01552; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01553; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP3:%.*]], label [[TMP4:%.*]], !prof [[PROF1]]1554; CHECK: 3:1555; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1556; CHECK-NEXT: unreachable1557; CHECK: 4:1558; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[PTR]] to i641559; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761560; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1561; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP7]], align 81562; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 81563; CHECK-NEXT: ret void1564;1565 %ptr = getelementptr double, ptr %D, i64 -11566 %tmp = extractelement <1 x double> %A, i32 01567 store double %tmp, ptr %ptr1568 ret void1569}1570 1571define void @st1lane0_ro_1d_double(<1 x double> %A, ptr %D, i64 %offset) sanitize_memory {1572; CHECK-LABEL: define void @st1lane0_ro_1d_double(1573; CHECK-SAME: <1 x double> [[A:%.*]], ptr [[D:%.*]], i64 [[OFFSET:%.*]]) #[[ATTR0]] {1574; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 81575; CHECK-NEXT: [[TMP2:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81576; CHECK-NEXT: [[TMP3:%.*]] = load <1 x i64>, ptr @__msan_param_tls, align 81577; CHECK-NEXT: call void @llvm.donothing()1578; CHECK-NEXT: [[_MSPROP:%.*]] = or i64 [[TMP1]], [[TMP2]]1579; CHECK-NEXT: [[PTR:%.*]] = getelementptr double, ptr [[D]], i64 [[OFFSET]]1580; CHECK-NEXT: [[_MSPROP1:%.*]] = extractelement <1 x i64> [[TMP3]], i32 01581; CHECK-NEXT: [[TMP:%.*]] = extractelement <1 x double> [[A]], i32 01582; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP]], 01583; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP4:%.*]], label [[TMP5:%.*]], !prof [[PROF1]]1584; CHECK: 4:1585; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1586; CHECK-NEXT: unreachable1587; CHECK: 5:1588; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i641589; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761590; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1591; CHECK-NEXT: store i64 [[_MSPROP1]], ptr [[TMP8]], align 81592; CHECK-NEXT: store double [[TMP]], ptr [[PTR]], align 81593; CHECK-NEXT: ret void1594;1595 %ptr = getelementptr double, ptr %D, i64 %offset1596 %tmp = extractelement <1 x double> %A, i32 01597 store double %tmp, ptr %ptr1598 ret void1599}1600 1601define void @st2lane_16b(<16 x i8> %A, <16 x i8> %B, ptr %D) sanitize_memory {1602; CHECK-LABEL: define void @st2lane_16b(1603; CHECK-SAME: <16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1604; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81605; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 81606; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81607; CHECK-NEXT: call void @llvm.donothing()1608; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i641609; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 1935140464885761610; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr1611; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> [[TMP2]], <16 x i8> [[TMP3]], i64 1, ptr [[TMP6]])1612; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01613; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF1]]1614; CHECK: 7:1615; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1616; CHECK-NEXT: unreachable1617; CHECK: 8:1618; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> [[A]], <16 x i8> [[B]], i64 1, ptr [[D]])1619; CHECK-NEXT: ret void1620;1621 call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> %A, <16 x i8> %B, i64 1, ptr %D)1622 ret void1623}1624 1625define void @st2lane_8h(<8 x i16> %A, <8 x i16> %B, ptr %D) sanitize_memory {1626; CHECK-LABEL: define void @st2lane_8h(1627; CHECK-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1628; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81629; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 81630; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81631; CHECK-NEXT: call void @llvm.donothing()1632; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i641633; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 1935140464885761634; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr1635; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> [[TMP2]], <8 x i16> [[TMP3]], i64 1, ptr [[TMP6]])1636; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01637; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF1]]1638; CHECK: 7:1639; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1640; CHECK-NEXT: unreachable1641; CHECK: 8:1642; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> [[A]], <8 x i16> [[B]], i64 1, ptr [[D]])1643; CHECK-NEXT: ret void1644;1645 call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> %A, <8 x i16> %B, i64 1, ptr %D)1646 ret void1647}1648 1649define void @st2lane_4s(<4 x i32> %A, <4 x i32> %B, ptr %D) sanitize_memory {1650; CHECK-LABEL: define void @st2lane_4s(1651; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1652; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81653; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 81654; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81655; CHECK-NEXT: call void @llvm.donothing()1656; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i641657; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 1935140464885761658; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr1659; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], i64 1, ptr [[TMP6]])1660; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01661; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF1]]1662; CHECK: 7:1663; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1664; CHECK-NEXT: unreachable1665; CHECK: 8:1666; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> [[A]], <4 x i32> [[B]], i64 1, ptr [[D]])1667; CHECK-NEXT: ret void1668;1669 call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> %A, <4 x i32> %B, i64 1, ptr %D)1670 ret void1671}1672 1673define void @st2lane_2d(<2 x i64> %A, <2 x i64> %B, ptr %D) sanitize_memory {1674; CHECK-LABEL: define void @st2lane_2d(1675; CHECK-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1676; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81677; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 81678; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81679; CHECK-NEXT: call void @llvm.donothing()1680; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[D]] to i641681; CHECK-NEXT: [[TMP5:%.*]] = xor i64 [[TMP4]], 1935140464885761682; CHECK-NEXT: [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr1683; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], i64 1, ptr [[TMP6]])1684; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01685; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF1]]1686; CHECK: 7:1687; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1688; CHECK-NEXT: unreachable1689; CHECK: 8:1690; CHECK-NEXT: call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> [[A]], <2 x i64> [[B]], i64 1, ptr [[D]])1691; CHECK-NEXT: ret void1692;1693 call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> %A, <2 x i64> %B, i64 1, ptr %D)1694 ret void1695}1696 1697declare void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr) nounwind readnone1698declare void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr) nounwind readnone1699declare void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr) nounwind readnone1700declare void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr) nounwind readnone1701 1702define void @st3lane_16b(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, ptr %D) sanitize_memory {1703; CHECK-LABEL: define void @st3lane_16b(1704; CHECK-SAME: <16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], <16 x i8> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1705; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81706; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 81707; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81708; CHECK-NEXT: [[TMP4:%.*]] = load <16 x i8>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81709; CHECK-NEXT: call void @llvm.donothing()1710; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i641711; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761712; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1713; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> [[TMP2]], <16 x i8> [[TMP3]], <16 x i8> [[TMP4]], i64 1, ptr [[TMP7]])1714; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01715; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF1]]1716; CHECK: 8:1717; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1718; CHECK-NEXT: unreachable1719; CHECK: 9:1720; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> [[A]], <16 x i8> [[B]], <16 x i8> [[C]], i64 1, ptr [[D]])1721; CHECK-NEXT: ret void1722;1723 call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, i64 1, ptr %D)1724 ret void1725}1726 1727define void @st3lane_8h(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, ptr %D) sanitize_memory {1728; CHECK-LABEL: define void @st3lane_8h(1729; CHECK-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i16> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1730; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81731; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 81732; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81733; CHECK-NEXT: [[TMP4:%.*]] = load <8 x i16>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81734; CHECK-NEXT: call void @llvm.donothing()1735; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i641736; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761737; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1738; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> [[TMP2]], <8 x i16> [[TMP3]], <8 x i16> [[TMP4]], i64 1, ptr [[TMP7]])1739; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01740; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF1]]1741; CHECK: 8:1742; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1743; CHECK-NEXT: unreachable1744; CHECK: 9:1745; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> [[A]], <8 x i16> [[B]], <8 x i16> [[C]], i64 1, ptr [[D]])1746; CHECK-NEXT: ret void1747;1748 call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, i64 1, ptr %D)1749 ret void1750}1751 1752define void @st3lane_4s(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, ptr %D) sanitize_memory {1753; CHECK-LABEL: define void @st3lane_4s(1754; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1755; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81756; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 81757; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81758; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81759; CHECK-NEXT: call void @llvm.donothing()1760; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i641761; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761762; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1763; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], i64 1, ptr [[TMP7]])1764; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01765; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF1]]1766; CHECK: 8:1767; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1768; CHECK-NEXT: unreachable1769; CHECK: 9:1770; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> [[C]], i64 1, ptr [[D]])1771; CHECK-NEXT: ret void1772;1773 call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, i64 1, ptr %D)1774 ret void1775}1776 1777define void @st3lane_2d(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, ptr %D) sanitize_memory {1778; CHECK-LABEL: define void @st3lane_2d(1779; CHECK-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], <2 x i64> [[C:%.*]], ptr [[D:%.*]]) #[[ATTR0]] {1780; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81781; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 81782; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81783; CHECK-NEXT: [[TMP4:%.*]] = load <2 x i64>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81784; CHECK-NEXT: call void @llvm.donothing()1785; CHECK-NEXT: [[TMP5:%.*]] = ptrtoint ptr [[D]] to i641786; CHECK-NEXT: [[TMP6:%.*]] = xor i64 [[TMP5]], 1935140464885761787; CHECK-NEXT: [[TMP7:%.*]] = inttoptr i64 [[TMP6]] to ptr1788; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], i64 1, ptr [[TMP7]])1789; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01790; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP8:%.*]], label [[TMP9:%.*]], !prof [[PROF1]]1791; CHECK: 8:1792; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1793; CHECK-NEXT: unreachable1794; CHECK: 9:1795; CHECK-NEXT: call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> [[A]], <2 x i64> [[B]], <2 x i64> [[C]], i64 1, ptr [[D]])1796; CHECK-NEXT: ret void1797;1798 call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, i64 1, ptr %D)1799 ret void1800}1801 1802declare void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readnone1803declare void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readnone1804declare void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readnone1805declare void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readnone1806 1807define void @st4lane_16b(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %E) sanitize_memory {1808; CHECK-LABEL: define void @st4lane_16b(1809; CHECK-SAME: <16 x i8> [[A:%.*]], <16 x i8> [[B:%.*]], <16 x i8> [[C:%.*]], <16 x i8> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {1810; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 64), align 81811; CHECK-NEXT: [[TMP2:%.*]] = load <16 x i8>, ptr @__msan_param_tls, align 81812; CHECK-NEXT: [[TMP3:%.*]] = load <16 x i8>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81813; CHECK-NEXT: [[TMP4:%.*]] = load <16 x i8>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81814; CHECK-NEXT: [[TMP5:%.*]] = load <16 x i8>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81815; CHECK-NEXT: call void @llvm.donothing()1816; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i641817; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761818; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1819; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> [[TMP2]], <16 x i8> [[TMP3]], <16 x i8> [[TMP4]], <16 x i8> [[TMP5]], i64 1, ptr [[TMP8]])1820; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01821; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF1]]1822; CHECK: 9:1823; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1824; CHECK-NEXT: unreachable1825; CHECK: 10:1826; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> [[A]], <16 x i8> [[B]], <16 x i8> [[C]], <16 x i8> [[D]], i64 1, ptr [[E]])1827; CHECK-NEXT: ret void1828;1829 call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> %A, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 1, ptr %E)1830 ret void1831}1832 1833define void @st4lane_8h(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %E) sanitize_memory {1834; CHECK-LABEL: define void @st4lane_8h(1835; CHECK-SAME: <8 x i16> [[A:%.*]], <8 x i16> [[B:%.*]], <8 x i16> [[C:%.*]], <8 x i16> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {1836; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 64), align 81837; CHECK-NEXT: [[TMP2:%.*]] = load <8 x i16>, ptr @__msan_param_tls, align 81838; CHECK-NEXT: [[TMP3:%.*]] = load <8 x i16>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81839; CHECK-NEXT: [[TMP4:%.*]] = load <8 x i16>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81840; CHECK-NEXT: [[TMP5:%.*]] = load <8 x i16>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81841; CHECK-NEXT: call void @llvm.donothing()1842; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i641843; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761844; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1845; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> [[TMP2]], <8 x i16> [[TMP3]], <8 x i16> [[TMP4]], <8 x i16> [[TMP5]], i64 1, ptr [[TMP8]])1846; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01847; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF1]]1848; CHECK: 9:1849; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1850; CHECK-NEXT: unreachable1851; CHECK: 10:1852; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> [[A]], <8 x i16> [[B]], <8 x i16> [[C]], <8 x i16> [[D]], i64 1, ptr [[E]])1853; CHECK-NEXT: ret void1854;1855 call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> %A, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 1, ptr %E)1856 ret void1857}1858 1859define void @st4lane_4s(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %E) sanitize_memory {1860; CHECK-LABEL: define void @st4lane_4s(1861; CHECK-SAME: <4 x i32> [[A:%.*]], <4 x i32> [[B:%.*]], <4 x i32> [[C:%.*]], <4 x i32> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {1862; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 64), align 81863; CHECK-NEXT: [[TMP2:%.*]] = load <4 x i32>, ptr @__msan_param_tls, align 81864; CHECK-NEXT: [[TMP3:%.*]] = load <4 x i32>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81865; CHECK-NEXT: [[TMP4:%.*]] = load <4 x i32>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81866; CHECK-NEXT: [[TMP5:%.*]] = load <4 x i32>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81867; CHECK-NEXT: call void @llvm.donothing()1868; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i641869; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761870; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1871; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> [[TMP5]], i64 1, ptr [[TMP8]])1872; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01873; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF1]]1874; CHECK: 9:1875; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1876; CHECK-NEXT: unreachable1877; CHECK: 10:1878; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> [[A]], <4 x i32> [[B]], <4 x i32> [[C]], <4 x i32> [[D]], i64 1, ptr [[E]])1879; CHECK-NEXT: ret void1880;1881 call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> %A, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 1, ptr %E)1882 ret void1883}1884 1885define void @st4lane_2d(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %E) sanitize_memory {1886; CHECK-LABEL: define void @st4lane_2d(1887; CHECK-SAME: <2 x i64> [[A:%.*]], <2 x i64> [[B:%.*]], <2 x i64> [[C:%.*]], <2 x i64> [[D:%.*]], ptr [[E:%.*]]) #[[ATTR0]] {1888; CHECK-NEXT: [[TMP1:%.*]] = load i64, ptr getelementptr (i8, ptr @__msan_param_tls, i64 64), align 81889; CHECK-NEXT: [[TMP2:%.*]] = load <2 x i64>, ptr @__msan_param_tls, align 81890; CHECK-NEXT: [[TMP3:%.*]] = load <2 x i64>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 81891; CHECK-NEXT: [[TMP4:%.*]] = load <2 x i64>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 32), align 81892; CHECK-NEXT: [[TMP5:%.*]] = load <2 x i64>, ptr getelementptr (i8, ptr @__msan_param_tls, i64 48), align 81893; CHECK-NEXT: call void @llvm.donothing()1894; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[E]] to i641895; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 1935140464885761896; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr1897; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> [[TMP2]], <2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]], i64 1, ptr [[TMP8]])1898; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i64 [[TMP1]], 01899; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP9:%.*]], label [[TMP10:%.*]], !prof [[PROF1]]1900; CHECK: 9:1901; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4]]1902; CHECK-NEXT: unreachable1903; CHECK: 10:1904; CHECK-NEXT: call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> [[A]], <2 x i64> [[B]], <2 x i64> [[C]], <2 x i64> [[D]], i64 1, ptr [[E]])1905; CHECK-NEXT: ret void1906;1907 call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> %A, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 1, ptr %E)1908 ret void1909}1910 1911declare void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readnone1912declare void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readnone1913declare void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readnone1914declare void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readnone1915;.1916; CHECK: [[PROF1]] = !{!"branch_weights", i32 1, i32 1048575}1917;.1918