11; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2- ; RUN: opt -S -passes=msan -mattr=+sme -o - %s
3-
4- ; XFAIL: *
2+ ; RUN: opt -S -passes=msan -mattr=+sme -o - %s | FileCheck %s
53
64; Forked from llvm/test/CodeGen/AArch64/sme-aarch64-svcount.ll
75
@@ -12,16 +10,49 @@ target triple = "aarch64--linux-android9001"
1210; Test simple loads, stores and return.
1311;
1412define target ("aarch64.svcount" ) @test_load (ptr %ptr ) nounwind {
13+ ; CHECK-LABEL: @test_load(
14+ ; CHECK-NEXT: call void @llvm.donothing()
15+ ; CHECK-NEXT: [[RES:%.*]] = load target("aarch64.svcount"), ptr [[PTR:%.*]], align 2
16+ ; CHECK-NEXT: store target("aarch64.svcount") zeroinitializer, ptr @__msan_retval_tls, align 8
17+ ; CHECK-NEXT: ret target("aarch64.svcount") [[RES]]
18+ ;
1519 %res = load target ("aarch64.svcount" ), ptr %ptr
1620 ret target ("aarch64.svcount" ) %res
1721}
1822
1923define void @test_store (ptr %ptr , target ("aarch64.svcount" ) %val ) nounwind {
24+ ; CHECK-LABEL: @test_store(
25+ ; CHECK-NEXT: call void @llvm.donothing()
26+ ; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[PTR:%.*]] to i64
27+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i64 [[TMP1]], 193514046488576
28+ ; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr
29+ ; CHECK-NEXT: store target("aarch64.svcount") zeroinitializer, ptr [[TMP3]], align 2
30+ ; CHECK-NEXT: store target("aarch64.svcount") [[VAL:%.*]], ptr [[PTR]], align 2
31+ ; CHECK-NEXT: ret void
32+ ;
2033 store target ("aarch64.svcount" ) %val , ptr %ptr
2134 ret void
2235}
2336
2437define target ("aarch64.svcount" ) @test_alloca_store_reload (target ("aarch64.svcount" ) %val ) nounwind {
38+ ; CHECK-LABEL: @test_alloca_store_reload(
39+ ; CHECK-NEXT: call void @llvm.donothing()
40+ ; CHECK-NEXT: [[PTR:%.*]] = alloca target("aarch64.svcount"), align 1
41+ ; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vscale.i64()
42+ ; CHECK-NEXT: [[TMP2:%.*]] = mul nuw i64 [[TMP1]], 2
43+ ; CHECK-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[PTR]] to i64
44+ ; CHECK-NEXT: [[TMP4:%.*]] = xor i64 [[TMP3]], 193514046488576
45+ ; CHECK-NEXT: [[TMP5:%.*]] = inttoptr i64 [[TMP4]] to ptr
46+ ; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[TMP5]], i8 0, i64 [[TMP2]], i1 false)
47+ ; CHECK-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[PTR]] to i64
48+ ; CHECK-NEXT: [[TMP7:%.*]] = xor i64 [[TMP6]], 193514046488576
49+ ; CHECK-NEXT: [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr
50+ ; CHECK-NEXT: store target("aarch64.svcount") zeroinitializer, ptr [[TMP8]], align 2
51+ ; CHECK-NEXT: store target("aarch64.svcount") [[VAL:%.*]], ptr [[PTR]], align 2
52+ ; CHECK-NEXT: [[RES:%.*]] = load target("aarch64.svcount"), ptr [[PTR]], align 2
53+ ; CHECK-NEXT: store target("aarch64.svcount") zeroinitializer, ptr @__msan_retval_tls, align 8
54+ ; CHECK-NEXT: ret target("aarch64.svcount") [[RES]]
55+ ;
2556 %ptr = alloca target ("aarch64.svcount" ), align 1
2657 store target ("aarch64.svcount" ) %val , ptr %ptr
2758 %res = load target ("aarch64.svcount" ), ptr %ptr
@@ -33,10 +64,20 @@ define target("aarch64.svcount") @test_alloca_store_reload(target("aarch64.svcou
3364;
3465
3566define target ("aarch64.svcount" ) @test_return_arg1 (target ("aarch64.svcount" ) %arg0 , target ("aarch64.svcount" ) %arg1 ) nounwind {
67+ ; CHECK-LABEL: @test_return_arg1(
68+ ; CHECK-NEXT: call void @llvm.donothing()
69+ ; CHECK-NEXT: store target("aarch64.svcount") zeroinitializer, ptr @__msan_retval_tls, align 8
70+ ; CHECK-NEXT: ret target("aarch64.svcount") [[ARG1:%.*]]
71+ ;
3672 ret target ("aarch64.svcount" ) %arg1
3773}
3874
3975define target ("aarch64.svcount" ) @test_return_arg4 (target ("aarch64.svcount" ) %arg0 , target ("aarch64.svcount" ) %arg1 , target ("aarch64.svcount" ) %arg2 , target ("aarch64.svcount" ) %arg3 , target ("aarch64.svcount" ) %arg4 ) nounwind {
76+ ; CHECK-LABEL: @test_return_arg4(
77+ ; CHECK-NEXT: call void @llvm.donothing()
78+ ; CHECK-NEXT: store target("aarch64.svcount") zeroinitializer, ptr @__msan_retval_tls, align 8
79+ ; CHECK-NEXT: ret target("aarch64.svcount") [[ARG4:%.*]]
80+ ;
4081 ret target ("aarch64.svcount" ) %arg4
4182}
4283
@@ -46,22 +87,58 @@ define target("aarch64.svcount") @test_return_arg4(target("aarch64.svcount") %ar
4687
4788declare void @take_svcount_1 (target ("aarch64.svcount" ) %arg )
4889define void @test_pass_1arg (target ("aarch64.svcount" ) %arg ) nounwind {
90+ ; CHECK-LABEL: @test_pass_1arg(
91+ ; CHECK-NEXT: call void @llvm.donothing()
92+ ; CHECK-NEXT: call void @take_svcount_1(target("aarch64.svcount") [[ARG:%.*]])
93+ ; CHECK-NEXT: ret void
94+ ;
4995 call void @take_svcount_1 (target ("aarch64.svcount" ) %arg )
5096 ret void
5197}
5298
5399declare void @take_svcount_5 (target ("aarch64.svcount" ) %arg0 , target ("aarch64.svcount" ) %arg1 , target ("aarch64.svcount" ) %arg2 , target ("aarch64.svcount" ) %arg3 , target ("aarch64.svcount" ) %arg4 )
54100define void @test_pass_5args (target ("aarch64.svcount" ) %arg ) nounwind {
101+ ; CHECK-LABEL: @test_pass_5args(
102+ ; CHECK-NEXT: call void @llvm.donothing()
103+ ; CHECK-NEXT: call void @take_svcount_5(target("aarch64.svcount") [[ARG:%.*]], target("aarch64.svcount") [[ARG]], target("aarch64.svcount") [[ARG]], target("aarch64.svcount") [[ARG]], target("aarch64.svcount") [[ARG]])
104+ ; CHECK-NEXT: ret void
105+ ;
55106 call void @take_svcount_5 (target ("aarch64.svcount" ) %arg , target ("aarch64.svcount" ) %arg , target ("aarch64.svcount" ) %arg , target ("aarch64.svcount" ) %arg , target ("aarch64.svcount" ) %arg )
56107 ret void
57108}
58109
59110define target ("aarch64.svcount" ) @test_sel (target ("aarch64.svcount" ) %x , target ("aarch64.svcount" ) %y , i1 %cmp ) sanitize_memory {
111+ ; CHECK-LABEL: @test_sel(
112+ ; CHECK-NEXT: [[TMP1:%.*]] = load i1, ptr @__msan_param_tls, align 8
113+ ; CHECK-NEXT: call void @llvm.donothing()
114+ ; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[CMP:%.*]], target("aarch64.svcount") zeroinitializer, target("aarch64.svcount") zeroinitializer
115+ ; CHECK-NEXT: [[_MSPROP_SELECT:%.*]] = select i1 [[TMP1]], target("aarch64.svcount") zeroinitializer, target("aarch64.svcount") [[TMP2]]
116+ ; CHECK-NEXT: [[X_Y:%.*]] = select i1 [[CMP]], target("aarch64.svcount") [[X:%.*]], target("aarch64.svcount") [[Y:%.*]]
117+ ; CHECK-NEXT: store target("aarch64.svcount") [[_MSPROP_SELECT]], ptr @__msan_retval_tls, align 8
118+ ; CHECK-NEXT: ret target("aarch64.svcount") [[X_Y]]
119+ ;
60120 %x.y = select i1 %cmp , target ("aarch64.svcount" ) %x , target ("aarch64.svcount" ) %y
61121 ret target ("aarch64.svcount" ) %x.y
62122}
63123
64124define target ("aarch64.svcount" ) @test_sel_cc (target ("aarch64.svcount" ) %x , target ("aarch64.svcount" ) %y , i32 %k ) sanitize_memory {
125+ ; CHECK-LABEL: @test_sel_cc(
126+ ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @__msan_param_tls, align 8
127+ ; CHECK-NEXT: call void @llvm.donothing()
128+ ; CHECK-NEXT: [[TMP2:%.*]] = xor i32 [[K:%.*]], -2147483648
129+ ; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP1]], -1
130+ ; CHECK-NEXT: [[TMP4:%.*]] = and i32 [[TMP2]], [[TMP3]]
131+ ; CHECK-NEXT: [[TMP5:%.*]] = or i32 [[TMP2]], [[TMP1]]
132+ ; CHECK-NEXT: [[TMP6:%.*]] = icmp ugt i32 [[TMP4]], -2147483606
133+ ; CHECK-NEXT: [[TMP7:%.*]] = icmp ugt i32 [[TMP5]], -2147483606
134+ ; CHECK-NEXT: [[TMP8:%.*]] = xor i1 [[TMP6]], [[TMP7]]
135+ ; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[K]], 42
136+ ; CHECK-NEXT: [[TMP9:%.*]] = select i1 [[CMP]], target("aarch64.svcount") zeroinitializer, target("aarch64.svcount") zeroinitializer
137+ ; CHECK-NEXT: [[_MSPROP_SELECT:%.*]] = select i1 [[TMP8]], target("aarch64.svcount") zeroinitializer, target("aarch64.svcount") [[TMP9]]
138+ ; CHECK-NEXT: [[X_Y:%.*]] = select i1 [[CMP]], target("aarch64.svcount") [[X:%.*]], target("aarch64.svcount") [[Y:%.*]]
139+ ; CHECK-NEXT: store target("aarch64.svcount") [[_MSPROP_SELECT]], ptr @__msan_retval_tls, align 8
140+ ; CHECK-NEXT: ret target("aarch64.svcount") [[X_Y]]
141+ ;
65142 %cmp = icmp sgt i32 %k , 42
66143 %x.y = select i1 %cmp , target ("aarch64.svcount" ) %x , target ("aarch64.svcount" ) %y
67144 ret target ("aarch64.svcount" ) %x.y
0 commit comments