xref: /llvm-project/llvm/test/Transforms/MemCpyOpt/vscale-memset.ll (revision 5d9c321e8d3b543c7da44f1b0447d4d09570ddbb)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=memcpyopt,dce -S -verify-memoryssa | FileCheck %s
3
4; Negative test
5; Check this test is not transformed into memset, or cause a compiler warning
6; warning: Compiler has made implicit assumption that TypeSize is not scalable. This may or may not lead to broken code.
7
8define void @foo(ptr %p) {
9; CHECK-LABEL: @foo(
10; CHECK-NEXT:    store <vscale x 16 x i8> zeroinitializer, ptr [[P:%.*]], align 16
11; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr <vscale x 16 x i8>, ptr [[P]], i64 1
12; CHECK-NEXT:    store <vscale x 16 x i8> zeroinitializer, ptr [[TMP1]], align 16
13; CHECK-NEXT:    ret void
14;
15  store <vscale x 16 x i8> zeroinitializer, ptr %p
16  %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i64 1
17  store <vscale x 16 x i8> zeroinitializer, ptr %tmp1
18  ret void
19}
20
21; Test the compiler does not crash on a store of a scalable aggregate type.
22define void @test_no_crash_scalable_agg(ptr %p) {
23; CHECK-LABEL: @test_no_crash_scalable_agg(
24; CHECK-NEXT:  entry:
25; CHECK-NEXT:    store { <vscale x 16 x i1>, <vscale x 16 x i1> } zeroinitializer, ptr [[P:%.*]], align 2
26; CHECK-NEXT:    ret void
27;
28entry:
29  store { <vscale x 16 x i1>, <vscale x 16 x i1> } zeroinitializer, ptr %p, align 2
30  ret void
31}
32
33; Positive test
34
35define void @memset_vscale_index_zero(ptr %p, i8 %z) {
36; CHECK-LABEL: @memset_vscale_index_zero(
37; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[P:%.*]], i8 [[Z:%.*]], i64 17, i1 false)
38; CHECK-NEXT:    ret void
39;
40  store i8 %z, ptr %p
41  %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 1
42  store i8 %z, ptr %tmp1
43  %tmp2 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 2
44  store i8 %z, ptr %tmp2
45  %tmp3 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 3
46  store i8 %z, ptr %tmp3
47  %tmp4 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 4
48  store i8 %z, ptr %tmp4
49  %tmp5 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 5
50  store i8 %z, ptr %tmp5
51  %tmp6 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 6
52  store i8 %z, ptr %tmp6
53  %tmp7 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 7
54  store i8 %z, ptr %tmp7
55  %tmp8 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 8
56  store i8 %z, ptr %tmp8
57  %tmp9 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 9
58  store i8 %z, ptr %tmp9
59  %tmp10 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 10
60  store i8 %z, ptr %tmp10
61  %tmp11 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 11
62  store i8 %z, ptr %tmp11
63  %tmp12 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 12
64  store i8 %z, ptr %tmp12
65  %tmp13 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 13
66  store i8 %z, ptr %tmp13
67  %tmp14 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 14
68  store i8 %z, ptr %tmp14
69  %tmp15 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 15
70  store i8 %z, ptr %tmp15
71  %tmp16 = getelementptr <vscale x 16 x i8>, ptr %p, i32 0, i32 16
72  store i8 %z, ptr %tmp16
73  ret void
74}
75
76define void @memset_vscale_index_nonzero(ptr %p, i8 %z) {
77; CHECK-LABEL: @memset_vscale_index_nonzero(
78; CHECK-NEXT:    [[TMP0:%.*]] = getelementptr <vscale x 16 x i8>, ptr [[P:%.*]], i32 1, i32 0
79; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 1 [[TMP0]], i8 [[Z:%.*]], i64 17, i1 false)
80; CHECK-NEXT:    ret void
81;
82  %tmp0 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 0
83  store i8 %z, ptr %tmp0
84  %tmp1 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 1
85  store i8 %z, ptr %tmp1
86  %tmp2 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 2
87  store i8 %z, ptr %tmp2
88  %tmp3 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 3
89  store i8 %z, ptr %tmp3
90  %tmp4 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 4
91  store i8 %z, ptr %tmp4
92  %tmp5 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 5
93  store i8 %z, ptr %tmp5
94  %tmp6 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 6
95  store i8 %z, ptr %tmp6
96  %tmp7 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 7
97  store i8 %z, ptr %tmp7
98  %tmp8 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 8
99  store i8 %z, ptr %tmp8
100  %tmp9 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 9
101  store i8 %z, ptr %tmp9
102  %tmp10 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 10
103  store i8 %z, ptr %tmp10
104  %tmp11 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 11
105  store i8 %z, ptr %tmp11
106  %tmp12 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 12
107  store i8 %z, ptr %tmp12
108  %tmp13 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 13
109  store i8 %z, ptr %tmp13
110  %tmp14 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 14
111  store i8 %z, ptr %tmp14
112  %tmp15 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 15
113  store i8 %z, ptr %tmp15
114  %tmp16 = getelementptr <vscale x 16 x i8>, ptr %p, i32 1, i32 16
115  store i8 %z, ptr %tmp16
116  ret void
117}
118