386 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes2; RUN: opt -passes=function-attrs -S < %s | FileCheck --check-prefixes=COMMON,FNATTRS %s3; RUN: opt -passes=attributor-light -S < %s | FileCheck --check-prefixes=COMMON,ATTRIBUTOR %s4 5define void @nouses-argworn-funrn(ptr writeonly %.aaa) {6; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)7; FNATTRS-LABEL: define {{[^@]+}}@nouses-argworn-funrn8; FNATTRS-SAME: (ptr readnone captures(none) [[DOTAAA:%.*]]) #[[ATTR0:[0-9]+]] {9; FNATTRS-NEXT: nouses-argworn-funrn_entry:10; FNATTRS-NEXT: ret void11;12; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)13; ATTRIBUTOR-LABEL: define {{[^@]+}}@nouses-argworn-funrn14; ATTRIBUTOR-SAME: (ptr nofree readnone captures(none) [[DOTAAA:%.*]]) #[[ATTR0:[0-9]+]] {15; ATTRIBUTOR-NEXT: nouses-argworn-funrn_entry:16; ATTRIBUTOR-NEXT: ret void17;18nouses-argworn-funrn_entry:19 ret void20}21 22define void @nouses-argworn-funro(ptr writeonly %.aaa, ptr %.bbb) {23; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)24; FNATTRS-LABEL: define {{[^@]+}}@nouses-argworn-funro25; FNATTRS-SAME: (ptr readnone captures(none) [[DOTAAA:%.*]], ptr readonly captures(none) [[DOTBBB:%.*]]) #[[ATTR1:[0-9]+]] {26; FNATTRS-NEXT: nouses-argworn-funro_entry:27; FNATTRS-NEXT: [[VAL:%.*]] = load i32, ptr [[DOTBBB]], align 428; FNATTRS-NEXT: ret void29;30; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read)31; ATTRIBUTOR-LABEL: define {{[^@]+}}@nouses-argworn-funro32; ATTRIBUTOR-SAME: (ptr nofree readnone captures(none) [[DOTAAA:%.*]], ptr nofree nonnull readonly captures(none) [[DOTBBB:%.*]]) #[[ATTR1:[0-9]+]] {33; ATTRIBUTOR-NEXT: nouses-argworn-funro_entry:34; ATTRIBUTOR-NEXT: [[VAL:%.*]] = load i32, ptr [[DOTBBB]], align 435; ATTRIBUTOR-NEXT: ret void36;37nouses-argworn-funro_entry:38 %val = load i32 , ptr %.bbb39 ret void40}41 42%_type_of_d-ccc = type <{ ptr, i8, i8, i8, i8 }>43 44@d-ccc = internal global %_type_of_d-ccc <{ ptr null, i8 1, i8 13, i8 0, i8 -127 }>, align 845 46define void @nouses-argworn-funwo(ptr writeonly %.aaa) {47; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write, argmem: none, inaccessiblemem: none, target_mem0: none, target_mem1: none)48; FNATTRS-LABEL: define {{[^@]+}}@nouses-argworn-funwo49; FNATTRS-SAME: (ptr readnone captures(none) [[DOTAAA:%.*]]) #[[ATTR2:[0-9]+]] {50; FNATTRS-NEXT: nouses-argworn-funwo_entry:51; FNATTRS-NEXT: store i8 0, ptr getelementptr inbounds ([[_TYPE_OF_D_CCC:%.*]], ptr @d-ccc, i32 0, i32 3), align 152; FNATTRS-NEXT: ret void53;54; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)55; ATTRIBUTOR-LABEL: define {{[^@]+}}@nouses-argworn-funwo56; ATTRIBUTOR-SAME: (ptr nofree readnone captures(none) [[DOTAAA:%.*]]) #[[ATTR2:[0-9]+]] {57; ATTRIBUTOR-NEXT: nouses-argworn-funwo_entry:58; ATTRIBUTOR-NEXT: store i8 0, ptr getelementptr inbounds ([[_TYPE_OF_D_CCC:%.*]], ptr @d-ccc, i32 0, i32 3), align 159; ATTRIBUTOR-NEXT: ret void60;61nouses-argworn-funwo_entry:62 store i8 0, ptr getelementptr inbounds (%_type_of_d-ccc, ptr @d-ccc, i32 0, i32 3)63 ret void64}65 66define void @test_store(ptr %p) {67; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)68; FNATTRS-LABEL: define {{[^@]+}}@test_store69; FNATTRS-SAME: (ptr writeonly captures(none) initializes((0, 1)) [[P:%.*]]) #[[ATTR3:[0-9]+]] {70; FNATTRS-NEXT: store i8 0, ptr [[P]], align 171; FNATTRS-NEXT: ret void72;73; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)74; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_store75; ATTRIBUTOR-SAME: (ptr nofree nonnull writeonly captures(none) [[P:%.*]]) #[[ATTR3:[0-9]+]] {76; ATTRIBUTOR-NEXT: store i8 0, ptr [[P]], align 177; ATTRIBUTOR-NEXT: ret void78;79 store i8 0, ptr %p80 ret void81}82 83@G = external global ptr84define i8 @test_store_capture(ptr %p) {85; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: read, inaccessiblemem: none, target_mem0: none, target_mem1: none)86; FNATTRS-LABEL: define {{[^@]+}}@test_store_capture87; FNATTRS-SAME: (ptr [[P:%.*]]) #[[ATTR4:[0-9]+]] {88; FNATTRS-NEXT: store ptr [[P]], ptr @G, align 889; FNATTRS-NEXT: [[P2:%.*]] = load ptr, ptr @G, align 890; FNATTRS-NEXT: [[V:%.*]] = load i8, ptr [[P2]], align 191; FNATTRS-NEXT: ret i8 [[V]]92;93; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn94; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_store_capture95; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]]) #[[ATTR4:[0-9]+]] {96; ATTRIBUTOR-NEXT: store ptr [[P]], ptr @G, align 897; ATTRIBUTOR-NEXT: [[P2:%.*]] = load ptr, ptr @G, align 898; ATTRIBUTOR-NEXT: [[V:%.*]] = load i8, ptr [[P2]], align 199; ATTRIBUTOR-NEXT: ret i8 [[V]]100;101 store ptr %p, ptr @G102 %p2 = load ptr, ptr @G103 %v = load i8, ptr %p2104 ret i8 %v105}106 107define void @test_addressing(ptr %p) {108; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)109; FNATTRS-LABEL: define {{[^@]+}}@test_addressing110; FNATTRS-SAME: (ptr writeonly captures(none) initializes((8, 12)) [[P:%.*]]) #[[ATTR3]] {111; FNATTRS-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 8112; FNATTRS-NEXT: store i32 0, ptr [[GEP]], align 4113; FNATTRS-NEXT: ret void114;115; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)116; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_addressing117; ATTRIBUTOR-SAME: (ptr nofree writeonly captures(none) [[P:%.*]]) #[[ATTR3]] {118; ATTRIBUTOR-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[P]], i64 8119; ATTRIBUTOR-NEXT: store i32 0, ptr [[GEP]], align 4120; ATTRIBUTOR-NEXT: ret void121;122 %gep = getelementptr i8, ptr %p, i64 8123 store i32 0, ptr %gep124 ret void125}126 127define void @test_readwrite(ptr %p) {128; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)129; FNATTRS-LABEL: define {{[^@]+}}@test_readwrite130; FNATTRS-SAME: (ptr captures(none) [[P:%.*]]) #[[ATTR5:[0-9]+]] {131; FNATTRS-NEXT: [[V:%.*]] = load i8, ptr [[P]], align 1132; FNATTRS-NEXT: store i8 [[V]], ptr [[P]], align 1133; FNATTRS-NEXT: ret void134;135; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite)136; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_readwrite137; ATTRIBUTOR-SAME: (ptr nofree nonnull captures(none) [[P:%.*]]) #[[ATTR5:[0-9]+]] {138; ATTRIBUTOR-NEXT: [[V:%.*]] = load i8, ptr [[P]], align 1139; ATTRIBUTOR-NEXT: store i8 [[V]], ptr [[P]], align 1140; ATTRIBUTOR-NEXT: ret void141;142 %v = load i8, ptr %p143 store i8 %v, ptr %p144 ret void145}146 147define void @test_volatile(ptr %p) {148; FNATTRS: Function Attrs: nofree norecurse nounwind memory(argmem: readwrite, inaccessiblemem: readwrite)149; FNATTRS-LABEL: define {{[^@]+}}@test_volatile150; FNATTRS-SAME: (ptr [[P:%.*]]) #[[ATTR6:[0-9]+]] {151; FNATTRS-NEXT: store volatile i8 0, ptr [[P]], align 1152; FNATTRS-NEXT: ret void153;154; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)155; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_volatile156; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]]) #[[ATTR6:[0-9]+]] {157; ATTRIBUTOR-NEXT: store volatile i8 0, ptr [[P]], align 1158; ATTRIBUTOR-NEXT: ret void159;160 store volatile i8 0, ptr %p161 ret void162}163 164define void @test_atomicrmw(ptr %p) {165; FNATTRS: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)166; FNATTRS-LABEL: define {{[^@]+}}@test_atomicrmw167; FNATTRS-SAME: (ptr captures(none) [[P:%.*]]) #[[ATTR7:[0-9]+]] {168; FNATTRS-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[P]], i8 0 seq_cst, align 1169; FNATTRS-NEXT: ret void170;171; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite)172; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_atomicrmw173; ATTRIBUTOR-SAME: (ptr nofree nonnull captures(none) [[P:%.*]]) #[[ATTR6]] {174; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[P]], i8 0 seq_cst, align 1175; ATTRIBUTOR-NEXT: ret void176;177 atomicrmw add ptr %p, i8 0 seq_cst178 ret void179}180 181define void @test_ptrmask(ptr %p) {182; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)183; FNATTRS-LABEL: define {{[^@]+}}@test_ptrmask184; FNATTRS-SAME: (ptr writeonly [[P:%.*]]) #[[ATTR3]] {185; FNATTRS-NEXT: [[MASK:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -5)186; FNATTRS-NEXT: store i8 0, ptr [[MASK]], align 1187; FNATTRS-NEXT: ret void188;189; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write)190; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_ptrmask191; ATTRIBUTOR-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR3]] {192; ATTRIBUTOR-NEXT: [[MASK:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[P]], i64 -5) #[[ATTR9:[0-9]+]]193; ATTRIBUTOR-NEXT: store i8 0, ptr [[MASK]], align 1194; ATTRIBUTOR-NEXT: ret void195;196 %mask = call ptr @llvm.ptrmask.p0.i64(ptr %p, i64 -5)197 store i8 0, ptr %mask198 ret void199}200 201declare ptr @llvm.ptrmask.p0.i64(ptr, i64)202 203declare void @direct1_callee(ptr %p)204 205define void @direct1(ptr %p) {206; COMMON-LABEL: define {{[^@]+}}@direct1207; COMMON-SAME: (ptr [[P:%.*]]) {208; COMMON-NEXT: call void @direct1_callee(ptr [[P]])209; COMMON-NEXT: ret void210;211 call void @direct1_callee(ptr %p)212 ret void213}214 215declare void @direct2_callee(ptr %p) writeonly216 217; writeonly w/o nocapture is not enough218define void @direct2(ptr %p) {219; FNATTRS: Function Attrs: memory(write)220; FNATTRS-LABEL: define {{[^@]+}}@direct2221; FNATTRS-SAME: (ptr [[P:%.*]]) #[[ATTR9:[0-9]+]] {222; FNATTRS-NEXT: call void @direct2_callee(ptr [[P]])223; FNATTRS-NEXT: ret void224;225; ATTRIBUTOR: Function Attrs: memory(write)226; ATTRIBUTOR-LABEL: define {{[^@]+}}@direct2227; ATTRIBUTOR-SAME: (ptr writeonly [[P:%.*]]) #[[ATTR8:[0-9]+]] {228; ATTRIBUTOR-NEXT: call void @direct2_callee(ptr [[P]]) #[[ATTR8]]229; ATTRIBUTOR-NEXT: ret void230;231 call void @direct2_callee(ptr %p)232 ; read back from global, read through pointer...233 ret void234}235 236define void @direct2b(ptr %p) {237; FNATTRS: Function Attrs: memory(write)238; FNATTRS-LABEL: define {{[^@]+}}@direct2b239; FNATTRS-SAME: (ptr writeonly captures(none) [[P:%.*]]) #[[ATTR9]] {240; FNATTRS-NEXT: call void @direct2_callee(ptr captures(none) [[P]])241; FNATTRS-NEXT: ret void242;243; ATTRIBUTOR: Function Attrs: memory(write)244; ATTRIBUTOR-LABEL: define {{[^@]+}}@direct2b245; ATTRIBUTOR-SAME: (ptr writeonly captures(none) [[P:%.*]]) #[[ATTR8]] {246; ATTRIBUTOR-NEXT: call void @direct2_callee(ptr writeonly captures(none) [[P]]) #[[ATTR8]]247; ATTRIBUTOR-NEXT: ret void248;249 call void @direct2_callee(ptr nocapture %p)250 ret void251}252 253declare void @direct3_callee(ptr nocapture writeonly %p)254 255define void @direct3(ptr %p) {256; FNATTRS-LABEL: define {{[^@]+}}@direct3257; FNATTRS-SAME: (ptr writeonly captures(none) [[P:%.*]]) {258; FNATTRS-NEXT: call void @direct3_callee(ptr [[P]])259; FNATTRS-NEXT: ret void260;261; ATTRIBUTOR-LABEL: define {{[^@]+}}@direct3262; ATTRIBUTOR-SAME: (ptr writeonly captures(none) [[P:%.*]]) {263; ATTRIBUTOR-NEXT: call void @direct3_callee(ptr writeonly captures(none) [[P]])264; ATTRIBUTOR-NEXT: ret void265;266 call void @direct3_callee(ptr %p)267 ret void268}269 270define void @direct3b(ptr %p) {271; COMMON-LABEL: define {{[^@]+}}@direct3b272; COMMON-SAME: (ptr [[P:%.*]]) {273; COMMON-NEXT: call void @direct3_callee(ptr [[P]]) [ "may-read-and-capture"(ptr [[P]]) ]274; COMMON-NEXT: ret void275;276 call void @direct3_callee(ptr %p) ["may-read-and-capture"(ptr %p)]277 ret void278}279 280define void @direct3c(ptr %p) {281; FNATTRS-LABEL: define {{[^@]+}}@direct3c282; FNATTRS-SAME: (ptr captures(none) [[P:%.*]]) {283; FNATTRS-NEXT: call void @direct3_callee(ptr [[P]]) [ "may-read"() ]284; FNATTRS-NEXT: ret void285;286; ATTRIBUTOR-LABEL: define {{[^@]+}}@direct3c287; ATTRIBUTOR-SAME: (ptr captures(none) [[P:%.*]]) {288; ATTRIBUTOR-NEXT: call void @direct3_callee(ptr captures(none) [[P]]) [ "may-read"() ]289; ATTRIBUTOR-NEXT: ret void290;291 call void @direct3_callee(ptr %p) ["may-read"()]292 ret void293}294 295define void @fptr_test1(ptr %p, ptr %f) {296; FNATTRS-LABEL: define {{[^@]+}}@fptr_test1297; FNATTRS-SAME: (ptr [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) {298; FNATTRS-NEXT: call void [[F]](ptr [[P]])299; FNATTRS-NEXT: ret void300;301; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test1302; ATTRIBUTOR-SAME: (ptr [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {303; ATTRIBUTOR-NEXT: call void [[F]](ptr [[P]])304; ATTRIBUTOR-NEXT: ret void305;306 call void %f(ptr %p)307 ret void308}309 310define void @fptr_test2(ptr %p, ptr %f) {311; FNATTRS-LABEL: define {{[^@]+}}@fptr_test2312; FNATTRS-SAME: (ptr writeonly captures(none) [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) {313; FNATTRS-NEXT: call void [[F]](ptr writeonly captures(none) [[P]])314; FNATTRS-NEXT: ret void315;316; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test2317; ATTRIBUTOR-SAME: (ptr captures(none) [[P:%.*]], ptr nofree nonnull captures(none) [[F:%.*]]) {318; ATTRIBUTOR-NEXT: call void [[F]](ptr writeonly captures(none) [[P]])319; ATTRIBUTOR-NEXT: ret void320;321 call void %f(ptr nocapture writeonly %p)322 ret void323}324 325define void @fptr_test3(ptr %p, ptr %f) {326; FNATTRS: Function Attrs: memory(write)327; FNATTRS-LABEL: define {{[^@]+}}@fptr_test3328; FNATTRS-SAME: (ptr writeonly captures(none) [[P:%.*]], ptr readonly captures(none) [[F:%.*]]) #[[ATTR9]] {329; FNATTRS-NEXT: call void [[F]](ptr captures(none) [[P]]) #[[ATTR9]]330; FNATTRS-NEXT: ret void331;332; ATTRIBUTOR: Function Attrs: memory(write)333; ATTRIBUTOR-LABEL: define {{[^@]+}}@fptr_test3334; ATTRIBUTOR-SAME: (ptr writeonly captures(none) [[P:%.*]], ptr nofree nonnull writeonly captures(none) [[F:%.*]]) #[[ATTR8]] {335; ATTRIBUTOR-NEXT: call void [[F]](ptr captures(none) [[P]]) #[[ATTR8]]336; ATTRIBUTOR-NEXT: ret void337;338 call void %f(ptr nocapture %p) writeonly339 ret void340}341 342define void @test_argmem_none_callee(ptr %p) {343; FNATTRS-LABEL: define {{[^@]+}}@test_argmem_none_callee344; FNATTRS-SAME: (ptr readnone captures(none) [[P:%.*]]) {345; FNATTRS-NEXT: call void @direct1_callee(ptr captures(none) [[P]]) #[[ATTR10:[0-9]+]]346; FNATTRS-NEXT: ret void347;348; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_argmem_none_callee349; ATTRIBUTOR-SAME: (ptr captures(none) [[P:%.*]]) {350; ATTRIBUTOR-NEXT: call void @direct1_callee(ptr captures(none) [[P]]) #[[ATTR10:[0-9]+]]351; ATTRIBUTOR-NEXT: ret void352;353 call void @direct1_callee(ptr nocapture %p) memory(readwrite, argmem: none)354 ret void355}356 357define void @test_argmem_read_callee(ptr %p) {358; FNATTRS-LABEL: define {{[^@]+}}@test_argmem_read_callee359; FNATTRS-SAME: (ptr readonly captures(none) [[P:%.*]]) {360; FNATTRS-NEXT: call void @direct1_callee(ptr captures(none) [[P]]) #[[ATTR11:[0-9]+]]361; FNATTRS-NEXT: ret void362;363; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_argmem_read_callee364; ATTRIBUTOR-SAME: (ptr captures(none) [[P:%.*]]) {365; ATTRIBUTOR-NEXT: call void @direct1_callee(ptr captures(none) [[P]]) #[[ATTR11:[0-9]+]]366; ATTRIBUTOR-NEXT: ret void367;368 call void @direct1_callee(ptr nocapture %p) memory(readwrite, argmem: read)369 ret void370}371 372define void @test_argmem_write_callee(ptr %p) {373; FNATTRS-LABEL: define {{[^@]+}}@test_argmem_write_callee374; FNATTRS-SAME: (ptr writeonly captures(none) [[P:%.*]]) {375; FNATTRS-NEXT: call void @direct1_callee(ptr captures(none) [[P]]) #[[ATTR12:[0-9]+]]376; FNATTRS-NEXT: ret void377;378; ATTRIBUTOR-LABEL: define {{[^@]+}}@test_argmem_write_callee379; ATTRIBUTOR-SAME: (ptr captures(none) [[P:%.*]]) {380; ATTRIBUTOR-NEXT: call void @direct1_callee(ptr captures(none) [[P]]) #[[ATTR12:[0-9]+]]381; ATTRIBUTOR-NEXT: ret void382;383 call void @direct1_callee(ptr nocapture %p) memory(readwrite, argmem: write)384 ret void385}386