llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Thurston Dang (thurstond)

<details>
<summary>Changes</summary>

These tests show that MSan currently does not handle vst (or vld) correctly.

---

Patch is 1.22 MiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/98247.diff


2 Files Affected:

- (added) clang/test/CodeGen/aarch64-neon-intrinsics-msan-vst.c (+1250) 
- (added) clang/test/CodeGen/aarch64-neon-intrinsics-msan.c (+18071) 


``````````diff
diff --git a/clang/test/CodeGen/aarch64-neon-intrinsics-msan-vst.c 
b/clang/test/CodeGen/aarch64-neon-intrinsics-msan-vst.c
new file mode 100644
index 0000000000000..c0cfe093a1a18
--- /dev/null
+++ b/clang/test/CodeGen/aarch64-neon-intrinsics-msan-vst.c
@@ -0,0 +1,1250 @@
+// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py 
UTC_ARGS: --version 4
+// RUN: %clang_cc1 -triple arm64-none-linux-gnu -target-feature +neon \
+// RUN:     -S \
+// RUN:  -emit-llvm -o - %s -fsanitize=memory \
+// RUN: | FileCheck %s
+
+// REQUIRES: aarch64-registered-target || arm-registered-target
+
+#include <arm_neon.h>
+#include <sanitizer/msan_interface.h>
+
+// CHECK-LABEL: define dso_local noundef i32 @test_vst1(
+// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    call void @llvm.donothing()
+// CHECK-NEXT:    [[__P0_ADDR_I:%.*]] = alloca i16, align 2
+// CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP1:%.*]] = xor i64 [[TMP0]], 193514046488576
+// CHECK-NEXT:    [[TMP2:%.*]] = inttoptr i64 [[TMP1]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 2 [[TMP2]], i8 -1, 
i64 2, i1 false)
+// CHECK-NEXT:    [[__RET_I:%.*]] = alloca <8 x i16>, align 16
+// CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I:%.*]] = alloca <8 x i16>, align 16
+// CHECK-NEXT:    [[TMP3:%.*]] = ptrtoint ptr [[DOTCOMPOUNDLITERAL_I]] to i64
+// CHECK-NEXT:    [[TMP4:%.*]] = xor i64 [[TMP3]], 193514046488576
+// CHECK-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[TMP5]], i8 -1, 
i64 16, i1 false)
+// CHECK-NEXT:    [[VEC1:%.*]] = alloca <8 x i16>, align 16
+// CHECK-NEXT:    [[DST1:%.*]] = alloca [8 x i16], align 2
+// CHECK-NEXT:    [[__S1:%.*]] = alloca <8 x i16>, align 16
+// CHECK-NEXT:    [[SUM:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[VEC1]]) 
#[[ATTR4:[0-9]+]]
+// CHECK-NEXT:    [[TMP6:%.*]] = ptrtoint ptr [[VEC1]] to i64
+// CHECK-NEXT:    [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
+// CHECK-NEXT:    [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[TMP8]], i8 -1, 
i64 16, i1 false)
+// CHECK-NEXT:    [[TMP9:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP10:%.*]] = xor i64 [[TMP9]], 193514046488576
+// CHECK-NEXT:    [[TMP11:%.*]] = inttoptr i64 [[TMP10]] to ptr
+// CHECK-NEXT:    store i16 0, ptr [[TMP11]], align 2
+// CHECK-NEXT:    store i16 15, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[__RET_I]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[TMP12:%.*]] = ptrtoint ptr [[__RET_I]] to i64
+// CHECK-NEXT:    [[TMP13:%.*]] = xor i64 [[TMP12]], 193514046488576
+// CHECK-NEXT:    [[TMP14:%.*]] = inttoptr i64 [[TMP13]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[TMP14]], i8 -1, 
i64 16, i1 false)
+// CHECK-NEXT:    [[TMP15:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP16:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP17:%.*]] = xor i64 [[TMP16]], 193514046488576
+// CHECK-NEXT:    [[TMP18:%.*]] = inttoptr i64 [[TMP17]] to ptr
+// CHECK-NEXT:    [[_MSLD:%.*]] = load i16, ptr [[TMP18]], align 2
+// CHECK-NEXT:    [[_MSPROP:%.*]] = insertelement <8 x i16> <i16 -1, i16 -1, 
i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>, i16 [[_MSLD]], i32 0
+// CHECK-NEXT:    [[VECINIT_I:%.*]] = insertelement <8 x i16> poison, i16 
[[TMP15]], i32 0
+// CHECK-NEXT:    [[TMP19:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP20:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP21:%.*]] = xor i64 [[TMP20]], 193514046488576
+// CHECK-NEXT:    [[TMP22:%.*]] = inttoptr i64 [[TMP21]] to ptr
+// CHECK-NEXT:    [[_MSLD2:%.*]] = load i16, ptr [[TMP22]], align 2
+// CHECK-NEXT:    [[_MSPROP3:%.*]] = insertelement <8 x i16> [[_MSPROP]], i16 
[[_MSLD2]], i32 1
+// CHECK-NEXT:    [[VECINIT1_I:%.*]] = insertelement <8 x i16> [[VECINIT_I]], 
i16 [[TMP19]], i32 1
+// CHECK-NEXT:    [[TMP23:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP24:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP25:%.*]] = xor i64 [[TMP24]], 193514046488576
+// CHECK-NEXT:    [[TMP26:%.*]] = inttoptr i64 [[TMP25]] to ptr
+// CHECK-NEXT:    [[_MSLD4:%.*]] = load i16, ptr [[TMP26]], align 2
+// CHECK-NEXT:    [[_MSPROP5:%.*]] = insertelement <8 x i16> [[_MSPROP3]], i16 
[[_MSLD4]], i32 2
+// CHECK-NEXT:    [[VECINIT2_I:%.*]] = insertelement <8 x i16> [[VECINIT1_I]], 
i16 [[TMP23]], i32 2
+// CHECK-NEXT:    [[TMP27:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP28:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP29:%.*]] = xor i64 [[TMP28]], 193514046488576
+// CHECK-NEXT:    [[TMP30:%.*]] = inttoptr i64 [[TMP29]] to ptr
+// CHECK-NEXT:    [[_MSLD6:%.*]] = load i16, ptr [[TMP30]], align 2
+// CHECK-NEXT:    [[_MSPROP7:%.*]] = insertelement <8 x i16> [[_MSPROP5]], i16 
[[_MSLD6]], i32 3
+// CHECK-NEXT:    [[VECINIT3_I:%.*]] = insertelement <8 x i16> [[VECINIT2_I]], 
i16 [[TMP27]], i32 3
+// CHECK-NEXT:    [[TMP31:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP32:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP33:%.*]] = xor i64 [[TMP32]], 193514046488576
+// CHECK-NEXT:    [[TMP34:%.*]] = inttoptr i64 [[TMP33]] to ptr
+// CHECK-NEXT:    [[_MSLD8:%.*]] = load i16, ptr [[TMP34]], align 2
+// CHECK-NEXT:    [[_MSPROP9:%.*]] = insertelement <8 x i16> [[_MSPROP7]], i16 
[[_MSLD8]], i32 4
+// CHECK-NEXT:    [[VECINIT4_I:%.*]] = insertelement <8 x i16> [[VECINIT3_I]], 
i16 [[TMP31]], i32 4
+// CHECK-NEXT:    [[TMP35:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP36:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP37:%.*]] = xor i64 [[TMP36]], 193514046488576
+// CHECK-NEXT:    [[TMP38:%.*]] = inttoptr i64 [[TMP37]] to ptr
+// CHECK-NEXT:    [[_MSLD10:%.*]] = load i16, ptr [[TMP38]], align 2
+// CHECK-NEXT:    [[_MSPROP11:%.*]] = insertelement <8 x i16> [[_MSPROP9]], 
i16 [[_MSLD10]], i32 5
+// CHECK-NEXT:    [[VECINIT5_I:%.*]] = insertelement <8 x i16> [[VECINIT4_I]], 
i16 [[TMP35]], i32 5
+// CHECK-NEXT:    [[TMP39:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP40:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP41:%.*]] = xor i64 [[TMP40]], 193514046488576
+// CHECK-NEXT:    [[TMP42:%.*]] = inttoptr i64 [[TMP41]] to ptr
+// CHECK-NEXT:    [[_MSLD12:%.*]] = load i16, ptr [[TMP42]], align 2
+// CHECK-NEXT:    [[_MSPROP13:%.*]] = insertelement <8 x i16> [[_MSPROP11]], 
i16 [[_MSLD12]], i32 6
+// CHECK-NEXT:    [[VECINIT6_I:%.*]] = insertelement <8 x i16> [[VECINIT5_I]], 
i16 [[TMP39]], i32 6
+// CHECK-NEXT:    [[TMP43:%.*]] = load i16, ptr [[__P0_ADDR_I]], align 2
+// CHECK-NEXT:    [[TMP44:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP45:%.*]] = xor i64 [[TMP44]], 193514046488576
+// CHECK-NEXT:    [[TMP46:%.*]] = inttoptr i64 [[TMP45]] to ptr
+// CHECK-NEXT:    [[_MSLD14:%.*]] = load i16, ptr [[TMP46]], align 2
+// CHECK-NEXT:    [[_MSPROP15:%.*]] = insertelement <8 x i16> [[_MSPROP13]], 
i16 [[_MSLD14]], i32 7
+// CHECK-NEXT:    [[VECINIT7_I:%.*]] = insertelement <8 x i16> [[VECINIT6_I]], 
i16 [[TMP43]], i32 7
+// CHECK-NEXT:    [[TMP47:%.*]] = ptrtoint ptr [[DOTCOMPOUNDLITERAL_I]] to i64
+// CHECK-NEXT:    [[TMP48:%.*]] = xor i64 [[TMP47]], 193514046488576
+// CHECK-NEXT:    [[TMP49:%.*]] = inttoptr i64 [[TMP48]] to ptr
+// CHECK-NEXT:    store <8 x i16> [[_MSPROP15]], ptr [[TMP49]], align 16
+// CHECK-NEXT:    store <8 x i16> [[VECINIT7_I]], ptr 
[[DOTCOMPOUNDLITERAL_I]], align 16
+// CHECK-NEXT:    [[TMP50:%.*]] = load <8 x i16>, ptr 
[[DOTCOMPOUNDLITERAL_I]], align 16
+// CHECK-NEXT:    [[TMP51:%.*]] = ptrtoint ptr [[DOTCOMPOUNDLITERAL_I]] to i64
+// CHECK-NEXT:    [[TMP52:%.*]] = xor i64 [[TMP51]], 193514046488576
+// CHECK-NEXT:    [[TMP53:%.*]] = inttoptr i64 [[TMP52]] to ptr
+// CHECK-NEXT:    [[_MSLD16:%.*]] = load <8 x i16>, ptr [[TMP53]], align 16
+// CHECK-NEXT:    [[TMP54:%.*]] = ptrtoint ptr [[__RET_I]] to i64
+// CHECK-NEXT:    [[TMP55:%.*]] = xor i64 [[TMP54]], 193514046488576
+// CHECK-NEXT:    [[TMP56:%.*]] = inttoptr i64 [[TMP55]] to ptr
+// CHECK-NEXT:    store <8 x i16> [[_MSLD16]], ptr [[TMP56]], align 16
+// CHECK-NEXT:    store <8 x i16> [[TMP50]], ptr [[__RET_I]], align 16
+// CHECK-NEXT:    [[TMP57:%.*]] = load <8 x i16>, ptr [[__RET_I]], align 16
+// CHECK-NEXT:    [[TMP58:%.*]] = ptrtoint ptr [[__RET_I]] to i64
+// CHECK-NEXT:    [[TMP59:%.*]] = xor i64 [[TMP58]], 193514046488576
+// CHECK-NEXT:    [[TMP60:%.*]] = inttoptr i64 [[TMP59]] to ptr
+// CHECK-NEXT:    [[_MSLD17:%.*]] = load <8 x i16>, ptr [[TMP60]], align 16
+// CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[__RET_I]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[TMP61:%.*]] = ptrtoint ptr [[VEC1]] to i64
+// CHECK-NEXT:    [[TMP62:%.*]] = xor i64 [[TMP61]], 193514046488576
+// CHECK-NEXT:    [[TMP63:%.*]] = inttoptr i64 [[TMP62]] to ptr
+// CHECK-NEXT:    store <8 x i16> [[_MSLD17]], ptr [[TMP63]], align 16
+// CHECK-NEXT:    store <8 x i16> [[TMP57]], ptr [[VEC1]], align 16
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[DST1]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[TMP64:%.*]] = ptrtoint ptr [[DST1]] to i64
+// CHECK-NEXT:    [[TMP65:%.*]] = xor i64 [[TMP64]], 193514046488576
+// CHECK-NEXT:    [[TMP66:%.*]] = inttoptr i64 [[TMP65]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 2 [[TMP66]], i8 -1, 
i64 16, i1 false)
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 16, ptr [[__S1]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[TMP67:%.*]] = ptrtoint ptr [[__S1]] to i64
+// CHECK-NEXT:    [[TMP68:%.*]] = xor i64 [[TMP67]], 193514046488576
+// CHECK-NEXT:    [[TMP69:%.*]] = inttoptr i64 [[TMP68]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[TMP69]], i8 -1, 
i64 16, i1 false)
+// CHECK-NEXT:    [[TMP70:%.*]] = load <8 x i16>, ptr [[VEC1]], align 16
+// CHECK-NEXT:    [[TMP71:%.*]] = ptrtoint ptr [[VEC1]] to i64
+// CHECK-NEXT:    [[TMP72:%.*]] = xor i64 [[TMP71]], 193514046488576
+// CHECK-NEXT:    [[TMP73:%.*]] = inttoptr i64 [[TMP72]] to ptr
+// CHECK-NEXT:    [[_MSLD18:%.*]] = load <8 x i16>, ptr [[TMP73]], align 16
+// CHECK-NEXT:    [[TMP74:%.*]] = ptrtoint ptr [[__S1]] to i64
+// CHECK-NEXT:    [[TMP75:%.*]] = xor i64 [[TMP74]], 193514046488576
+// CHECK-NEXT:    [[TMP76:%.*]] = inttoptr i64 [[TMP75]] to ptr
+// CHECK-NEXT:    store <8 x i16> [[_MSLD18]], ptr [[TMP76]], align 16
+// CHECK-NEXT:    store <8 x i16> [[TMP70]], ptr [[__S1]], align 16
+// CHECK-NEXT:    [[ARRAYDECAY:%.*]] = getelementptr inbounds [8 x i16], ptr 
[[DST1]], i64 0, i64 0
+// CHECK-NEXT:    [[TMP77:%.*]] = load <8 x i16>, ptr [[__S1]], align 16
+// CHECK-NEXT:    [[TMP78:%.*]] = ptrtoint ptr [[__S1]] to i64
+// CHECK-NEXT:    [[TMP79:%.*]] = xor i64 [[TMP78]], 193514046488576
+// CHECK-NEXT:    [[TMP80:%.*]] = inttoptr i64 [[TMP79]] to ptr
+// CHECK-NEXT:    [[_MSLD19:%.*]] = load <8 x i16>, ptr [[TMP80]], align 16
+// CHECK-NEXT:    [[TMP81:%.*]] = bitcast <8 x i16> [[_MSLD19]] to <16 x i8>
+// CHECK-NEXT:    [[TMP82:%.*]] = bitcast <8 x i16> [[TMP77]] to <16 x i8>
+// CHECK-NEXT:    [[TMP83:%.*]] = bitcast <16 x i8> [[TMP81]] to <8 x i16>
+// CHECK-NEXT:    [[TMP84:%.*]] = bitcast <16 x i8> [[TMP82]] to <8 x i16>
+// CHECK-NEXT:    [[TMP85:%.*]] = ptrtoint ptr [[ARRAYDECAY]] to i64
+// CHECK-NEXT:    [[TMP86:%.*]] = xor i64 [[TMP85]], 193514046488576
+// CHECK-NEXT:    [[TMP87:%.*]] = inttoptr i64 [[TMP86]] to ptr
+// CHECK-NEXT:    store <8 x i16> [[TMP83]], ptr [[TMP87]], align 2
+// CHECK-NEXT:    store <8 x i16> [[TMP84]], ptr [[ARRAYDECAY]], align 2
+// CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[__S1]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[ARRAYDECAY1:%.*]] = getelementptr inbounds [8 x i16], ptr 
[[DST1]], i64 0, i64 0
+// CHECK-NEXT:    call void @__msan_print_shadow(ptr noundef [[ARRAYDECAY1]], 
i64 noundef 16)
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[SUM]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[TMP88:%.*]] = ptrtoint ptr [[SUM]] to i64
+// CHECK-NEXT:    [[TMP89:%.*]] = xor i64 [[TMP88]], 193514046488576
+// CHECK-NEXT:    [[TMP90:%.*]] = inttoptr i64 [[TMP89]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP90]], i8 -1, 
i64 4, i1 false)
+// CHECK-NEXT:    [[TMP91:%.*]] = ptrtoint ptr [[SUM]] to i64
+// CHECK-NEXT:    [[TMP92:%.*]] = xor i64 [[TMP91]], 193514046488576
+// CHECK-NEXT:    [[TMP93:%.*]] = inttoptr i64 [[TMP92]] to ptr
+// CHECK-NEXT:    store i32 0, ptr [[TMP93]], align 4
+// CHECK-NEXT:    store i32 0, ptr [[SUM]], align 4
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 4, ptr [[I]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[TMP94:%.*]] = ptrtoint ptr [[I]] to i64
+// CHECK-NEXT:    [[TMP95:%.*]] = xor i64 [[TMP94]], 193514046488576
+// CHECK-NEXT:    [[TMP96:%.*]] = inttoptr i64 [[TMP95]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 4 [[TMP96]], i8 -1, 
i64 4, i1 false)
+// CHECK-NEXT:    [[TMP97:%.*]] = ptrtoint ptr [[I]] to i64
+// CHECK-NEXT:    [[TMP98:%.*]] = xor i64 [[TMP97]], 193514046488576
+// CHECK-NEXT:    [[TMP99:%.*]] = inttoptr i64 [[TMP98]] to ptr
+// CHECK-NEXT:    store i32 0, ptr [[TMP99]], align 4
+// CHECK-NEXT:    store i32 0, ptr [[I]], align 4
+// CHECK-NEXT:    br label [[FOR_COND:%.*]]
+// CHECK:       for.cond:
+// CHECK-NEXT:    [[TMP100:%.*]] = load i32, ptr [[I]], align 4
+// CHECK-NEXT:    [[TMP101:%.*]] = ptrtoint ptr [[I]] to i64
+// CHECK-NEXT:    [[TMP102:%.*]] = xor i64 [[TMP101]], 193514046488576
+// CHECK-NEXT:    [[TMP103:%.*]] = inttoptr i64 [[TMP102]] to ptr
+// CHECK-NEXT:    [[_MSLD20:%.*]] = load i32, ptr [[TMP103]], align 4
+// CHECK-NEXT:    [[_MSPROP21:%.*]] = or i32 [[_MSLD20]], 0
+// CHECK-NEXT:    [[TMP104:%.*]] = icmp ne i32 [[_MSPROP21]], 0
+// CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[TMP100]], 8
+// CHECK-NEXT:    br i1 [[TMP104]], label [[TMP105:%.*]], label 
[[TMP106:%.*]], !prof [[PROF2:![0-9]+]]
+// CHECK:       105:
+// CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR7:[0-9]+]]
+// CHECK-NEXT:    unreachable
+// CHECK:       106:
+// CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label 
[[FOR_COND_CLEANUP:%.*]]
+// CHECK:       for.cond.cleanup:
+// CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[I]]) #[[ATTR4]]
+// CHECK-NEXT:    br label [[FOR_END:%.*]]
+// CHECK:       for.body:
+// CHECK-NEXT:    [[TMP107:%.*]] = load i32, ptr [[I]], align 4
+// CHECK-NEXT:    [[TMP108:%.*]] = ptrtoint ptr [[I]] to i64
+// CHECK-NEXT:    [[TMP109:%.*]] = xor i64 [[TMP108]], 193514046488576
+// CHECK-NEXT:    [[TMP110:%.*]] = inttoptr i64 [[TMP109]] to ptr
+// CHECK-NEXT:    [[_MSLD22:%.*]] = load i32, ptr [[TMP110]], align 4
+// CHECK-NEXT:    [[_MSPROP23:%.*]] = sext i32 [[_MSLD22]] to i64
+// CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[TMP107]] to i64
+// CHECK-NEXT:    [[_MSPROP24:%.*]] = or i64 0, [[_MSPROP23]]
+// CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [8 x i16], ptr 
[[DST1]], i64 0, i64 [[IDXPROM]]
+// CHECK-NEXT:    [[_MSCMP:%.*]] = icmp ne i64 [[_MSPROP24]], 0
+// CHECK-NEXT:    br i1 [[_MSCMP]], label [[TMP111:%.*]], label 
[[TMP112:%.*]], !prof [[PROF2]]
+// CHECK:       111:
+// CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR7]]
+// CHECK-NEXT:    unreachable
+// CHECK:       112:
+// CHECK-NEXT:    [[TMP113:%.*]] = load i16, ptr [[ARRAYIDX]], align 2
+// CHECK-NEXT:    [[TMP114:%.*]] = ptrtoint ptr [[ARRAYIDX]] to i64
+// CHECK-NEXT:    [[TMP115:%.*]] = xor i64 [[TMP114]], 193514046488576
+// CHECK-NEXT:    [[TMP116:%.*]] = inttoptr i64 [[TMP115]] to ptr
+// CHECK-NEXT:    [[_MSLD25:%.*]] = load i16, ptr [[TMP116]], align 2
+// CHECK-NEXT:    [[_MSPROP26:%.*]] = sext i16 [[_MSLD25]] to i32
+// CHECK-NEXT:    [[CONV:%.*]] = sext i16 [[TMP113]] to i32
+// CHECK-NEXT:    [[TMP117:%.*]] = load i32, ptr [[SUM]], align 4
+// CHECK-NEXT:    [[TMP118:%.*]] = ptrtoint ptr [[SUM]] to i64
+// CHECK-NEXT:    [[TMP119:%.*]] = xor i64 [[TMP118]], 193514046488576
+// CHECK-NEXT:    [[TMP120:%.*]] = inttoptr i64 [[TMP119]] to ptr
+// CHECK-NEXT:    [[_MSLD27:%.*]] = load i32, ptr [[TMP120]], align 4
+// CHECK-NEXT:    [[_MSPROP28:%.*]] = or i32 [[_MSLD27]], [[_MSPROP26]]
+// CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP117]], [[CONV]]
+// CHECK-NEXT:    [[TMP121:%.*]] = ptrtoint ptr [[SUM]] to i64
+// CHECK-NEXT:    [[TMP122:%.*]] = xor i64 [[TMP121]], 193514046488576
+// CHECK-NEXT:    [[TMP123:%.*]] = inttoptr i64 [[TMP122]] to ptr
+// CHECK-NEXT:    store i32 [[_MSPROP28]], ptr [[TMP123]], align 4
+// CHECK-NEXT:    store i32 [[ADD]], ptr [[SUM]], align 4
+// CHECK-NEXT:    br label [[FOR_INC:%.*]]
+// CHECK:       for.inc:
+// CHECK-NEXT:    [[TMP124:%.*]] = load i32, ptr [[I]], align 4
+// CHECK-NEXT:    [[TMP125:%.*]] = ptrtoint ptr [[I]] to i64
+// CHECK-NEXT:    [[TMP126:%.*]] = xor i64 [[TMP125]], 193514046488576
+// CHECK-NEXT:    [[TMP127:%.*]] = inttoptr i64 [[TMP126]] to ptr
+// CHECK-NEXT:    [[_MSLD29:%.*]] = load i32, ptr [[TMP127]], align 4
+// CHECK-NEXT:    [[_MSPROP30:%.*]] = or i32 [[_MSLD29]], 0
+// CHECK-NEXT:    [[INC:%.*]] = add nsw i32 [[TMP124]], 1
+// CHECK-NEXT:    [[TMP128:%.*]] = ptrtoint ptr [[I]] to i64
+// CHECK-NEXT:    [[TMP129:%.*]] = xor i64 [[TMP128]], 193514046488576
+// CHECK-NEXT:    [[TMP130:%.*]] = inttoptr i64 [[TMP129]] to ptr
+// CHECK-NEXT:    store i32 [[_MSPROP30]], ptr [[TMP130]], align 4
+// CHECK-NEXT:    store i32 [[INC]], ptr [[I]], align 4
+// CHECK-NEXT:    br label [[FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]
+// CHECK:       for.end:
+// CHECK-NEXT:    [[TMP131:%.*]] = load i32, ptr [[SUM]], align 4
+// CHECK-NEXT:    [[TMP132:%.*]] = ptrtoint ptr [[SUM]] to i64
+// CHECK-NEXT:    [[TMP133:%.*]] = xor i64 [[TMP132]], 193514046488576
+// CHECK-NEXT:    [[TMP134:%.*]] = inttoptr i64 [[TMP133]] to ptr
+// CHECK-NEXT:    [[_MSLD31:%.*]] = load i32, ptr [[TMP134]], align 4
+// CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 4, ptr [[SUM]]) 
#[[ATTR4]]
+// CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[DST1]]) 
#[[ATTR4]]
+// CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 16, ptr [[VEC1]]) 
#[[ATTR4]]
+// CHECK-NEXT:    [[_MSCMP32:%.*]] = icmp ne i32 [[_MSLD31]], 0
+// CHECK-NEXT:    br i1 [[_MSCMP32]], label [[TMP135:%.*]], label 
[[TMP136:%.*]], !prof [[PROF2]]
+// CHECK:       135:
+// CHECK-NEXT:    call void @__msan_warning_noreturn() #[[ATTR7]]
+// CHECK-NEXT:    unreachable
+// CHECK:       136:
+// CHECK-NEXT:    ret i32 [[TMP131]]
+//
+int test_vst1(void) {
+  int16x8_t vec1;
+  vec1 = vdupq_n_s16(15);
+  int16_t dst1[8*1];
+  vst1q_s16(dst1, vec1);
+
+  __msan_print_shadow(dst1, sizeof(int16_t)*8*1);
+
+  int sum = 0;
+  for (int i = 0; i < 8*1; i++)
+    sum += dst1[i];
+
+  return sum;
+}
+
+// Initialization is only partial to make the shadows more interesting
+// CHECK-LABEL: define dso_local noundef i32 @test_vst2(
+// CHECK-SAME: ) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    call void @llvm.donothing()
+// CHECK-NEXT:    [[__P0_ADDR_I:%.*]] = alloca i16, align 2
+// CHECK-NEXT:    [[TMP0:%.*]] = ptrtoint ptr [[__P0_ADDR_I]] to i64
+// CHECK-NEXT:    [[TMP1:%.*]] = xor i64 [[TMP0]], 193514046488576
+// CHECK-NEXT:    [[TMP2:%.*]] = inttoptr i64 [[TMP1]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 2 [[TMP2]], i8 -1, 
i64 2, i1 false)
+// CHECK-NEXT:    [[__RET_I:%.*]] = alloca <8 x i16>, align 16
+// CHECK-NEXT:    [[DOTCOMPOUNDLITERAL_I:%.*]] = alloca <8 x i16>, align 16
+// CHECK-NEXT:    [[TMP3:%.*]] = ptrtoint ptr [[DOTCOMPOUNDLITERAL_I]] to i64
+// CHECK-NEXT:    [[TMP4:%.*]] = xor i64 [[TMP3]], 193514046488576
+// CHECK-NEXT:    [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
+// CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 16 [[TMP5]], i8 -1, 
i64 16, i1 false)
+// CHECK-NEXT:    [[VEC2:%.*]] = alloca [[STRUCT_INT16X8X2_T:%.*]], align 16
+// CHECK-NEXT:    [[DST2:%.*]] = alloca [16 x i16], align 2
+// CHECK-NEXT:    [[__S1:%.*]] = alloca [[STRUCT_INT16X8X2_T]], align 16
+// CHECK-NEXT:    [[SUM:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
+// CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 32, ptr [[VEC...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/98247
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to