xref: /llvm-project/llvm/test/Transforms/FunctionAttrs/initializes.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
14d6e6914SHaopeng Liu; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes --version 4
24d6e6914SHaopeng Liu; RUN: opt -passes=function-attrs -S < %s | FileCheck %s
34d6e6914SHaopeng Liu
44d6e6914SHaopeng Liudefine void @basic(ptr %p) {
54d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
64d6e6914SHaopeng Liu; CHECK-LABEL: define void @basic(
7*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]]) #[[ATTR0:[0-9]+]] {
84d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
94d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
104d6e6914SHaopeng Liu;
114d6e6914SHaopeng Liu  store i64 123, ptr %p
124d6e6914SHaopeng Liu  ret void
134d6e6914SHaopeng Liu}
144d6e6914SHaopeng Liu
154d6e6914SHaopeng Liudefine void @stores_on_both_paths(ptr %p, i1 %i) {
164d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
174d6e6914SHaopeng Liu; CHECK-LABEL: define void @stores_on_both_paths(
18*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]], i1 [[I:%.*]]) #[[ATTR0]] {
194d6e6914SHaopeng Liu; CHECK-NEXT:  entry:
204d6e6914SHaopeng Liu; CHECK-NEXT:    br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
214d6e6914SHaopeng Liu; CHECK:       bb1:
224d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
234d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END:%.*]]
244d6e6914SHaopeng Liu; CHECK:       bb2:
254d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 321, ptr [[P]], align 4
264d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END]]
274d6e6914SHaopeng Liu; CHECK:       end:
284d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
294d6e6914SHaopeng Liu;
304d6e6914SHaopeng Liuentry:
314d6e6914SHaopeng Liu  br i1 %i, label %bb1, label %bb2
324d6e6914SHaopeng Liubb1:
334d6e6914SHaopeng Liu  store i64 123, ptr %p
344d6e6914SHaopeng Liu  br label %end
354d6e6914SHaopeng Liubb2:
364d6e6914SHaopeng Liu  store i64 321, ptr %p
374d6e6914SHaopeng Liu  br label %end
384d6e6914SHaopeng Liuend:
394d6e6914SHaopeng Liu  ret void
404d6e6914SHaopeng Liu}
414d6e6914SHaopeng Liu
424d6e6914SHaopeng Liudefine void @store_pointer_to_pointer(ptr %p, ptr %p2) {
434d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
444d6e6914SHaopeng Liu; CHECK-LABEL: define void @store_pointer_to_pointer(
45*29441e4fSNikita Popov; CHECK-SAME: ptr [[P:%.*]], ptr writeonly captures(none) initializes((0, 8)) [[P2:%.*]]) #[[ATTR0]] {
464d6e6914SHaopeng Liu; CHECK-NEXT:    store ptr [[P]], ptr [[P2]], align 8
474d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
484d6e6914SHaopeng Liu;
494d6e6914SHaopeng Liu  store ptr %p, ptr %p2
504d6e6914SHaopeng Liu  ret void
514d6e6914SHaopeng Liu}
524d6e6914SHaopeng Liu
534d6e6914SHaopeng Liu; TODO: this is still initializes
544d6e6914SHaopeng Liudefine void @store_pointer_to_itself(ptr %p) {
554d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
564d6e6914SHaopeng Liu; CHECK-LABEL: define void @store_pointer_to_itself(
574d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
584d6e6914SHaopeng Liu; CHECK-NEXT:    store ptr [[P]], ptr [[P]], align 8
594d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
604d6e6914SHaopeng Liu;
614d6e6914SHaopeng Liu  store ptr %p, ptr %p
624d6e6914SHaopeng Liu  ret void
634d6e6914SHaopeng Liu}
644d6e6914SHaopeng Liu
654d6e6914SHaopeng Liudefine void @load_before_store(ptr %p) {
664d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
674d6e6914SHaopeng Liu; CHECK-LABEL: define void @load_before_store(
68*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) [[P:%.*]]) #[[ATTR1:[0-9]+]] {
694d6e6914SHaopeng Liu; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4
704d6e6914SHaopeng Liu; CHECK-NEXT:    store i32 123, ptr [[P]], align 4
714d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
724d6e6914SHaopeng Liu;
734d6e6914SHaopeng Liu  %a = load i32, ptr %p
744d6e6914SHaopeng Liu  store i32 123, ptr %p
754d6e6914SHaopeng Liu  ret void
764d6e6914SHaopeng Liu}
774d6e6914SHaopeng Liu
784d6e6914SHaopeng Liudefine void @partial_load_before_store(ptr %p) {
794d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
804d6e6914SHaopeng Liu; CHECK-LABEL: define void @partial_load_before_store(
81*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) initializes((4, 8)) [[P:%.*]]) #[[ATTR1]] {
824d6e6914SHaopeng Liu; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4
834d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
844d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
854d6e6914SHaopeng Liu;
864d6e6914SHaopeng Liu  %a = load i32, ptr %p
874d6e6914SHaopeng Liu  store i64 123, ptr %p
884d6e6914SHaopeng Liu  ret void
894d6e6914SHaopeng Liu}
904d6e6914SHaopeng Liu
914d6e6914SHaopeng Liudeclare void @use(ptr)
924d6e6914SHaopeng Liu
934d6e6914SHaopeng Liudefine void @call_clobber(ptr %p) {
944d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_clobber(
954d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]]) {
964d6e6914SHaopeng Liu; CHECK-NEXT:    call void @use(ptr [[P]])
974d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
984d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
994d6e6914SHaopeng Liu;
1004d6e6914SHaopeng Liu  call void @use(ptr %p)
1014d6e6914SHaopeng Liu  store i64 123, ptr %p
1024d6e6914SHaopeng Liu  ret void
1034d6e6914SHaopeng Liu}
1044d6e6914SHaopeng Liu
1054d6e6914SHaopeng Liudefine void @call_clobber_after_store(ptr %p) {
1064d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_clobber_after_store(
1074d6e6914SHaopeng Liu; CHECK-SAME: ptr initializes((0, 8)) [[P:%.*]]) {
1084d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
1094d6e6914SHaopeng Liu; CHECK-NEXT:    call void @use(ptr [[P]])
1104d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
1114d6e6914SHaopeng Liu;
1124d6e6914SHaopeng Liu  store i64 123, ptr %p
1134d6e6914SHaopeng Liu  call void @use(ptr %p)
1144d6e6914SHaopeng Liu  ret void
1154d6e6914SHaopeng Liu}
1164d6e6914SHaopeng Liu
1174d6e6914SHaopeng Liudefine void @store_offset(ptr %p) {
1184d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
1194d6e6914SHaopeng Liu; CHECK-LABEL: define void @store_offset(
120*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((8, 12)) [[P:%.*]]) #[[ATTR0]] {
1214d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 8
1224d6e6914SHaopeng Liu; CHECK-NEXT:    store i32 123, ptr [[G]], align 4
1234d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
1244d6e6914SHaopeng Liu;
1254d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 8
1264d6e6914SHaopeng Liu  store i32 123, ptr %g
1274d6e6914SHaopeng Liu  ret void
1284d6e6914SHaopeng Liu}
1294d6e6914SHaopeng Liu
1304d6e6914SHaopeng Liudefine void @store_volatile(ptr %p) {
1314d6e6914SHaopeng Liu; CHECK: Function Attrs: nofree norecurse nounwind memory(argmem: readwrite, inaccessiblemem: readwrite)
1324d6e6914SHaopeng Liu; CHECK-LABEL: define void @store_volatile(
1334d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR2:[0-9]+]] {
1344d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 8
1354d6e6914SHaopeng Liu; CHECK-NEXT:    store volatile i32 123, ptr [[G]], align 4
1364d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
1374d6e6914SHaopeng Liu;
1384d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 8
1394d6e6914SHaopeng Liu  store volatile i32 123, ptr %g
1404d6e6914SHaopeng Liu  ret void
1414d6e6914SHaopeng Liu}
1424d6e6914SHaopeng Liu
1434d6e6914SHaopeng Liudefine void @merge_store_ranges(ptr %p) {
1444d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
1454d6e6914SHaopeng Liu; CHECK-LABEL: define void @merge_store_ranges(
146*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]]) #[[ATTR0]] {
1474d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 4
1484d6e6914SHaopeng Liu; CHECK-NEXT:    store i32 123, ptr [[G]], align 4
1494d6e6914SHaopeng Liu; CHECK-NEXT:    store i32 123, ptr [[P]], align 4
1504d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
1514d6e6914SHaopeng Liu;
1524d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 4
1534d6e6914SHaopeng Liu  store i32 123, ptr %g
1544d6e6914SHaopeng Liu  store i32 123, ptr %p
1554d6e6914SHaopeng Liu  ret void
1564d6e6914SHaopeng Liu}
1574d6e6914SHaopeng Liu
1584d6e6914SHaopeng Liudefine void @partially_overlapping_stores_branches(ptr %p, i1 %i) {
1594d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
1604d6e6914SHaopeng Liu; CHECK-LABEL: define void @partially_overlapping_stores_branches(
161*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) initializes((4, 8)) [[P:%.*]], i1 [[I:%.*]]) #[[ATTR1]] {
1624d6e6914SHaopeng Liu; CHECK-NEXT:  entry:
1632d760a13SNikita Popov; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4
1644d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 4
1654d6e6914SHaopeng Liu; CHECK-NEXT:    br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
1664d6e6914SHaopeng Liu; CHECK:       bb1:
1674d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[G]], align 4
1684d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END:%.*]]
1694d6e6914SHaopeng Liu; CHECK:       bb2:
1704d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 321, ptr [[P]], align 4
1714d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END]]
1724d6e6914SHaopeng Liu; CHECK:       end:
1734d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
1744d6e6914SHaopeng Liu;
1754d6e6914SHaopeng Liuentry:
1764d6e6914SHaopeng Liu  %a = load i32, ptr %p
1774d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 4
1784d6e6914SHaopeng Liu  br i1 %i, label %bb1, label %bb2
1794d6e6914SHaopeng Liubb1:
1804d6e6914SHaopeng Liu  store i64 123, ptr %g
1814d6e6914SHaopeng Liu  br label %end
1824d6e6914SHaopeng Liubb2:
1834d6e6914SHaopeng Liu  store i64 321, ptr %p
1844d6e6914SHaopeng Liu  br label %end
1854d6e6914SHaopeng Liuend:
1864d6e6914SHaopeng Liu  ret void
1874d6e6914SHaopeng Liu}
1884d6e6914SHaopeng Liu
1894d6e6914SHaopeng Liudefine void @non_overlapping_stores_branches(ptr %p, i1 %i) {
1904d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
1914d6e6914SHaopeng Liu; CHECK-LABEL: define void @non_overlapping_stores_branches(
192*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[P:%.*]], i1 [[I:%.*]]) #[[ATTR0]] {
1934d6e6914SHaopeng Liu; CHECK-NEXT:  entry:
1944d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 8
1954d6e6914SHaopeng Liu; CHECK-NEXT:    br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
1964d6e6914SHaopeng Liu; CHECK:       bb1:
1974d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[G]], align 4
1984d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END:%.*]]
1994d6e6914SHaopeng Liu; CHECK:       bb2:
2004d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 321, ptr [[P]], align 4
2014d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END]]
2024d6e6914SHaopeng Liu; CHECK:       end:
2034d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
2044d6e6914SHaopeng Liu;
2054d6e6914SHaopeng Liuentry:
2064d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 8
2074d6e6914SHaopeng Liu  br i1 %i, label %bb1, label %bb2
2084d6e6914SHaopeng Liubb1:
2094d6e6914SHaopeng Liu  store i64 123, ptr %g
2104d6e6914SHaopeng Liu  br label %end
2114d6e6914SHaopeng Liubb2:
2124d6e6914SHaopeng Liu  store i64 321, ptr %p
2134d6e6914SHaopeng Liu  br label %end
2144d6e6914SHaopeng Liuend:
2154d6e6914SHaopeng Liu  ret void
2164d6e6914SHaopeng Liu}
2174d6e6914SHaopeng Liu
2184d6e6914SHaopeng Liudefine void @dominating_store(ptr %p, i1 %i) {
2194d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
2204d6e6914SHaopeng Liu; CHECK-LABEL: define void @dominating_store(
221*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]], i1 [[I:%.*]]) #[[ATTR0]] {
2224d6e6914SHaopeng Liu; CHECK-NEXT:  entry:
2234d6e6914SHaopeng Liu; CHECK-NEXT:    br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
2244d6e6914SHaopeng Liu; CHECK:       bb1:
2254d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END:%.*]]
2264d6e6914SHaopeng Liu; CHECK:       bb2:
2274d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END]]
2284d6e6914SHaopeng Liu; CHECK:       end:
2294d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 321, ptr [[P]], align 4
2304d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
2314d6e6914SHaopeng Liu;
2324d6e6914SHaopeng Liuentry:
2334d6e6914SHaopeng Liu  br i1 %i, label %bb1, label %bb2
2344d6e6914SHaopeng Liubb1:
2354d6e6914SHaopeng Liu  br label %end
2364d6e6914SHaopeng Liubb2:
2374d6e6914SHaopeng Liu  br label %end
2384d6e6914SHaopeng Liuend:
2394d6e6914SHaopeng Liu  store i64 321, ptr %p
2404d6e6914SHaopeng Liu  ret void
2414d6e6914SHaopeng Liu}
2424d6e6914SHaopeng Liu
2434d6e6914SHaopeng Liudefine void @call_clobber_on_one_branch(ptr %p, i1 %i) {
2444d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_clobber_on_one_branch(
2454d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]], i1 [[I:%.*]]) {
2464d6e6914SHaopeng Liu; CHECK-NEXT:  entry:
2474d6e6914SHaopeng Liu; CHECK-NEXT:    br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
2484d6e6914SHaopeng Liu; CHECK:       bb1:
2494d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END:%.*]]
2504d6e6914SHaopeng Liu; CHECK:       bb2:
2514d6e6914SHaopeng Liu; CHECK-NEXT:    call void @use(ptr [[P]])
2524d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END]]
2534d6e6914SHaopeng Liu; CHECK:       end:
2544d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 321, ptr [[P]], align 4
2554d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
2564d6e6914SHaopeng Liu;
2574d6e6914SHaopeng Liuentry:
2584d6e6914SHaopeng Liu  br i1 %i, label %bb1, label %bb2
2594d6e6914SHaopeng Liubb1:
2604d6e6914SHaopeng Liu  br label %end
2614d6e6914SHaopeng Liubb2:
2624d6e6914SHaopeng Liu  call void @use(ptr %p)
2634d6e6914SHaopeng Liu  br label %end
2644d6e6914SHaopeng Liuend:
2654d6e6914SHaopeng Liu  store i64 321, ptr %p
2664d6e6914SHaopeng Liu  ret void
2674d6e6914SHaopeng Liu}
2684d6e6914SHaopeng Liu
2694d6e6914SHaopeng Liudefine void @merge_existing_initializes(ptr initializes((33, 36)) %p) {
2704d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
2714d6e6914SHaopeng Liu; CHECK-LABEL: define void @merge_existing_initializes(
272*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8), (33, 36)) [[P:%.*]]) #[[ATTR0]] {
2734d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
2744d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
2754d6e6914SHaopeng Liu;
2764d6e6914SHaopeng Liu  store i64 123, ptr %p
2774d6e6914SHaopeng Liu  ret void
2784d6e6914SHaopeng Liu}
2794d6e6914SHaopeng Liu
2804d6e6914SHaopeng Liudefine void @negative_offset(ptr %p) {
2814d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
2824d6e6914SHaopeng Liu; CHECK-LABEL: define void @negative_offset(
283*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((-5, 3)) [[P:%.*]]) #[[ATTR0]] {
2844d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 -5
2854d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[G]], align 4
2864d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
2874d6e6914SHaopeng Liu;
2884d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 -5
2894d6e6914SHaopeng Liu  store i64 123, ptr %g
2904d6e6914SHaopeng Liu  ret void
2914d6e6914SHaopeng Liu}
2924d6e6914SHaopeng Liu
2934d6e6914SHaopeng Liudefine void @non_const_gep(ptr %p, i64 %i) {
2944d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
2954d6e6914SHaopeng Liu; CHECK-LABEL: define void @non_const_gep(
296*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]], i64 [[I:%.*]]) #[[ATTR0]] {
2974d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 [[I]]
2984d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[G]], align 4
2994d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
3004d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
3014d6e6914SHaopeng Liu;
3024d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 %i
3034d6e6914SHaopeng Liu  store i64 123, ptr %g
3044d6e6914SHaopeng Liu  store i64 123, ptr %p
3054d6e6914SHaopeng Liu  ret void
3064d6e6914SHaopeng Liu}
3074d6e6914SHaopeng Liu
3084d6e6914SHaopeng Liudefine void @call_clobber_in_entry_block(ptr %p, i1 %i) {
3094d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_clobber_in_entry_block(
3104d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]], i1 [[I:%.*]]) {
3114d6e6914SHaopeng Liu; CHECK-NEXT:  entry:
3124d6e6914SHaopeng Liu; CHECK-NEXT:    call void @use(ptr [[P]])
3134d6e6914SHaopeng Liu; CHECK-NEXT:    br i1 [[I]], label [[BB1:%.*]], label [[BB2:%.*]]
3144d6e6914SHaopeng Liu; CHECK:       bb1:
3154d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 123, ptr [[P]], align 4
3164d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END:%.*]]
3174d6e6914SHaopeng Liu; CHECK:       bb2:
3184d6e6914SHaopeng Liu; CHECK-NEXT:    store i64 321, ptr [[P]], align 4
3194d6e6914SHaopeng Liu; CHECK-NEXT:    br label [[END]]
3204d6e6914SHaopeng Liu; CHECK:       end:
3214d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
3224d6e6914SHaopeng Liu;
3234d6e6914SHaopeng Liuentry:
3244d6e6914SHaopeng Liu  call void @use(ptr %p)
3254d6e6914SHaopeng Liu  br i1 %i, label %bb1, label %bb2
3264d6e6914SHaopeng Liubb1:
3274d6e6914SHaopeng Liu  store i64 123, ptr %p
3284d6e6914SHaopeng Liu  br label %end
3294d6e6914SHaopeng Liubb2:
3304d6e6914SHaopeng Liu  store i64 321, ptr %p
3314d6e6914SHaopeng Liu  br label %end
3324d6e6914SHaopeng Liuend:
3334d6e6914SHaopeng Liu  ret void
3344d6e6914SHaopeng Liu}
3354d6e6914SHaopeng Liu
3364d6e6914SHaopeng Liudeclare void @g1(ptr initializes((0, 4)) %p)
3374d6e6914SHaopeng Liudeclare void @g2(ptr initializes((8, 12)) %p)
3384d6e6914SHaopeng Liudeclare void @g3(ptr initializes((0, 4)) writeonly nocapture %p)
3394d6e6914SHaopeng Liu
3404d6e6914SHaopeng Liudefine void @call_initializes(ptr %p) {
3414d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_initializes(
3424d6e6914SHaopeng Liu; CHECK-SAME: ptr initializes((0, 4)) [[P:%.*]]) {
3434d6e6914SHaopeng Liu; CHECK-NEXT:    call void @g1(ptr [[P]])
3444d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
3454d6e6914SHaopeng Liu;
3464d6e6914SHaopeng Liu  call void @g1(ptr %p)
3474d6e6914SHaopeng Liu  ret void
3484d6e6914SHaopeng Liu}
3494d6e6914SHaopeng Liu
3504d6e6914SHaopeng Liudefine void @call_initializes_clobber(ptr %p) {
3514d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_initializes_clobber(
3524d6e6914SHaopeng Liu; CHECK-SAME: ptr initializes((0, 4)) [[P:%.*]]) {
3534d6e6914SHaopeng Liu; CHECK-NEXT:    call void @g1(ptr [[P]])
3544d6e6914SHaopeng Liu; CHECK-NEXT:    call void @g2(ptr [[P]])
3554d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
3564d6e6914SHaopeng Liu;
3574d6e6914SHaopeng Liu  call void @g1(ptr %p)
3584d6e6914SHaopeng Liu  call void @g2(ptr %p)
3594d6e6914SHaopeng Liu  ret void
3604d6e6914SHaopeng Liu}
3614d6e6914SHaopeng Liu
3624d6e6914SHaopeng Liudefine void @call_initializes_no_clobber_writeonly_nocapture(ptr %p) {
3634d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_initializes_no_clobber_writeonly_nocapture(
3644d6e6914SHaopeng Liu; CHECK-SAME: ptr initializes((0, 4), (8, 12)) [[P:%.*]]) {
3654d6e6914SHaopeng Liu; CHECK-NEXT:    call void @g3(ptr [[P]])
3664d6e6914SHaopeng Liu; CHECK-NEXT:    call void @g2(ptr [[P]])
3674d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
3684d6e6914SHaopeng Liu;
3694d6e6914SHaopeng Liu  call void @g3(ptr %p)
3704d6e6914SHaopeng Liu  call void @g2(ptr %p)
3714d6e6914SHaopeng Liu  ret void
3724d6e6914SHaopeng Liu}
3734d6e6914SHaopeng Liu
3744d6e6914SHaopeng Liudefine void @call_initializes_escape_bundle(ptr %p) {
3754d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_initializes_escape_bundle(
3764d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]]) {
3774d6e6914SHaopeng Liu; CHECK-NEXT:    call void @g1(ptr [[P]]) [ "unknown"(ptr [[P]]) ]
3784d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
3794d6e6914SHaopeng Liu;
3804d6e6914SHaopeng Liu  call void @g1(ptr %p) ["unknown"(ptr %p)]
3814d6e6914SHaopeng Liu  ret void
3824d6e6914SHaopeng Liu}
3834d6e6914SHaopeng Liu
3844d6e6914SHaopeng Liudefine void @access_bundle() {
3852d760a13SNikita Popov; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
3862d760a13SNikita Popov; CHECK-LABEL: define void @access_bundle(
3872d760a13SNikita Popov; CHECK-SAME: ) #[[ATTR3:[0-9]+]] {
3882d760a13SNikita Popov; CHECK-NEXT:    [[SINK:%.*]] = alloca i64, align 8
3892d760a13SNikita Popov; CHECK-NEXT:    store i64 123, ptr [[SINK]], align 4
3902d760a13SNikita Popov; CHECK-NEXT:    ret void
3912d760a13SNikita Popov;
3924d6e6914SHaopeng Liu  %sink = alloca i64, align 8
3934d6e6914SHaopeng Liu  store i64 123, ptr %sink
3944d6e6914SHaopeng Liu  ret void
3954d6e6914SHaopeng Liu}
3964d6e6914SHaopeng Liu
3974d6e6914SHaopeng Liudefine void @call_operand_bundle(ptr %p) {
3982d760a13SNikita Popov; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
3994d6e6914SHaopeng Liu; CHECK-LABEL: define void @call_operand_bundle(
4004d6e6914SHaopeng Liu; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR4:[0-9]+]] {
4014d6e6914SHaopeng Liu; CHECK-NEXT:    call void @access_bundle() [ "unknown"(ptr [[P]]) ]
4024d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4034d6e6914SHaopeng Liu;
4044d6e6914SHaopeng Liu  call void @access_bundle() ["unknown"(ptr %p)]
4054d6e6914SHaopeng Liu  ret void
4064d6e6914SHaopeng Liu}
4074d6e6914SHaopeng Liu
4084d6e6914SHaopeng Liudeclare void @llvm.memset(ptr, i8, i64 ,i1)
4094d6e6914SHaopeng Liu
4104d6e6914SHaopeng Liudefine void @memset(ptr %p) {
4114d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
4124d6e6914SHaopeng Liu; CHECK-LABEL: define void @memset(
413*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 9)) [[P:%.*]]) #[[ATTR0]] {
4144d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr [[P]], i8 2, i64 9, i1 false)
4154d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4164d6e6914SHaopeng Liu;
4174d6e6914SHaopeng Liu  call void @llvm.memset(ptr %p, i8 2, i64 9, i1 false)
4184d6e6914SHaopeng Liu  ret void
4194d6e6914SHaopeng Liu}
4204d6e6914SHaopeng Liu
4214d6e6914SHaopeng Liudefine void @memset_offset(ptr %p) {
4224d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
4234d6e6914SHaopeng Liu; CHECK-LABEL: define void @memset_offset(
424*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((3, 12)) [[P:%.*]]) #[[ATTR0]] {
4254d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 3
4264d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr [[G]], i8 2, i64 9, i1 false)
4274d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4284d6e6914SHaopeng Liu;
4294d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 3
4304d6e6914SHaopeng Liu  call void @llvm.memset(ptr %g, i8 2, i64 9, i1 false)
4314d6e6914SHaopeng Liu  ret void
4324d6e6914SHaopeng Liu}
4334d6e6914SHaopeng Liu
4348daba2c1SHaopeng Liudefine void @memset_neg(ptr %p) {
4358daba2c1SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
4368daba2c1SHaopeng Liu; CHECK-LABEL: define void @memset_neg(
437*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[P:%.*]]) #[[ATTR0]] {
4388daba2c1SHaopeng Liu; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr [[P]], i8 2, i64 -1, i1 false)
4398daba2c1SHaopeng Liu; CHECK-NEXT:    ret void
4408daba2c1SHaopeng Liu;
4418daba2c1SHaopeng Liu  call void @llvm.memset(ptr %p, i8 2, i64 -1, i1 false)
4428daba2c1SHaopeng Liu  ret void
4438daba2c1SHaopeng Liu}
4448daba2c1SHaopeng Liu
4454d6e6914SHaopeng Liudefine void @memset_volatile(ptr %p) {
4464d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: write)
4474d6e6914SHaopeng Liu; CHECK-LABEL: define void @memset_volatile(
4482d760a13SNikita Popov; CHECK-SAME: ptr writeonly [[P:%.*]]) #[[ATTR5:[0-9]+]] {
4494d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr [[P]], i8 2, i64 9, i1 true)
4504d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4514d6e6914SHaopeng Liu;
4524d6e6914SHaopeng Liu  call void @llvm.memset(ptr %p, i8 2, i64 9, i1 true)
4534d6e6914SHaopeng Liu  ret void
4544d6e6914SHaopeng Liu}
4554d6e6914SHaopeng Liu
4564d6e6914SHaopeng Liudefine void @memset_non_constant(ptr %p, i64 %i) {
4574d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
4584d6e6914SHaopeng Liu; CHECK-LABEL: define void @memset_non_constant(
459*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[P:%.*]], i64 [[I:%.*]]) #[[ATTR0]] {
4604d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr [[P]], i8 2, i64 [[I]], i1 false)
4614d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4624d6e6914SHaopeng Liu;
4634d6e6914SHaopeng Liu  call void @llvm.memset(ptr %p, i8 2, i64 %i, i1 false)
4644d6e6914SHaopeng Liu  ret void
4654d6e6914SHaopeng Liu}
4664d6e6914SHaopeng Liu
4674d6e6914SHaopeng Liudeclare void @llvm.memcpy(ptr, ptr, i64 ,i1)
4684d6e6914SHaopeng Liu
4694d6e6914SHaopeng Liudefine void @memcpy(ptr %p, ptr %p2) {
4704d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
4714d6e6914SHaopeng Liu; CHECK-LABEL: define void @memcpy(
472*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 9)) [[P:%.*]], ptr readonly captures(none) [[P2:%.*]]) #[[ATTR1]] {
4734d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[P2]], i64 9, i1 false)
4744d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4754d6e6914SHaopeng Liu;
4764d6e6914SHaopeng Liu  call void @llvm.memcpy(ptr %p, ptr %p2, i64 9, i1 false)
4774d6e6914SHaopeng Liu  ret void
4784d6e6914SHaopeng Liu}
4794d6e6914SHaopeng Liu
4804d6e6914SHaopeng Liudefine void @memcpy_volatile(ptr %p, ptr %p2) {
4814d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
4824d6e6914SHaopeng Liu; CHECK-LABEL: define void @memcpy_volatile(
4832d760a13SNikita Popov; CHECK-SAME: ptr writeonly [[P:%.*]], ptr readonly [[P2:%.*]]) #[[ATTR6:[0-9]+]] {
4844d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[P2]], i64 9, i1 true)
4854d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4864d6e6914SHaopeng Liu;
4874d6e6914SHaopeng Liu  call void @llvm.memcpy(ptr %p, ptr %p2, i64 9, i1 true)
4884d6e6914SHaopeng Liu  ret void
4894d6e6914SHaopeng Liu}
4904d6e6914SHaopeng Liu
4914d6e6914SHaopeng Liudefine void @memcpy_offset(ptr %p, ptr %p2) {
4924d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
4934d6e6914SHaopeng Liu; CHECK-LABEL: define void @memcpy_offset(
494*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((3, 12)) [[P:%.*]], ptr readonly captures(none) [[P2:%.*]]) #[[ATTR1]] {
4954d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 3
4964d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[G]], ptr [[P2]], i64 9, i1 false)
4974d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
4984d6e6914SHaopeng Liu;
4994d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 3
5004d6e6914SHaopeng Liu  call void @llvm.memcpy(ptr %g, ptr %p2, i64 9, i1 false)
5014d6e6914SHaopeng Liu  ret void
5024d6e6914SHaopeng Liu}
5034d6e6914SHaopeng Liu
5044d6e6914SHaopeng Liudefine void @memcpy_src(ptr %p, ptr %p2) {
5054d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
5064d6e6914SHaopeng Liu; CHECK-LABEL: define void @memcpy_src(
507*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) initializes((96, 128)) [[P:%.*]], ptr captures(none) initializes((0, 96)) [[P2:%.*]]) #[[ATTR1]] {
5084d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[P2]], ptr [[P]], i64 96, i1 false)
5094d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 64
5104d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[G]], ptr [[P2]], i64 64, i1 false)
5114d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5124d6e6914SHaopeng Liu;
5134d6e6914SHaopeng Liu  call void @llvm.memcpy(ptr %p2, ptr %p, i64 96, i1 false)
5144d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 64
5154d6e6914SHaopeng Liu  call void @llvm.memcpy(ptr %g, ptr %p2, i64 64, i1 false)
5164d6e6914SHaopeng Liu  ret void
5174d6e6914SHaopeng Liu}
5184d6e6914SHaopeng Liu
5194d6e6914SHaopeng Liudefine void @memcpy_non_constant(ptr %p, ptr %p2, i64 %i) {
5204d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
5214d6e6914SHaopeng Liu; CHECK-LABEL: define void @memcpy_non_constant(
522*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[P:%.*]], ptr readonly captures(none) [[P2:%.*]], i64 [[I:%.*]]) #[[ATTR1]] {
5234d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[P]], ptr [[P2]], i64 [[I]], i1 false)
5244d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5254d6e6914SHaopeng Liu;
5264d6e6914SHaopeng Liu  call void @llvm.memcpy(ptr %p, ptr %p2, i64 %i, i1 false)
5274d6e6914SHaopeng Liu  ret void
5284d6e6914SHaopeng Liu}
5294d6e6914SHaopeng Liu
5304d6e6914SHaopeng Liudeclare void @llvm.memmove(ptr, ptr, i64 ,i1)
5314d6e6914SHaopeng Liu
5324d6e6914SHaopeng Liudefine void @memmove(ptr %p, ptr %p2) {
5334d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
5344d6e6914SHaopeng Liu; CHECK-LABEL: define void @memmove(
535*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((0, 9)) [[P:%.*]], ptr readonly captures(none) [[P2:%.*]]) #[[ATTR1]] {
5364d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[P]], ptr [[P2]], i64 9, i1 false)
5374d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5384d6e6914SHaopeng Liu;
5394d6e6914SHaopeng Liu  call void @llvm.memmove(ptr %p, ptr %p2, i64 9, i1 false)
5404d6e6914SHaopeng Liu  ret void
5414d6e6914SHaopeng Liu}
5424d6e6914SHaopeng Liu
5434d6e6914SHaopeng Liudefine void @memmove_volatile(ptr %p, ptr %p2) {
5444d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)
5454d6e6914SHaopeng Liu; CHECK-LABEL: define void @memmove_volatile(
5462d760a13SNikita Popov; CHECK-SAME: ptr writeonly [[P:%.*]], ptr readonly [[P2:%.*]]) #[[ATTR6]] {
5474d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[P]], ptr [[P2]], i64 9, i1 true)
5484d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5494d6e6914SHaopeng Liu;
5504d6e6914SHaopeng Liu  call void @llvm.memmove(ptr %p, ptr %p2, i64 9, i1 true)
5514d6e6914SHaopeng Liu  ret void
5524d6e6914SHaopeng Liu}
5534d6e6914SHaopeng Liu
5544d6e6914SHaopeng Liudefine void @memmove_offset(ptr %p, ptr %p2) {
5554d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
5564d6e6914SHaopeng Liu; CHECK-LABEL: define void @memmove_offset(
557*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) initializes((3, 12)) [[P:%.*]], ptr readonly captures(none) [[P2:%.*]]) #[[ATTR1]] {
5584d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 3
5594d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[G]], ptr [[P2]], i64 9, i1 false)
5604d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5614d6e6914SHaopeng Liu;
5624d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 3
5634d6e6914SHaopeng Liu  call void @llvm.memmove(ptr %g, ptr %p2, i64 9, i1 false)
5644d6e6914SHaopeng Liu  ret void
5654d6e6914SHaopeng Liu}
5664d6e6914SHaopeng Liu
5674d6e6914SHaopeng Liudefine void @memmove_src(ptr %p, ptr %p2) {
5684d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
5694d6e6914SHaopeng Liu; CHECK-LABEL: define void @memmove_src(
570*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) initializes((96, 128)) [[P:%.*]], ptr captures(none) initializes((0, 96)) [[P2:%.*]]) #[[ATTR1]] {
5714d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[P2]], ptr [[P]], i64 96, i1 false)
5724d6e6914SHaopeng Liu; CHECK-NEXT:    [[G:%.*]] = getelementptr i8, ptr [[P]], i64 64
5734d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[G]], ptr [[P2]], i64 64, i1 false)
5744d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5754d6e6914SHaopeng Liu;
5764d6e6914SHaopeng Liu  call void @llvm.memmove(ptr %p2, ptr %p, i64 96, i1 false)
5774d6e6914SHaopeng Liu  %g = getelementptr i8, ptr %p, i64 64
5784d6e6914SHaopeng Liu  call void @llvm.memmove(ptr %g, ptr %p2, i64 64, i1 false)
5794d6e6914SHaopeng Liu  ret void
5804d6e6914SHaopeng Liu}
5814d6e6914SHaopeng Liu
5824d6e6914SHaopeng Liudefine void @memmove_non_constant(ptr %p, ptr %p2, i64 %i) {
5834d6e6914SHaopeng Liu; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
5844d6e6914SHaopeng Liu; CHECK-LABEL: define void @memmove_non_constant(
585*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[P:%.*]], ptr readonly captures(none) [[P2:%.*]], i64 [[I:%.*]]) #[[ATTR1]] {
5864d6e6914SHaopeng Liu; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[P]], ptr [[P2]], i64 [[I]], i1 false)
5874d6e6914SHaopeng Liu; CHECK-NEXT:    ret void
5884d6e6914SHaopeng Liu;
5894d6e6914SHaopeng Liu  call void @llvm.memmove(ptr %p, ptr %p2, i64 %i, i1 false)
5904d6e6914SHaopeng Liu  ret void
5914d6e6914SHaopeng Liu}
5922d760a13SNikita Popov
5932d760a13SNikita Popovdefine void @callee_byval(ptr byval(i32) %p) {
5942d760a13SNikita Popov; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
5952d760a13SNikita Popov; CHECK-LABEL: define void @callee_byval(
596*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly byval(i32) captures(none) initializes((0, 4)) [[P:%.*]]) #[[ATTR0]] {
5972d760a13SNikita Popov; CHECK-NEXT:    store i32 0, ptr [[P]], align 4
5982d760a13SNikita Popov; CHECK-NEXT:    ret void
5992d760a13SNikita Popov;
6002d760a13SNikita Popov  store i32 0, ptr %p
6012d760a13SNikita Popov  ret void
6022d760a13SNikita Popov}
6032d760a13SNikita Popov
6042d760a13SNikita Popovdefine void @caller_byval(ptr %p) {
6052d760a13SNikita Popov; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)
6062d760a13SNikita Popov; CHECK-LABEL: define void @caller_byval(
607*29441e4fSNikita Popov; CHECK-SAME: ptr readonly captures(none) [[P:%.*]]) #[[ATTR0]] {
6082d760a13SNikita Popov; CHECK-NEXT:    call void @callee_byval(ptr byval(i32) [[P]])
6092d760a13SNikita Popov; CHECK-NEXT:    ret void
6102d760a13SNikita Popov;
6112d760a13SNikita Popov  call void @callee_byval(ptr byval(i32) %p)
6122d760a13SNikita Popov  ret void
6132d760a13SNikita Popov}
6144233a15cSFlorian Hahn
6154233a15cSFlorian Hahndefine void @memset_offset_0_size_0(ptr %dst, ptr %src) {
6164233a15cSFlorian Hahn; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
6174233a15cSFlorian Hahn; CHECK-LABEL: define void @memset_offset_0_size_0(
618*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[DST:%.*]], ptr readonly captures(none) [[SRC:%.*]]) #[[ATTR1]] {
6194233a15cSFlorian Hahn; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 0, i1 false)
6204233a15cSFlorian Hahn; CHECK-NEXT:    ret void
6214233a15cSFlorian Hahn;
6224233a15cSFlorian Hahn  call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 0, i1 false)
6234233a15cSFlorian Hahn  ret void
6244233a15cSFlorian Hahn}
6254233a15cSFlorian Hahn
6264233a15cSFlorian Hahndefine void @memset_offset_1_size_0(ptr %dst, ptr %src) {
6274233a15cSFlorian Hahn; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)
6284233a15cSFlorian Hahn; CHECK-LABEL: define void @memset_offset_1_size_0(
629*29441e4fSNikita Popov; CHECK-SAME: ptr writeonly captures(none) [[DST:%.*]], ptr readonly captures(none) [[SRC:%.*]]) #[[ATTR1]] {
6304233a15cSFlorian Hahn; CHECK-NEXT:    [[DST_1:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 1
6314233a15cSFlorian Hahn; CHECK-NEXT:    call void @llvm.memmove.p0.p0.i64(ptr [[DST_1]], ptr [[SRC]], i64 0, i1 false)
6324233a15cSFlorian Hahn; CHECK-NEXT:    ret void
6334233a15cSFlorian Hahn;
6344233a15cSFlorian Hahn  %dst.1 = getelementptr inbounds i8, ptr %dst, i64 1
6354233a15cSFlorian Hahn  call void @llvm.memmove.p0.p0.i64(ptr %dst.1, ptr %src, i64 0, i1 false)
6364233a15cSFlorian Hahn  ret void
6374233a15cSFlorian Hahn}
638