@@ -117,4 +117,38 @@ define void @test_store_memcpy_inline(ptr noalias %P, ptr noalias %Q) {
117117 ret void
118118}
119119
120+ ;; Overwrite of memset.pattern by memcpy.
121+ define void @memset_pattern_overwrite (ptr %P , ptr noalias %Q ) nounwind ssp {
122+ ; CHECK-LABEL: @memset_pattern_overwrite(
123+ ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)
124+ ; CHECK-NEXT: ret void
125+ ;
126+ tail call void @llvm.experimental.memset.pattern.p0.i64 (ptr %P , i8 42 , i64 8 , i1 false )
127+ tail call void @llvm.memcpy.p0.p0.i64 (ptr %P , ptr %Q , i64 12 , i1 false )
128+ ret void
129+ }
130+
131+ define void @memset_pattern_overwrite2 (ptr %P , ptr noalias %Q ) nounwind ssp {
132+ ; CHECK-LABEL: @memset_pattern_overwrite2(
133+ ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P:%.*]], ptr [[Q:%.*]], i64 12, i1 false)
134+ ; CHECK-NEXT: ret void
135+ ;
136+ tail call void @llvm.experimental.memset.pattern (ptr %P , i16 270 , i64 4 , i1 false )
137+ tail call void @llvm.memcpy.p0.p0.i64 (ptr %P , ptr %Q , i64 12 , i1 false )
138+ ret void
139+ }
140+
141+ define void @memset_pattern_value_noalias (ptr %P , ptr noalias %Q ) nounwind ssp {
142+ ; CHECK-LABEL: @memset_pattern_value_noalias(
143+ ; CHECK-NEXT: tail call void @llvm.experimental.memset.pattern.p0.p0.i64(ptr [[Q:%.*]], ptr [[P:%.*]], i64 8, i1 false)
144+ ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[Q]], i64 12, i1 false)
145+ ; CHECK-NEXT: ret void
146+ ;
147+ tail call void @llvm.memset.p0.i64 (ptr %P , i8 42 , i64 8 , i1 false )
148+ tail call void @llvm.experimental.memset.pattern.p0.i64 (ptr %Q , ptr %P , i64 8 , i1 false )
149+ tail call void @llvm.memcpy.p0.p0.i64 (ptr %P , ptr %Q , i64 12 , i1 false )
150+ ret void
151+ }
152+
153+
120154declare void @llvm.memcpy.inline.p0.p0.i64 (ptr noalias nocapture writeonly , ptr noalias nocapture readonly , i64 immarg, i1 immarg)
0 commit comments