brintos

brintos / llvm-project-archived public Read only

0
0
Text · 36.7 KiB · 8fc72a1 Raw
789 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes2; RUN: opt < %s -passes=function-attrs -S | FileCheck --check-prefixes=COMMON,FNATTRS %s3; RUN: opt < %s -passes=attributor-light -S | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s4; RUN: opt < %s -passes=attributor-light-cgscc -S | FileCheck --check-prefixes=COMMON,ATTRIBUTOR-CGSCC %s5 6@x = global i32 07 8declare void @test1_1(ptr %x1_1, ptr nocapture readonly %y1_1, ...)9 10define void @test1_2(ptr %x1_2, ptr %y1_2, ptr %z1_2) {11; FNATTRS-LABEL: define {{[^@]+}}@test1_212; FNATTRS-SAME: (ptr [[X1_2:%.*]], ptr readonly captures(none) [[Y1_2:%.*]], ptr [[Z1_2:%.*]]) {13; FNATTRS-NEXT:    call void (ptr, ptr, ...) @test1_1(ptr [[X1_2]], ptr [[Y1_2]], ptr [[Z1_2]])14; FNATTRS-NEXT:    store i32 0, ptr @x, align 415; FNATTRS-NEXT:    ret void16;17; ATTRIBUTOR-LABEL: define {{[^@]+}}@test1_218; ATTRIBUTOR-SAME: (ptr [[X1_2:%.*]], ptr nofree readonly captures(none) [[Y1_2:%.*]], ptr [[Z1_2:%.*]]) {19; ATTRIBUTOR-NEXT:    call void (ptr, ptr, ...) @test1_1(ptr [[X1_2]], ptr nofree readonly captures(none) [[Y1_2]], ptr [[Z1_2]])20; ATTRIBUTOR-NEXT:    store i32 0, ptr @x, align 421; ATTRIBUTOR-NEXT:    ret void22;23; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test1_224; ATTRIBUTOR-CGSCC-SAME: (ptr [[X1_2:%.*]], ptr nofree readonly captures(none) [[Y1_2:%.*]], ptr [[Z1_2:%.*]]) {25; ATTRIBUTOR-CGSCC-NEXT:    call void (ptr, ptr, ...) @test1_1(ptr [[X1_2]], ptr nofree readonly captures(none) [[Y1_2]], ptr [[Z1_2]])26; ATTRIBUTOR-CGSCC-NEXT:    store i32 0, ptr @x, align 427; ATTRIBUTOR-CGSCC-NEXT:    ret void28;29  call void (ptr, ptr, ...) @test1_1(ptr %x1_2, ptr %y1_2, ptr %z1_2)30  store i32 0, ptr @x31  ret void32}33 34; TODO: Missing with attributor-light: argmem: none, inaccessiblemem: none35define ptr @test2(ptr %p) {36; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write, argmem: none, inaccessiblemem: none, target_mem0: none, target_mem1: none)37; FNATTRS-LABEL: define {{[^@]+}}@test238; FNATTRS-SAME: (ptr readnone returned captures(ret: address, provenance) [[P:%.*]]) #[[ATTR0:[0-9]+]] {39; FNATTRS-NEXT:    store i32 0, ptr @x, align 440; FNATTRS-NEXT:    ret ptr [[P]]41;42; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)43; ATTRIBUTOR-LABEL: define {{[^@]+}}@test244; ATTRIBUTOR-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR0:[0-9]+]] {45; ATTRIBUTOR-NEXT:    store i32 0, ptr @x, align 446; ATTRIBUTOR-NEXT:    ret ptr [[P]]47;48; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)49; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test250; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR0:[0-9]+]] {51; ATTRIBUTOR-CGSCC-NEXT:    store i32 0, ptr @x, align 452; ATTRIBUTOR-CGSCC-NEXT:    ret ptr [[P]]53;54  store i32 0, ptr @x55  ret ptr %p56}57 58define i1 @test3(ptr %p, ptr %q) {59; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)60; FNATTRS-LABEL: define {{[^@]+}}@test361; FNATTRS-SAME: (ptr readnone captures(address) [[P:%.*]], ptr readnone captures(address) [[Q:%.*]]) #[[ATTR1:[0-9]+]] {62; FNATTRS-NEXT:    [[A:%.*]] = icmp ult ptr [[P]], [[Q]]63; FNATTRS-NEXT:    ret i1 [[A]]64;65; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)66; ATTRIBUTOR-LABEL: define {{[^@]+}}@test367; ATTRIBUTOR-SAME: (ptr nofree readnone [[P:%.*]], ptr nofree readnone [[Q:%.*]]) #[[ATTR1:[0-9]+]] {68; ATTRIBUTOR-NEXT:    [[A:%.*]] = icmp ult ptr [[P]], [[Q]]69; ATTRIBUTOR-NEXT:    ret i1 [[A]]70;71; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)72; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test373; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readnone [[P:%.*]], ptr nofree readnone [[Q:%.*]]) #[[ATTR1:[0-9]+]] {74; ATTRIBUTOR-CGSCC-NEXT:    [[A:%.*]] = icmp ult ptr [[P]], [[Q]]75; ATTRIBUTOR-CGSCC-NEXT:    ret i1 [[A]]76;77  %A = icmp ult ptr %p, %q78  ret i1 %A79}80 81declare void @test4_1(ptr nocapture) readonly82 83define void @test4_2(ptr %p) {84; FNATTRS: Function Attrs: nofree memory(read)85; FNATTRS-LABEL: define {{[^@]+}}@test4_286; FNATTRS-SAME: (ptr readonly captures(none) [[P:%.*]]) #[[ATTR3:[0-9]+]] {87; FNATTRS-NEXT:    call void @test4_1(ptr [[P]])88; FNATTRS-NEXT:    ret void89;90; ATTRIBUTOR: Function Attrs: nosync memory(read)91; ATTRIBUTOR-LABEL: define {{[^@]+}}@test4_292; ATTRIBUTOR-SAME: (ptr readonly captures(none) [[P:%.*]]) #[[ATTR3:[0-9]+]] {93; ATTRIBUTOR-NEXT:    call void @test4_1(ptr readonly captures(none) [[P]]) #[[ATTR3]]94; ATTRIBUTOR-NEXT:    ret void95;96; ATTRIBUTOR-CGSCC: Function Attrs: nosync memory(read)97; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test4_298; ATTRIBUTOR-CGSCC-SAME: (ptr readonly captures(none) [[P:%.*]]) #[[ATTR3:[0-9]+]] {99; ATTRIBUTOR-CGSCC-NEXT:    call void @test4_1(ptr readonly captures(none) [[P]]) #[[ATTR3]]100; ATTRIBUTOR-CGSCC-NEXT:    ret void101;102  call void @test4_1(ptr %p)103  ret void104}105 106; Missed optz'n: we could make %q readnone, but don't break test6!107define void @test5(ptr %p, ptr %q) {108; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)109; FNATTRS-LABEL: define {{[^@]+}}@test5110; FNATTRS-SAME: (ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR4:[0-9]+]] {111; FNATTRS-NEXT:    store ptr [[Q]], ptr [[P]], align 8112; FNATTRS-NEXT:    ret void113;114; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)115; ATTRIBUTOR-LABEL: define {{[^@]+}}@test5116; ATTRIBUTOR-SAME: (ptr nofree nonnull writeonly captures(none) [[P:%.*]], ptr nofree writeonly [[Q:%.*]]) #[[ATTR4:[0-9]+]] {117; ATTRIBUTOR-NEXT:    store ptr [[Q]], ptr [[P]], align 8118; ATTRIBUTOR-NEXT:    ret void119;120; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)121; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test5122; ATTRIBUTOR-CGSCC-SAME: (ptr nofree nonnull writeonly captures(none) [[P:%.*]], ptr nofree writeonly [[Q:%.*]]) #[[ATTR4:[0-9]+]] {123; ATTRIBUTOR-CGSCC-NEXT:    store ptr [[Q]], ptr [[P]], align 8124; ATTRIBUTOR-CGSCC-NEXT:    ret void125;126  store ptr %q, ptr %p127  ret void128}129 130declare void @test6_1()131 132; This is not a missed optz'n.133define void @test6_2(ptr %p, ptr %q) {134; FNATTRS-LABEL: define {{[^@]+}}@test6_2135; FNATTRS-SAME: (ptr writeonly captures(none) initializes((0, 8)) [[P:%.*]], ptr [[Q:%.*]]) {136; FNATTRS-NEXT:    store ptr [[Q]], ptr [[P]], align 8137; FNATTRS-NEXT:    call void @test6_1()138; FNATTRS-NEXT:    ret void139;140; ATTRIBUTOR-LABEL: define {{[^@]+}}@test6_2141; ATTRIBUTOR-SAME: (ptr nofree nonnull writeonly captures(none) [[P:%.*]], ptr nofree [[Q:%.*]]) {142; ATTRIBUTOR-NEXT:    store ptr [[Q]], ptr [[P]], align 8143; ATTRIBUTOR-NEXT:    call void @test6_1()144; ATTRIBUTOR-NEXT:    ret void145;146; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test6_2147; ATTRIBUTOR-CGSCC-SAME: (ptr nofree nonnull writeonly captures(none) [[P:%.*]], ptr nofree [[Q:%.*]]) {148; ATTRIBUTOR-CGSCC-NEXT:    store ptr [[Q]], ptr [[P]], align 8149; ATTRIBUTOR-CGSCC-NEXT:    call void @test6_1()150; ATTRIBUTOR-CGSCC-NEXT:    ret void151;152  store ptr %q, ptr %p153  call void @test6_1()154  ret void155}156 157; inalloca parameters are always considered written158define void @test7_1(ptr inalloca(i32) %a) {159; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)160; FNATTRS-LABEL: define {{[^@]+}}@test7_1161; FNATTRS-SAME: (ptr inalloca(i32) captures(none) [[A:%.*]]) #[[ATTR5:[0-9]+]] {162; FNATTRS-NEXT:    ret void163;164; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)165; ATTRIBUTOR-LABEL: define {{[^@]+}}@test7_1166; ATTRIBUTOR-SAME: (ptr nofree nonnull writeonly inalloca(i32) captures(none) [[A:%.*]]) #[[ATTR1]] {167; ATTRIBUTOR-NEXT:    ret void168;169; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)170; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test7_1171; ATTRIBUTOR-CGSCC-SAME: (ptr nofree nonnull writeonly inalloca(i32) captures(none) [[A:%.*]]) #[[ATTR1]] {172; ATTRIBUTOR-CGSCC-NEXT:    ret void173;174  ret void175}176 177; preallocated parameters are always considered written178define void @test7_2(ptr preallocated(i32) %a) {179; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)180; FNATTRS-LABEL: define {{[^@]+}}@test7_2181; FNATTRS-SAME: (ptr preallocated(i32) captures(none) [[A:%.*]]) #[[ATTR5]] {182; FNATTRS-NEXT:    ret void183;184; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)185; ATTRIBUTOR-LABEL: define {{[^@]+}}@test7_2186; ATTRIBUTOR-SAME: (ptr nofree nonnull writeonly preallocated(i32) captures(none) [[A:%.*]]) #[[ATTR1]] {187; ATTRIBUTOR-NEXT:    ret void188;189; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)190; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test7_2191; ATTRIBUTOR-CGSCC-SAME: (ptr nofree nonnull writeonly preallocated(i32) captures(none) [[A:%.*]]) #[[ATTR1]] {192; ATTRIBUTOR-CGSCC-NEXT:    ret void193;194  ret void195}196 197define ptr @test8_1(ptr %p) {198; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)199; FNATTRS-LABEL: define {{[^@]+}}@test8_1200; FNATTRS-SAME: (ptr readnone returned captures(ret: address, provenance) [[P:%.*]]) #[[ATTR1]] {201; FNATTRS-NEXT:  entry:202; FNATTRS-NEXT:    ret ptr [[P]]203;204; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)205; ATTRIBUTOR-LABEL: define {{[^@]+}}@test8_1206; ATTRIBUTOR-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR1]] {207; ATTRIBUTOR-NEXT:  entry:208; ATTRIBUTOR-NEXT:    ret ptr [[P]]209;210; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)211; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test8_1212; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR1]] {213; ATTRIBUTOR-CGSCC-NEXT:  entry:214; ATTRIBUTOR-CGSCC-NEXT:    ret ptr [[P]]215;216entry:217  ret ptr %p218}219 220define void @test8_2(ptr %p) {221; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)222; FNATTRS-LABEL: define {{[^@]+}}@test8_2223; FNATTRS-SAME: (ptr writeonly captures(none) [[P:%.*]]) #[[ATTR4]] {224; FNATTRS-NEXT:  entry:225; FNATTRS-NEXT:    [[CALL:%.*]] = call ptr @test8_1(ptr [[P]])226; FNATTRS-NEXT:    store i32 10, ptr [[CALL]], align 4227; FNATTRS-NEXT:    ret void228;229; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)230; ATTRIBUTOR-LABEL: define {{[^@]+}}@test8_2231; ATTRIBUTOR-SAME: (ptr nofree writeonly captures(none) [[P:%.*]]) #[[ATTR0]] {232; ATTRIBUTOR-NEXT:  entry:233; ATTRIBUTOR-NEXT:    [[CALL:%.*]] = call ptr @test8_1(ptr nofree readnone [[P]]) #[[ATTR14:[0-9]+]]234; ATTRIBUTOR-NEXT:    store i32 10, ptr [[CALL]], align 4235; ATTRIBUTOR-NEXT:    ret void236;237; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write)238; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test8_2239; ATTRIBUTOR-CGSCC-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR5:[0-9]+]] {240; ATTRIBUTOR-CGSCC-NEXT:  entry:241; ATTRIBUTOR-CGSCC-NEXT:    [[CALL:%.*]] = call ptr @test8_1(ptr nofree readnone [[P]]) #[[ATTR14:[0-9]+]]242; ATTRIBUTOR-CGSCC-NEXT:    store i32 10, ptr [[CALL]], align 4243; ATTRIBUTOR-CGSCC-NEXT:    ret void244;245entry:246  %call = call ptr @test8_1(ptr %p)247  store i32 10, ptr %call, align 4248  ret void249}250 251declare void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>%val, <4 x ptr>, i32, <4 x i1>)252 253define void @test9(<4 x ptr> %ptrs, <4 x i32>%val) {254; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)255; FNATTRS-LABEL: define {{[^@]+}}@test9256; FNATTRS-SAME: (<4 x ptr> [[PTRS:%.*]], <4 x i32> [[VAL:%.*]]) #[[ATTR6:[0-9]+]] {257; FNATTRS-NEXT:    call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VAL]], <4 x ptr> align 4 [[PTRS]], <4 x i1> <i1 true, i1 false, i1 true, i1 false>)258; FNATTRS-NEXT:    ret void259;260; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)261; ATTRIBUTOR-LABEL: define {{[^@]+}}@test9262; ATTRIBUTOR-SAME: (<4 x ptr> [[PTRS:%.*]], <4 x i32> [[VAL:%.*]]) #[[ATTR0]] {263; ATTRIBUTOR-NEXT:    call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VAL]], <4 x ptr> align 4 [[PTRS]], <4 x i1> <i1 true, i1 false, i1 true, i1 false>) #[[ATTR15:[0-9]+]]264; ATTRIBUTOR-NEXT:    ret void265;266; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)267; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test9268; ATTRIBUTOR-CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]], <4 x i32> [[VAL:%.*]]) #[[ATTR0]] {269; ATTRIBUTOR-CGSCC-NEXT:    call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VAL]], <4 x ptr> align 4 [[PTRS]], <4 x i1> <i1 true, i1 false, i1 true, i1 false>) #[[ATTR15:[0-9]+]]270; ATTRIBUTOR-CGSCC-NEXT:    ret void271;272  call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32>%val, <4 x ptr> %ptrs, i32 4, <4 x i1><i1 true, i1 false, i1 true, i1 false>)273  ret void274}275 276declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i32>)277define <4 x i32> @test10(<4 x ptr> %ptrs) {278; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read)279; FNATTRS-LABEL: define {{[^@]+}}@test10280; FNATTRS-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR7:[0-9]+]] {281; FNATTRS-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[PTRS]], <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> undef)282; FNATTRS-NEXT:    ret <4 x i32> [[RES]]283;284; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read)285; ATTRIBUTOR-LABEL: define {{[^@]+}}@test10286; ATTRIBUTOR-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR5:[0-9]+]] {287; ATTRIBUTOR-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[PTRS]], <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> undef) #[[ATTR16:[0-9]+]]288; ATTRIBUTOR-NEXT:    ret <4 x i32> [[RES]]289;290; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read)291; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test10292; ATTRIBUTOR-CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR6:[0-9]+]] {293; ATTRIBUTOR-CGSCC-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> align 4 [[PTRS]], <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> undef) #[[ATTR16:[0-9]+]]294; ATTRIBUTOR-CGSCC-NEXT:    ret <4 x i32> [[RES]]295;296  %res = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> %ptrs, i32 4, <4 x i1><i1 true, i1 false, i1 true, i1 false>, <4 x i32>undef)297  ret <4 x i32> %res298}299 300declare <4 x i32> @test11_1(<4 x ptr>) argmemonly nounwind readonly301define <4 x i32> @test11_2(<4 x ptr> %ptrs) {302; FNATTRS: Function Attrs: nofree nounwind memory(argmem: read)303; FNATTRS-LABEL: define {{[^@]+}}@test11_2304; FNATTRS-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR9:[0-9]+]] {305; FNATTRS-NEXT:    [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]])306; FNATTRS-NEXT:    ret <4 x i32> [[RES]]307;308; ATTRIBUTOR: Function Attrs: nosync nounwind memory(argmem: read)309; ATTRIBUTOR-LABEL: define {{[^@]+}}@test11_2310; ATTRIBUTOR-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR7:[0-9]+]] {311; ATTRIBUTOR-NEXT:    [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]]) #[[ATTR3]]312; ATTRIBUTOR-NEXT:    ret <4 x i32> [[RES]]313;314; ATTRIBUTOR-CGSCC: Function Attrs: nosync nounwind memory(argmem: read)315; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test11_2316; ATTRIBUTOR-CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR8:[0-9]+]] {317; ATTRIBUTOR-CGSCC-NEXT:    [[RES:%.*]] = call <4 x i32> @test11_1(<4 x ptr> [[PTRS]]) #[[ATTR3]]318; ATTRIBUTOR-CGSCC-NEXT:    ret <4 x i32> [[RES]]319;320  %res = call <4 x i32> @test11_1(<4 x ptr> %ptrs)321  ret <4 x i32> %res322}323 324declare <4 x i32> @test12_1(<4 x ptr>) argmemonly nounwind325define <4 x i32> @test12_2(<4 x ptr> %ptrs) {326; FNATTRS: Function Attrs: nounwind memory(argmem: readwrite)327; FNATTRS-LABEL: define {{[^@]+}}@test12_2328; FNATTRS-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR10:[0-9]+]] {329; FNATTRS-NEXT:    [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]])330; FNATTRS-NEXT:    ret <4 x i32> [[RES]]331;332; ATTRIBUTOR: Function Attrs: nounwind memory(argmem: readwrite)333; ATTRIBUTOR-LABEL: define {{[^@]+}}@test12_2334; ATTRIBUTOR-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR8:[0-9]+]] {335; ATTRIBUTOR-NEXT:    [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]])336; ATTRIBUTOR-NEXT:    ret <4 x i32> [[RES]]337;338; ATTRIBUTOR-CGSCC: Function Attrs: nounwind memory(argmem: readwrite)339; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@test12_2340; ATTRIBUTOR-CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR9:[0-9]+]] {341; ATTRIBUTOR-CGSCC-NEXT:    [[RES:%.*]] = call <4 x i32> @test12_1(<4 x ptr> [[PTRS]])342; ATTRIBUTOR-CGSCC-NEXT:    ret <4 x i32> [[RES]]343;344  %res = call <4 x i32> @test12_1(<4 x ptr> %ptrs)345  ret <4 x i32> %res346}347 348define i32 @volatile_load(ptr %p) {349; FNATTRS: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite, inaccessiblemem: readwrite)350; FNATTRS-LABEL: define {{[^@]+}}@volatile_load351; FNATTRS-SAME: (ptr [[P:%.*]]) #[[ATTR11:[0-9]+]] {352; FNATTRS-NEXT:    [[LOAD:%.*]] = load volatile i32, ptr [[P]], align 4353; FNATTRS-NEXT:    ret i32 [[LOAD]]354;355; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)356; ATTRIBUTOR-LABEL: define {{[^@]+}}@volatile_load357; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]]) #[[ATTR9:[0-9]+]] {358; ATTRIBUTOR-NEXT:    [[LOAD:%.*]] = load volatile i32, ptr [[P]], align 4359; ATTRIBUTOR-NEXT:    ret i32 [[LOAD]]360;361; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)362; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@volatile_load363; ATTRIBUTOR-CGSCC-SAME: (ptr nofree [[P:%.*]]) #[[ATTR10:[0-9]+]] {364; ATTRIBUTOR-CGSCC-NEXT:    [[LOAD:%.*]] = load volatile i32, ptr [[P]], align 4365; ATTRIBUTOR-CGSCC-NEXT:    ret i32 [[LOAD]]366;367  %load = load volatile i32, ptr %p368  ret i32 %load369}370 371declare void @escape_readnone_ptr(ptr %addr, ptr readnone %ptr)372declare void @escape_readonly_ptr(ptr %addr, ptr readonly %ptr)373 374; The argument pointer %escaped_then_written cannot be marked readnone/only even375; though the only direct use, in @escape_readnone_ptr/@escape_readonly_ptr,376; is marked as readnone/only. However, the functions can write the pointer into377; %addr, causing the store to write to %escaped_then_written.378define void @unsound_readnone(ptr %ignored, ptr %escaped_then_written) {379; FNATTRS-LABEL: define {{[^@]+}}@unsound_readnone380; FNATTRS-SAME: (ptr readnone captures(none) [[IGNORED:%.*]], ptr [[ESCAPED_THEN_WRITTEN:%.*]]) {381; FNATTRS-NEXT:    [[ADDR:%.*]] = alloca ptr, align 8382; FNATTRS-NEXT:    call void @escape_readnone_ptr(ptr [[ADDR]], ptr [[ESCAPED_THEN_WRITTEN]])383; FNATTRS-NEXT:    [[ADDR_LD:%.*]] = load ptr, ptr [[ADDR]], align 8384; FNATTRS-NEXT:    store i8 0, ptr [[ADDR_LD]], align 1385; FNATTRS-NEXT:    ret void386;387; ATTRIBUTOR-LABEL: define {{[^@]+}}@unsound_readnone388; ATTRIBUTOR-SAME: (ptr nofree readnone captures(none) [[IGNORED:%.*]], ptr nofree [[ESCAPED_THEN_WRITTEN:%.*]]) {389; ATTRIBUTOR-NEXT:    [[ADDR:%.*]] = alloca ptr, align 8390; ATTRIBUTOR-NEXT:    call void @escape_readnone_ptr(ptr [[ADDR]], ptr nofree [[ESCAPED_THEN_WRITTEN]])391; ATTRIBUTOR-NEXT:    [[ADDR_LD:%.*]] = load ptr, ptr [[ADDR]], align 8392; ATTRIBUTOR-NEXT:    store i8 0, ptr [[ADDR_LD]], align 1393; ATTRIBUTOR-NEXT:    ret void394;395; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@unsound_readnone396; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readnone captures(none) [[IGNORED:%.*]], ptr nofree [[ESCAPED_THEN_WRITTEN:%.*]]) {397; ATTRIBUTOR-CGSCC-NEXT:    [[ADDR:%.*]] = alloca ptr, align 8398; ATTRIBUTOR-CGSCC-NEXT:    call void @escape_readnone_ptr(ptr [[ADDR]], ptr nofree [[ESCAPED_THEN_WRITTEN]])399; ATTRIBUTOR-CGSCC-NEXT:    [[ADDR_LD:%.*]] = load ptr, ptr [[ADDR]], align 8400; ATTRIBUTOR-CGSCC-NEXT:    store i8 0, ptr [[ADDR_LD]], align 1401; ATTRIBUTOR-CGSCC-NEXT:    ret void402;403  %addr = alloca ptr404  call void @escape_readnone_ptr(ptr %addr, ptr %escaped_then_written)405  %addr.ld = load ptr, ptr %addr406  store i8 0, ptr %addr.ld407  ret void408}409 410define void @unsound_readonly(ptr %ignored, ptr %escaped_then_written) {411; FNATTRS-LABEL: define {{[^@]+}}@unsound_readonly412; FNATTRS-SAME: (ptr readnone captures(none) [[IGNORED:%.*]], ptr [[ESCAPED_THEN_WRITTEN:%.*]]) {413; FNATTRS-NEXT:    [[ADDR:%.*]] = alloca ptr, align 8414; FNATTRS-NEXT:    call void @escape_readonly_ptr(ptr [[ADDR]], ptr [[ESCAPED_THEN_WRITTEN]])415; FNATTRS-NEXT:    [[ADDR_LD:%.*]] = load ptr, ptr [[ADDR]], align 8416; FNATTRS-NEXT:    store i8 0, ptr [[ADDR_LD]], align 1417; FNATTRS-NEXT:    ret void418;419; ATTRIBUTOR-LABEL: define {{[^@]+}}@unsound_readonly420; ATTRIBUTOR-SAME: (ptr nofree readnone captures(none) [[IGNORED:%.*]], ptr nofree [[ESCAPED_THEN_WRITTEN:%.*]]) {421; ATTRIBUTOR-NEXT:    [[ADDR:%.*]] = alloca ptr, align 8422; ATTRIBUTOR-NEXT:    call void @escape_readonly_ptr(ptr [[ADDR]], ptr nofree [[ESCAPED_THEN_WRITTEN]])423; ATTRIBUTOR-NEXT:    [[ADDR_LD:%.*]] = load ptr, ptr [[ADDR]], align 8424; ATTRIBUTOR-NEXT:    store i8 0, ptr [[ADDR_LD]], align 1425; ATTRIBUTOR-NEXT:    ret void426;427; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@unsound_readonly428; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readnone captures(none) [[IGNORED:%.*]], ptr nofree [[ESCAPED_THEN_WRITTEN:%.*]]) {429; ATTRIBUTOR-CGSCC-NEXT:    [[ADDR:%.*]] = alloca ptr, align 8430; ATTRIBUTOR-CGSCC-NEXT:    call void @escape_readonly_ptr(ptr [[ADDR]], ptr nofree [[ESCAPED_THEN_WRITTEN]])431; ATTRIBUTOR-CGSCC-NEXT:    [[ADDR_LD:%.*]] = load ptr, ptr [[ADDR]], align 8432; ATTRIBUTOR-CGSCC-NEXT:    store i8 0, ptr [[ADDR_LD]], align 1433; ATTRIBUTOR-CGSCC-NEXT:    ret void434;435  %addr = alloca ptr436  call void @escape_readonly_ptr(ptr %addr, ptr %escaped_then_written)437  %addr.ld = load ptr, ptr %addr438  store i8 0, ptr %addr.ld439  ret void440}441 442define void @fptr_test1a(ptr %p, ptr %f) {443; FNATTRS-LABEL: define {{[^@]+}}@fptr_test1a444; FNATTRS-SAME: (ptr readnone captures(none) [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) {445; FNATTRS-NEXT:    call void [[F]](ptr readnone captures(none) [[P]])446; FNATTRS-NEXT:    ret void447;448; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test1a449; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {450; ATTRIBUTOR-NEXT:    call void [[F]](ptr nofree readnone captures(none) [[P]])451; ATTRIBUTOR-NEXT:    ret void452;453; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@fptr_test1a454; ATTRIBUTOR-CGSCC-SAME: (ptr nofree captures(none) [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {455; ATTRIBUTOR-CGSCC-NEXT:    call void [[F]](ptr nofree readnone captures(none) [[P]])456; ATTRIBUTOR-CGSCC-NEXT:    ret void457;458  call void %f(ptr nocapture readnone %p)459  ret void460}461 462; Can't infer readnone here because call might capture %p463define void @fptr_test1b(ptr %p, ptr %f) {464; FNATTRS-LABEL: define {{[^@]+}}@fptr_test1b465; FNATTRS-SAME: (ptr [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) {466; FNATTRS-NEXT:    call void [[F]](ptr readnone [[P]])467; FNATTRS-NEXT:    ret void468;469; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test1b470; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {471; ATTRIBUTOR-NEXT:    call void [[F]](ptr nofree readnone [[P]])472; ATTRIBUTOR-NEXT:    ret void473;474; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@fptr_test1b475; ATTRIBUTOR-CGSCC-SAME: (ptr nofree [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {476; ATTRIBUTOR-CGSCC-NEXT:    call void [[F]](ptr nofree readnone [[P]])477; ATTRIBUTOR-CGSCC-NEXT:    ret void478;479  call void %f(ptr readnone %p)480  ret void481}482 483define void @fptr_test1c(ptr %p, ptr %f) {484; FNATTRS: Function Attrs: nofree memory(read)485; FNATTRS-LABEL: define {{[^@]+}}@fptr_test1c486; FNATTRS-SAME: (ptr readnone captures(address) [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) #[[ATTR3]] {487; FNATTRS-NEXT:    call void [[F]](ptr readnone [[P]]) #[[ATTR2:[0-9]+]]488; FNATTRS-NEXT:    ret void489;490; ATTRIBUTOR: Function Attrs: memory(read)491; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test1c492; ATTRIBUTOR-SAME: (ptr nofree readonly [[P:%.*]], ptr nofree nonnull readonly captures(none) [[F:%.*]]) #[[ATTR2:[0-9]+]] {493; ATTRIBUTOR-NEXT:    call void [[F]](ptr nofree readnone [[P]]) #[[ATTR2]]494; ATTRIBUTOR-NEXT:    ret void495;496; ATTRIBUTOR-CGSCC: Function Attrs: memory(read)497; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@fptr_test1c498; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readonly [[P:%.*]], ptr nofree nonnull readonly captures(none) [[F:%.*]]) #[[ATTR2:[0-9]+]] {499; ATTRIBUTOR-CGSCC-NEXT:    call void [[F]](ptr nofree readnone [[P]]) #[[ATTR2]]500; ATTRIBUTOR-CGSCC-NEXT:    ret void501;502  call void %f(ptr readnone %p) readonly503  ret void504}505 506define void @fptr_test2a(ptr %p, ptr %f) {507; FNATTRS-LABEL: define {{[^@]+}}@fptr_test2a508; FNATTRS-SAME: (ptr readonly captures(none) [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) {509; FNATTRS-NEXT:    call void [[F]](ptr readonly captures(none) [[P]])510; FNATTRS-NEXT:    ret void511;512; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test2a513; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {514; ATTRIBUTOR-NEXT:    call void [[F]](ptr nofree readonly captures(none) [[P]])515; ATTRIBUTOR-NEXT:    ret void516;517; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@fptr_test2a518; ATTRIBUTOR-CGSCC-SAME: (ptr nofree captures(none) [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {519; ATTRIBUTOR-CGSCC-NEXT:    call void [[F]](ptr nofree readonly captures(none) [[P]])520; ATTRIBUTOR-CGSCC-NEXT:    ret void521;522  call void %f(ptr nocapture readonly %p)523  ret void524}525 526define void @fptr_test2b(ptr %p, ptr %f) {527  ; Can't infer readonly here because call might capture %p528; FNATTRS-LABEL: define {{[^@]+}}@fptr_test2b529; FNATTRS-SAME: (ptr [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) {530; FNATTRS-NEXT:    call void [[F]](ptr readonly [[P]])531; FNATTRS-NEXT:    ret void532;533; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test2b534; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {535; ATTRIBUTOR-NEXT:    call void [[F]](ptr nofree readonly [[P]])536; ATTRIBUTOR-NEXT:    ret void537;538; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@fptr_test2b539; ATTRIBUTOR-CGSCC-SAME: (ptr nofree [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {540; ATTRIBUTOR-CGSCC-NEXT:    call void [[F]](ptr nofree readonly [[P]])541; ATTRIBUTOR-CGSCC-NEXT:    ret void542;543  call void %f(ptr readonly %p)544  ret void545}546 547define void @fptr_test2c(ptr %p, ptr %f) {548; FNATTRS: Function Attrs: nofree memory(read)549; FNATTRS-LABEL: define {{[^@]+}}@fptr_test2c550; FNATTRS-SAME: (ptr readonly captures(address) [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) #[[ATTR3]] {551; FNATTRS-NEXT:    call void [[F]](ptr readonly [[P]]) #[[ATTR2]]552; FNATTRS-NEXT:    ret void553;554; ATTRIBUTOR: Function Attrs: memory(read)555; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test2c556; ATTRIBUTOR-SAME: (ptr nofree readonly [[P:%.*]], ptr nofree nonnull readonly captures(none) [[F:%.*]]) #[[ATTR2]] {557; ATTRIBUTOR-NEXT:    call void [[F]](ptr nofree readonly [[P]]) #[[ATTR2]]558; ATTRIBUTOR-NEXT:    ret void559;560; ATTRIBUTOR-CGSCC: Function Attrs: memory(read)561; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@fptr_test2c562; ATTRIBUTOR-CGSCC-SAME: (ptr nofree readonly [[P:%.*]], ptr nofree nonnull readonly captures(none) [[F:%.*]]) #[[ATTR2]] {563; ATTRIBUTOR-CGSCC-NEXT:    call void [[F]](ptr nofree readonly [[P]]) #[[ATTR2]]564; ATTRIBUTOR-CGSCC-NEXT:    ret void565;566  call void %f(ptr readonly %p) readonly567  ret void568}569 570define void @alloca_recphi() {571; FNATTRS: Function Attrs: nofree norecurse nosync nounwind memory(none)572; FNATTRS-LABEL: define {{[^@]+}}@alloca_recphi573; FNATTRS-SAME: () #[[ATTR12:[0-9]+]] {574; FNATTRS-NEXT:  entry:575; FNATTRS-NEXT:    [[A:%.*]] = alloca [8 x i32], align 4576; FNATTRS-NEXT:    [[A_END:%.*]] = getelementptr i32, ptr [[A]], i64 8577; FNATTRS-NEXT:    br label [[LOOP:%.*]]578; FNATTRS:       loop:579; FNATTRS-NEXT:    [[P:%.*]] = phi ptr [ [[A]], [[ENTRY:%.*]] ], [ [[P_NEXT:%.*]], [[LOOP]] ]580; FNATTRS-NEXT:    store i32 0, ptr [[P]], align 4581; FNATTRS-NEXT:    [[TMP0:%.*]] = load i32, ptr [[P]], align 4582; FNATTRS-NEXT:    [[P_NEXT]] = getelementptr i32, ptr [[P]], i64 1583; FNATTRS-NEXT:    [[C:%.*]] = icmp ne ptr [[P_NEXT]], [[A_END]]584; FNATTRS-NEXT:    br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]585; FNATTRS:       exit:586; FNATTRS-NEXT:    ret void587;588; ATTRIBUTOR: Function Attrs: nofree norecurse nosync nounwind memory(none)589; ATTRIBUTOR-LABEL: define {{[^@]+}}@alloca_recphi590; ATTRIBUTOR-SAME: () #[[ATTR10:[0-9]+]] {591; ATTRIBUTOR-NEXT:  entry:592; ATTRIBUTOR-NEXT:    [[A:%.*]] = alloca [8 x i32], align 4593; ATTRIBUTOR-NEXT:    [[A_END:%.*]] = getelementptr i32, ptr [[A]], i64 8594; ATTRIBUTOR-NEXT:    br label [[LOOP:%.*]]595; ATTRIBUTOR:       loop:596; ATTRIBUTOR-NEXT:    [[P:%.*]] = phi ptr [ [[A]], [[ENTRY:%.*]] ], [ [[P_NEXT:%.*]], [[LOOP]] ]597; ATTRIBUTOR-NEXT:    store i32 0, ptr [[P]], align 4598; ATTRIBUTOR-NEXT:    [[TMP0:%.*]] = load i32, ptr [[P]], align 4599; ATTRIBUTOR-NEXT:    [[P_NEXT]] = getelementptr i32, ptr [[P]], i64 1600; ATTRIBUTOR-NEXT:    [[C:%.*]] = icmp ne ptr [[P_NEXT]], [[A_END]]601; ATTRIBUTOR-NEXT:    br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]602; ATTRIBUTOR:       exit:603; ATTRIBUTOR-NEXT:    ret void604;605; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)606; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@alloca_recphi607; ATTRIBUTOR-CGSCC-SAME: () #[[ATTR1]] {608; ATTRIBUTOR-CGSCC-NEXT:  entry:609; ATTRIBUTOR-CGSCC-NEXT:    [[A:%.*]] = alloca [8 x i32], align 4610; ATTRIBUTOR-CGSCC-NEXT:    [[A_END:%.*]] = getelementptr i32, ptr [[A]], i64 8611; ATTRIBUTOR-CGSCC-NEXT:    br label [[LOOP:%.*]]612; ATTRIBUTOR-CGSCC:       loop:613; ATTRIBUTOR-CGSCC-NEXT:    [[P:%.*]] = phi ptr [ [[A]], [[ENTRY:%.*]] ], [ [[P_NEXT:%.*]], [[LOOP]] ]614; ATTRIBUTOR-CGSCC-NEXT:    store i32 0, ptr [[P]], align 4615; ATTRIBUTOR-CGSCC-NEXT:    [[TMP0:%.*]] = load i32, ptr [[P]], align 4616; ATTRIBUTOR-CGSCC-NEXT:    [[P_NEXT]] = getelementptr i32, ptr [[P]], i64 1617; ATTRIBUTOR-CGSCC-NEXT:    [[C:%.*]] = icmp ne ptr [[P_NEXT]], [[A_END]]618; ATTRIBUTOR-CGSCC-NEXT:    br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]619; ATTRIBUTOR-CGSCC:       exit:620; ATTRIBUTOR-CGSCC-NEXT:    ret void621;622entry:623  %a = alloca [8 x i32]624  %a.end = getelementptr i32, ptr %a, i64 8625  br label %loop626 627loop:628  %p = phi ptr [ %a, %entry ], [ %p.next, %loop ]629  store i32 0, ptr %p630  load i32, ptr %p631  %p.next = getelementptr i32, ptr %p, i64 1632  %c = icmp ne ptr %p.next, %a.end633  br i1 %c, label %loop, label %exit634 635exit:636  ret void637}638 639declare void @readnone_param(ptr nocapture readnone %p)640declare void @readonly_param(ptr nocapture readonly %p)641 642; FIXME: While this can't be readnone, this could be readonly.643define void @op_bundle_readnone_deopt(ptr %p) {644; FNATTRS-LABEL: define {{[^@]+}}@op_bundle_readnone_deopt645; FNATTRS-SAME: (ptr captures(none) [[P:%.*]]) {646; FNATTRS-NEXT:    call void @readnone_param(ptr [[P]]) [ "deopt"() ]647; FNATTRS-NEXT:    ret void648;649; ATTRIBUTOR-LABEL: define {{[^@]+}}@op_bundle_readnone_deopt650; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) {651; ATTRIBUTOR-NEXT:    call void @readnone_param(ptr nofree captures(none) [[P]]) [ "deopt"() ]652; ATTRIBUTOR-NEXT:    ret void653;654; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@op_bundle_readnone_deopt655; ATTRIBUTOR-CGSCC-SAME: (ptr nofree captures(none) [[P:%.*]]) {656; ATTRIBUTOR-CGSCC-NEXT:    call void @readnone_param(ptr nofree captures(none) [[P]]) [ "deopt"() ]657; ATTRIBUTOR-CGSCC-NEXT:    ret void658;659  call void @readnone_param(ptr %p) ["deopt"()]660  ret void661}662 663define void @op_bundle_readnone_unknown(ptr %p) {664; FNATTRS-LABEL: define {{[^@]+}}@op_bundle_readnone_unknown665; FNATTRS-SAME: (ptr captures(none) [[P:%.*]]) {666; FNATTRS-NEXT:    call void @readnone_param(ptr [[P]]) [ "unknown"() ]667; FNATTRS-NEXT:    ret void668;669; ATTRIBUTOR-LABEL: define {{[^@]+}}@op_bundle_readnone_unknown670; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) {671; ATTRIBUTOR-NEXT:    call void @readnone_param(ptr nofree captures(none) [[P]]) [ "unknown"() ]672; ATTRIBUTOR-NEXT:    ret void673;674; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@op_bundle_readnone_unknown675; ATTRIBUTOR-CGSCC-SAME: (ptr nofree captures(none) [[P:%.*]]) {676; ATTRIBUTOR-CGSCC-NEXT:    call void @readnone_param(ptr nofree captures(none) [[P]]) [ "unknown"() ]677; ATTRIBUTOR-CGSCC-NEXT:    ret void678;679  call void @readnone_param(ptr %p) ["unknown"()]680  ret void681}682 683define void @op_bundle_readonly_deopt(ptr %p) {684; FNATTRS-LABEL: define {{[^@]+}}@op_bundle_readonly_deopt685; FNATTRS-SAME: (ptr readonly captures(none) [[P:%.*]]) {686; FNATTRS-NEXT:    call void @readonly_param(ptr [[P]]) [ "deopt"() ]687; FNATTRS-NEXT:    ret void688;689; ATTRIBUTOR-LABEL: define {{[^@]+}}@op_bundle_readonly_deopt690; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) {691; ATTRIBUTOR-NEXT:    call void @readonly_param(ptr nofree captures(none) [[P]]) [ "deopt"() ]692; ATTRIBUTOR-NEXT:    ret void693;694; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@op_bundle_readonly_deopt695; ATTRIBUTOR-CGSCC-SAME: (ptr nofree captures(none) [[P:%.*]]) {696; ATTRIBUTOR-CGSCC-NEXT:    call void @readonly_param(ptr nofree captures(none) [[P]]) [ "deopt"() ]697; ATTRIBUTOR-CGSCC-NEXT:    ret void698;699  call void @readonly_param(ptr %p) ["deopt"()]700  ret void701}702 703define void @op_bundle_readonly_unknown(ptr %p) {704; FNATTRS-LABEL: define {{[^@]+}}@op_bundle_readonly_unknown705; FNATTRS-SAME: (ptr captures(none) [[P:%.*]]) {706; FNATTRS-NEXT:    call void @readonly_param(ptr [[P]]) [ "unknown"() ]707; FNATTRS-NEXT:    ret void708;709; ATTRIBUTOR-LABEL: define {{[^@]+}}@op_bundle_readonly_unknown710; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) {711; ATTRIBUTOR-NEXT:    call void @readonly_param(ptr nofree captures(none) [[P]]) [ "unknown"() ]712; ATTRIBUTOR-NEXT:    ret void713;714; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@op_bundle_readonly_unknown715; ATTRIBUTOR-CGSCC-SAME: (ptr nofree captures(none) [[P:%.*]]) {716; ATTRIBUTOR-CGSCC-NEXT:    call void @readonly_param(ptr nofree captures(none) [[P]]) [ "unknown"() ]717; ATTRIBUTOR-CGSCC-NEXT:    ret void718;719  call void @readonly_param(ptr %p) ["unknown"()]720  ret void721}722 723define i32 @writable_readonly(ptr writable dereferenceable(4) %p) {724; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)725; FNATTRS-LABEL: define {{[^@]+}}@writable_readonly726; FNATTRS-SAME: (ptr readonly captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR13:[0-9]+]] {727; FNATTRS-NEXT:    [[V:%.*]] = load i32, ptr [[P]], align 4728; FNATTRS-NEXT:    ret i32 [[V]]729;730; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)731; ATTRIBUTOR-LABEL: define {{[^@]+}}@writable_readonly732; ATTRIBUTOR-SAME: (ptr nofree nonnull readonly captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR11:[0-9]+]] {733; ATTRIBUTOR-NEXT:    [[V:%.*]] = load i32, ptr [[P]], align 4734; ATTRIBUTOR-NEXT:    ret i32 [[V]]735;736; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)737; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@writable_readonly738; ATTRIBUTOR-CGSCC-SAME: (ptr nofree nonnull readonly captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR11:[0-9]+]] {739; ATTRIBUTOR-CGSCC-NEXT:    [[V:%.*]] = load i32, ptr [[P]], align 4740; ATTRIBUTOR-CGSCC-NEXT:    ret i32 [[V]]741;742  %v = load i32, ptr %p743  ret i32 %v744}745 746define void @writable_readnone(ptr writable dereferenceable(4) %p) {747; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)748; FNATTRS-LABEL: define {{[^@]+}}@writable_readnone749; FNATTRS-SAME: (ptr readnone captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR1]] {750; FNATTRS-NEXT:    ret void751;752; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)753; ATTRIBUTOR-LABEL: define {{[^@]+}}@writable_readnone754; ATTRIBUTOR-SAME: (ptr nofree nonnull readnone captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR1]] {755; ATTRIBUTOR-NEXT:    ret void756;757; ATTRIBUTOR-CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)758; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@writable_readnone759; ATTRIBUTOR-CGSCC-SAME: (ptr nofree nonnull readnone captures(none) dereferenceable(4) [[P:%.*]]) #[[ATTR1]] {760; ATTRIBUTOR-CGSCC-NEXT:    ret void761;762  ret void763}764 765declare void @byval_param(ptr byval(i32) %p)766 767define void @call_byval_param(ptr %p) {768; FNATTRS-LABEL: define {{[^@]+}}@call_byval_param769; FNATTRS-SAME: (ptr readonly captures(none) [[P:%.*]]) {770; FNATTRS-NEXT:    call void @byval_param(ptr byval(i32) [[P]])771; FNATTRS-NEXT:    ret void772;773; ATTRIBUTOR-LABEL: define {{[^@]+}}@call_byval_param774; ATTRIBUTOR-SAME: (ptr readonly captures(none) [[P:%.*]]) {775; ATTRIBUTOR-NEXT:    call void @byval_param(ptr readonly byval(i32) captures(none) [[P]])776; ATTRIBUTOR-NEXT:    ret void777;778; ATTRIBUTOR-CGSCC-LABEL: define {{[^@]+}}@call_byval_param779; ATTRIBUTOR-CGSCC-SAME: (ptr readonly captures(none) [[P:%.*]]) {780; ATTRIBUTOR-CGSCC-NEXT:    call void @byval_param(ptr readonly byval(i32) captures(none) [[P]])781; ATTRIBUTOR-CGSCC-NEXT:    ret void782;783  call void @byval_param(ptr byval(i32) %p)784  ret void785}786 787;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:788; COMMON: {{.*}}789