@@ -117,4 +117,38 @@ define void @test_store_memcpy_inline(ptr noalias %P, ptr noalias %Q) {
117
117
ret void
118
118
}
119
119
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
+
120
154
declare void @llvm.memcpy.inline.p0.p0.i64 (ptr noalias nocapture writeonly , ptr noalias nocapture readonly , i64 immarg, i1 immarg)
0 commit comments