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