brintos

brintos / llvm-project-archived public Read only

0
0
Text · 15.6 KiB · 05ecb12 Raw
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