821 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes2; RUN: opt -S -passes=inline %s | FileCheck %s3; RUN: opt -S -passes='cgscc(inline)' %s | FileCheck %s4; RUN: opt -S -passes='module-inline' %s | FileCheck %s5 6declare void @bar1(ptr %p)7declare void @bar2(ptr %p, ptr %p2)8declare void @bar3(ptr writable %p)9declare void @bar4(ptr byval([4 x i32]) %p)10define dso_local void @foo1_rdonly(ptr readonly %p) {11; CHECK-LABEL: define {{[^@]+}}@foo1_rdonly12; CHECK-SAME: (ptr readonly [[P:%.*]]) {13; CHECK-NEXT: call void @bar1(ptr [[P]])14; CHECK-NEXT: ret void15;16 call void @bar1(ptr %p)17 ret void18}19 20define dso_local void @foo1(ptr %p) {21; CHECK-LABEL: define {{[^@]+}}@foo122; CHECK-SAME: (ptr [[P:%.*]]) {23; CHECK-NEXT: call void @bar1(ptr [[P]])24; CHECK-NEXT: ret void25;26 call void @bar1(ptr %p)27 ret void28}29 30define dso_local void @foo1_writable(ptr %p) {31; CHECK-LABEL: define {{[^@]+}}@foo1_writable32; CHECK-SAME: (ptr [[P:%.*]]) {33; CHECK-NEXT: call void @bar1(ptr writable [[P]])34; CHECK-NEXT: ret void35;36 call void @bar1(ptr writable %p)37 ret void38}39 40define dso_local void @foo3_writable(ptr %p) {41; CHECK-LABEL: define {{[^@]+}}@foo3_writable42; CHECK-SAME: (ptr [[P:%.*]]) {43; CHECK-NEXT: call void @bar3(ptr [[P]])44; CHECK-NEXT: ret void45;46 call void @bar3(ptr %p)47 ret void48}49 50define dso_local void @foo1_bar_aligned64_deref512(ptr %p) {51; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned64_deref51252; CHECK-SAME: (ptr [[P:%.*]]) {53; CHECK-NEXT: call void @bar1(ptr align 64 dereferenceable(512) [[P]])54; CHECK-NEXT: ret void55;56 call void @bar1(ptr align 64 dereferenceable(512) %p)57 ret void58}59 60define dso_local void @foo1_bar_aligned512_deref_or_null512(ptr %p) {61; CHECK-LABEL: define {{[^@]+}}@foo1_bar_aligned512_deref_or_null51262; CHECK-SAME: (ptr [[P:%.*]]) {63; CHECK-NEXT: call void @bar1(ptr align 512 dereferenceable_or_null(512) [[P]])64; CHECK-NEXT: ret void65;66 call void @bar1(ptr align 512 dereferenceable_or_null(512) %p)67 ret void68}69 70define dso_local void @foo2(ptr %p, ptr %p2) {71; CHECK-LABEL: define {{[^@]+}}@foo272; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {73; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[P]])74; CHECK-NEXT: ret void75;76 call void @bar2(ptr %p, ptr %p)77 ret void78}79 80define dso_local void @foo2_2(ptr %p, ptr %p2) {81; CHECK-LABEL: define {{[^@]+}}@foo2_282; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {83; CHECK-NEXT: call void @bar2(ptr [[P2]], ptr [[P2]])84; CHECK-NEXT: ret void85;86 call void @bar2(ptr %p2, ptr %p2)87 ret void88}89 90define dso_local void @foo2_3(ptr %p, ptr readnone %p2) {91; CHECK-LABEL: define {{[^@]+}}@foo2_392; CHECK-SAME: (ptr [[P:%.*]], ptr readnone [[P2:%.*]]) {93; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[P2]])94; CHECK-NEXT: ret void95;96 call void @bar2(ptr %p, ptr %p2)97 ret void98}99 100define dso_local void @buz1_wronly(ptr %p) writeonly {101; CHECK: Function Attrs: memory(write)102; CHECK-LABEL: define {{[^@]+}}@buz1_wronly103; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {104; CHECK-NEXT: call void @bar1(ptr [[P]])105; CHECK-NEXT: ret void106;107 call void @bar1(ptr %p)108 ret void109}110 111define dso_local void @buz1(ptr %p) {112; CHECK-LABEL: define {{[^@]+}}@buz1113; CHECK-SAME: (ptr [[P:%.*]]) {114; CHECK-NEXT: call void @bar1(ptr [[P]])115; CHECK-NEXT: ret void116;117 call void @bar1(ptr %p)118 ret void119}120 121define dso_local void @buz1_wronly_fail_alloca(ptr %p) writeonly {122; CHECK: Function Attrs: memory(write)123; CHECK-LABEL: define {{[^@]+}}@buz1_wronly_fail_alloca124; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] {125; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4126; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]])127; CHECK-NEXT: ret void128;129 %a = alloca i32, align 4130 call void @bar2(ptr %p, ptr %a)131 ret void132}133 134define dso_local void @buz1_fail_alloca(ptr %p) {135; CHECK-LABEL: define {{[^@]+}}@buz1_fail_alloca136; CHECK-SAME: (ptr [[P:%.*]]) {137; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4138; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]])139; CHECK-NEXT: ret void140;141 %a = alloca i32, align 4142 call void @bar2(ptr %p, ptr %a)143 ret void144}145 146define dso_local void @buz1_wronly_partially_okay_alloca(ptr %p) writeonly {147; CHECK: Function Attrs: memory(write)148; CHECK-LABEL: define {{[^@]+}}@buz1_wronly_partially_okay_alloca149; CHECK-SAME: (ptr [[P:%.*]]) #[[ATTR0]] {150; CHECK-NEXT: call void @bar1(ptr [[P]])151; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4152; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]])153; CHECK-NEXT: ret void154;155 call void @bar1(ptr %p)156 %a = alloca i32, align 4157 call void @bar2(ptr %p, ptr %a)158 ret void159}160 161define dso_local void @buz1_partially_okay_alloca(ptr %p) {162; CHECK-LABEL: define {{[^@]+}}@buz1_partially_okay_alloca163; CHECK-SAME: (ptr [[P:%.*]]) {164; CHECK-NEXT: call void @bar1(ptr [[P]])165; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4166; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A]])167; CHECK-NEXT: ret void168;169 call void @bar1(ptr %p)170 %a = alloca i32, align 4171 call void @bar2(ptr %p, ptr %a)172 ret void173}174 175define dso_local void @foo2_through_obj(ptr %p, ptr %p2) {176; CHECK-LABEL: define {{[^@]+}}@foo2_through_obj177; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {178; CHECK-NEXT: [[PP:%.*]] = getelementptr i8, ptr [[P]], i64 9179; CHECK-NEXT: [[P2P:%.*]] = getelementptr i8, ptr [[P2]], i64 123180; CHECK-NEXT: call void @bar2(ptr [[P2P]], ptr [[PP]])181; CHECK-NEXT: ret void182;183 %pp = getelementptr i8, ptr %p, i64 9184 %p2p = getelementptr i8, ptr %p2, i64 123185 call void @bar2(ptr %p2p, ptr %pp)186 ret void187}188 189define dso_local void @foo_byval_readonly(ptr readonly %p) {190; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly191; CHECK-SAME: (ptr readonly [[P:%.*]]) {192; CHECK-NEXT: call void @bar4(ptr byval([4 x i32]) [[P]])193; CHECK-NEXT: ret void194;195 call void @bar4(ptr byval([4 x i32]) %p)196 ret void197}198 199define void @prop_param_func_decl(ptr %p) {200; CHECK-LABEL: define {{[^@]+}}@prop_param_func_decl201; CHECK-SAME: (ptr [[P:%.*]]) {202; CHECK-NEXT: call void @bar1(ptr readonly [[P]])203; CHECK-NEXT: ret void204;205 call void @foo1_rdonly(ptr %p)206 ret void207}208 209define void @prop_param_callbase_def(ptr %p) {210; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def211; CHECK-SAME: (ptr [[P:%.*]]) {212; CHECK-NEXT: call void @bar1(ptr readonly [[P]])213; CHECK-NEXT: call void @bar1(ptr [[P]])214; CHECK-NEXT: ret void215;216 call void @foo1(ptr readonly %p)217 call void @bar1(ptr %p)218 ret void219}220 221define void @prop_param_callbase_def_2x(ptr %p, ptr %p2) {222; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x223; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {224; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readonly [[P]])225; CHECK-NEXT: ret void226;227 call void @foo2(ptr readonly %p, ptr %p)228 ret void229}230 231define void @prop_param_callbase_def_2x_2(ptr %p, ptr %p2) {232; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_2233; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {234; CHECK-NEXT: [[PP_I:%.*]] = getelementptr i8, ptr [[P]], i64 9235; CHECK-NEXT: [[P2P_I:%.*]] = getelementptr i8, ptr [[P2]], i64 123236; CHECK-NEXT: call void @bar2(ptr [[P2P_I]], ptr readonly [[PP_I]])237; CHECK-NEXT: ret void238;239 call void @foo2_through_obj(ptr readonly %p, ptr writeonly %p2)240 ret void241}242 243define void @prop_param_callbase_def_2x_incompat(ptr %p, ptr %p2) {244; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat245; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {246; CHECK-NEXT: [[PP_I:%.*]] = getelementptr i8, ptr [[P]], i64 9247; CHECK-NEXT: [[P2P_I:%.*]] = getelementptr i8, ptr [[P]], i64 123248; CHECK-NEXT: call void @bar2(ptr readonly [[P2P_I]], ptr readnone [[PP_I]])249; CHECK-NEXT: ret void250;251 call void @foo2_through_obj(ptr readnone %p, ptr readonly %p)252 ret void253}254 255define void @prop_param_callbase_def_2x_incompat_2(ptr %p, ptr %p2) {256; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat_2257; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {258; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readonly [[P]])259; CHECK-NEXT: ret void260;261 call void @foo2(ptr readonly %p, ptr readnone %p)262 ret void263}264 265define void @prop_param_callbase_def_2x_incompat_3(ptr %p, ptr %p2) {266; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_2x_incompat_3267; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {268; CHECK-NEXT: call void @bar2(ptr readnone [[P]], ptr readnone [[P]])269; CHECK-NEXT: ret void270;271 call void @foo2_2(ptr readonly %p, ptr readnone %p)272 ret void273}274 275define void @prop_param_callbase_def_1x_partial(ptr %p, ptr %p2) {276; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial277; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {278; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readonly [[P]])279; CHECK-NEXT: ret void280;281 call void @foo2(ptr readonly %p, ptr %p)282 ret void283}284 285define void @prop_param_callbase_def_1x_partial_2(ptr %p, ptr %p2) {286; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial_2287; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {288; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[P]])289; CHECK-NEXT: ret void290;291 call void @foo2_2(ptr readonly %p, ptr %p)292 ret void293}294 295define void @prop_param_callbase_def_1x_partial_3(ptr %p, ptr %p2) {296; CHECK-LABEL: define {{[^@]+}}@prop_param_callbase_def_1x_partial_3297; CHECK-SAME: (ptr [[P:%.*]], ptr [[P2:%.*]]) {298; CHECK-NEXT: call void @bar2(ptr readonly [[P]], ptr readnone [[P]])299; CHECK-NEXT: ret void300;301 call void @foo2_3(ptr readonly %p, ptr %p)302 ret void303}304 305define void @prop_deref(ptr %p) {306; CHECK-LABEL: define {{[^@]+}}@prop_deref307; CHECK-SAME: (ptr [[P:%.*]]) {308; CHECK-NEXT: call void @bar1(ptr dereferenceable(16) [[P]])309; CHECK-NEXT: ret void310;311 call void @foo1(ptr dereferenceable(16) %p)312 ret void313}314 315define void @prop_deref_or_null(ptr %p) {316; CHECK-LABEL: define {{[^@]+}}@prop_deref_or_null317; CHECK-SAME: (ptr [[P:%.*]]) {318; CHECK-NEXT: call void @bar1(ptr dereferenceable_or_null(256) [[P]])319; CHECK-NEXT: ret void320;321 call void @foo1(ptr dereferenceable_or_null(256) %p)322 ret void323}324 325define void @prop_param_nonnull_and_align(ptr %p) {326; CHECK-LABEL: define {{[^@]+}}@prop_param_nonnull_and_align327; CHECK-SAME: (ptr [[P:%.*]]) {328; CHECK-NEXT: call void @bar1(ptr nonnull align 32 [[P]])329; CHECK-NEXT: ret void330;331 call void @foo1(ptr nonnull align 32 %p)332 ret void333}334 335define void @prop_param_nofree_and_align(ptr %p) {336; CHECK-LABEL: define {{[^@]+}}@prop_param_nofree_and_align337; CHECK-SAME: (ptr [[P:%.*]]) {338; CHECK-NEXT: call void @bar1(ptr align 32 [[P]])339; CHECK-NEXT: ret void340;341 call void @foo1(ptr nofree align 32 %p)342 ret void343}344 345define void @prop_param_deref_align_no_update(ptr %p) {346; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_no_update347; CHECK-SAME: (ptr [[P:%.*]]) {348; CHECK-NEXT: call void @bar1(ptr align 64 dereferenceable(512) [[P]])349; CHECK-NEXT: ret void350;351 call void @foo1_bar_aligned64_deref512(ptr align 4 dereferenceable(64) %p)352 ret void353}354 355define void @prop_param_deref_align_update(ptr %p) {356; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_align_update357; CHECK-SAME: (ptr [[P:%.*]]) {358; CHECK-NEXT: call void @bar1(ptr align 128 dereferenceable(1024) [[P]])359; CHECK-NEXT: ret void360;361 call void @foo1_bar_aligned64_deref512(ptr align 128 dereferenceable(1024) %p)362 ret void363}364 365define void @prop_param_deref_or_null_update(ptr %p) {366; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_or_null_update367; CHECK-SAME: (ptr [[P:%.*]]) {368; CHECK-NEXT: call void @bar1(ptr align 512 dereferenceable_or_null(1024) [[P]])369; CHECK-NEXT: ret void370;371 call void @foo1_bar_aligned512_deref_or_null512(ptr dereferenceable_or_null(1024) %p)372 ret void373}374 375define void @prop_param_deref_or_null_no_update(ptr %p) {376; CHECK-LABEL: define {{[^@]+}}@prop_param_deref_or_null_no_update377; CHECK-SAME: (ptr [[P:%.*]]) {378; CHECK-NEXT: call void @bar1(ptr align 512 dereferenceable_or_null(512) [[P]])379; CHECK-NEXT: ret void380;381 call void @foo1_bar_aligned512_deref_or_null512(ptr dereferenceable_or_null(32) %p)382 ret void383}384 385define void @prop_fn_decl(ptr %p) {386; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl387; CHECK-SAME: (ptr [[P:%.*]]) {388; CHECK-NEXT: call void @bar1(ptr [[P]])389; CHECK-NEXT: call void @bar1(ptr [[P]])390; CHECK-NEXT: ret void391;392 call void @buz1_wronly(ptr %p)393 call void @bar1(ptr %p)394 ret void395}396 397define void @prop_cb_def_wr(ptr %p) {398; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr399; CHECK-SAME: (ptr [[P:%.*]]) {400; CHECK-NEXT: call void @bar1(ptr [[P]])401; CHECK-NEXT: call void @bar1(ptr [[P]])402; CHECK-NEXT: ret void403;404 call void @buz1(ptr %p) writeonly405 call void @bar1(ptr %p)406 ret void407}408 409define void @prop_fn_decl_fail_alloca(ptr %p) {410; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl_fail_alloca411; CHECK-SAME: (ptr [[P:%.*]]) {412; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4413; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A_I]])414; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]])415; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[A_I]])416; CHECK-NEXT: call void @bar1(ptr [[P]])417; CHECK-NEXT: ret void418;419 call void @buz1_wronly_fail_alloca(ptr %p)420 call void @bar1(ptr %p)421 ret void422}423 424define void @prop_cb_def_wr_fail_alloca(ptr %p) {425; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr_fail_alloca426; CHECK-SAME: (ptr [[P:%.*]]) {427; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4428; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A_I]])429; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]])430; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[A_I]])431; CHECK-NEXT: call void @bar1(ptr [[P]])432; CHECK-NEXT: ret void433;434 call void @buz1_fail_alloca(ptr %p) writeonly435 call void @bar1(ptr %p)436 ret void437}438 439define void @prop_fn_decl_partially_okay_alloca(ptr %p) {440; CHECK-LABEL: define {{[^@]+}}@prop_fn_decl_partially_okay_alloca441; CHECK-SAME: (ptr [[P:%.*]]) {442; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4443; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A_I]])444; CHECK-NEXT: call void @bar1(ptr [[P]])445; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]])446; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[A_I]])447; CHECK-NEXT: call void @bar1(ptr [[P]])448; CHECK-NEXT: ret void449;450 call void @buz1_wronly_partially_okay_alloca(ptr %p)451 call void @bar1(ptr %p)452 ret void453}454 455define void @prop_cb_def_wr_partially_okay_alloca(ptr %p) {456; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_wr_partially_okay_alloca457; CHECK-SAME: (ptr [[P:%.*]]) {458; CHECK-NEXT: [[A_I:%.*]] = alloca i32, align 4459; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[A_I]])460; CHECK-NEXT: call void @bar1(ptr [[P]])461; CHECK-NEXT: call void @bar2(ptr [[P]], ptr [[A_I]])462; CHECK-NEXT: call void @llvm.lifetime.end.p0(ptr [[A_I]])463; CHECK-NEXT: call void @bar1(ptr [[P]])464; CHECK-NEXT: ret void465;466 call void @buz1_partially_okay_alloca(ptr %p) writeonly467 call void @bar1(ptr %p)468 ret void469}470 471define void @prop_cb_def_readonly(ptr %p) {472; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_readonly473; CHECK-SAME: (ptr [[P:%.*]]) {474; CHECK-NEXT: call void @bar1(ptr [[P]])475; CHECK-NEXT: ret void476;477 call void @foo1(ptr %p) readonly478 ret void479}480 481define void @prop_cb_def_readnone(ptr %p) {482; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_readnone483; CHECK-SAME: (ptr [[P:%.*]]) {484; CHECK-NEXT: call void @bar1(ptr [[P]])485; CHECK-NEXT: ret void486;487 call void @foo1(ptr %p) readnone488 ret void489}490 491define void @prop_cb_def_argmem_readonly_fail(ptr %p) {492; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_argmem_readonly_fail493; CHECK-SAME: (ptr [[P:%.*]]) {494; CHECK-NEXT: call void @bar1(ptr [[P]])495; CHECK-NEXT: ret void496;497 call void @foo1(ptr %p) memory(argmem:read)498 ret void499}500 501define void @prop_cb_def_inaccessible_none(ptr %p) {502; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_inaccessible_none503; CHECK-SAME: (ptr [[P:%.*]]) {504; CHECK-NEXT: call void @bar1(ptr [[P]])505; CHECK-NEXT: ret void506;507 call void @foo1(ptr %p) memory(inaccessiblemem:none)508 ret void509}510 511define void @prop_cb_def_inaccessible_none_argmem_none(ptr %p) {512; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_inaccessible_none_argmem_none513; CHECK-SAME: (ptr [[P:%.*]]) {514; CHECK-NEXT: call void @bar1(ptr [[P]])515; CHECK-NEXT: ret void516;517 call void @foo1(ptr %p) memory(inaccessiblemem:none, argmem:none)518 ret void519}520 521define void @prop_cb_def_willreturn(ptr %p) {522; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_willreturn523; CHECK-SAME: (ptr [[P:%.*]]) {524; CHECK-NEXT: call void @bar1(ptr [[P]])525; CHECK-NEXT: ret void526;527 call void @foo1(ptr %p) willreturn528 ret void529}530 531define void @prop_cb_def_mustprogress(ptr %p) {532; CHECK-LABEL: define {{[^@]+}}@prop_cb_def_mustprogress533; CHECK-SAME: (ptr [[P:%.*]]) {534; CHECK-NEXT: call void @bar1(ptr [[P]])535; CHECK-NEXT: ret void536;537 call void @foo1(ptr %p) mustprogress538 ret void539}540 541define void @prop_no_conflict_writable(ptr %p) {542; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable543; CHECK-SAME: (ptr [[P:%.*]]) {544; CHECK-NEXT: call void @bar1(ptr readonly [[P]])545; CHECK-NEXT: ret void546;547 call void @foo1_writable(ptr readonly %p)548 ret void549}550 551define void @prop_no_conflict_writable2(ptr %p) {552; CHECK-LABEL: define {{[^@]+}}@prop_no_conflict_writable2553; CHECK-SAME: (ptr [[P:%.*]]) {554; CHECK-NEXT: call void @bar3(ptr readnone [[P]])555; CHECK-NEXT: ret void556;557 call void @foo3_writable(ptr readnone %p)558 ret void559}560 561define void @prop_byval_readonly(ptr %p) {562; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly563; CHECK-SAME: (ptr [[P:%.*]]) {564; CHECK-NEXT: call void @bar4(ptr byval([4 x i32]) [[P]])565; CHECK-NEXT: ret void566;567 call void @foo_byval_readonly(ptr %p)568 ret void569}570 571define ptr @caller_bad_param_prop(ptr %p1, ptr %p2, i64 %x) {572; CHECK-LABEL: define {{[^@]+}}@caller_bad_param_prop573; CHECK-SAME: (ptr [[P1:%.*]], ptr [[P2:%.*]], i64 [[X:%.*]]) {574; CHECK-NEXT: [[TMP1:%.*]] = call ptr [[P1]](i64 [[X]], ptr [[P2]])575; CHECK-NEXT: ret ptr [[TMP1]]576;577 %1 = call ptr %p1(i64 %x, ptr %p2)578 %2 = call ptr @callee_bad_param_prop(ptr %1)579 ret ptr %2580}581 582define ptr @callee_bad_param_prop(ptr readonly %x) {583; CHECK-LABEL: define {{[^@]+}}@callee_bad_param_prop584; CHECK-SAME: (ptr readonly [[X:%.*]]) {585; CHECK-NEXT: [[R:%.*]] = tail call ptr @llvm.ptrmask.p0.i64(ptr [[X]], i64 -1)586; CHECK-NEXT: ret ptr [[R]]587;588 %r = tail call ptr @llvm.ptrmask(ptr %x, i64 -1)589 ret ptr %r590}591 592define dso_local void @foo_byval_readonly2(ptr readonly %p) {593; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly2594; CHECK-SAME: (ptr readonly [[P:%.*]]) {595; CHECK-NEXT: call void @bar4(ptr [[P]])596; CHECK-NEXT: ret void597;598 call void @bar4(ptr %p)599 ret void600}601 602define void @prop_byval_readonly2(ptr %p) {603; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly2604; CHECK-SAME: (ptr [[P:%.*]]) {605; CHECK-NEXT: call void @bar4(ptr [[P]])606; CHECK-NEXT: ret void607;608 call void @foo_byval_readonly2(ptr %p)609 ret void610}611 612declare void @bar5(i32)613 614define dso_local void @foo4_range_0_10(i32 %v) {615; CHECK-LABEL: define {{[^@]+}}@foo4_range_0_10616; CHECK-SAME: (i32 [[V:%.*]]) {617; CHECK-NEXT: call void @bar5(i32 range(i32 0, 10) [[V]])618; CHECK-NEXT: ret void619;620 call void @bar5(i32 range(i32 0, 10) %v)621 ret void622}623 624define dso_local void @foo4_range_10_40(i32 %v) {625; CHECK-LABEL: define {{[^@]+}}@foo4_range_10_40626; CHECK-SAME: (i32 [[V:%.*]]) {627; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])628; CHECK-NEXT: ret void629;630 call void @bar5(i32 range(i32 10, 40) %v)631 ret void632}633 634define dso_local void @foo4_2_range_0_10(i32 range(i32 0, 10) %v) {635; CHECK-LABEL: define {{[^@]+}}@foo4_2_range_0_10636; CHECK-SAME: (i32 range(i32 0, 10) [[V:%.*]]) {637; CHECK-NEXT: call void @bar5(i32 [[V]])638; CHECK-NEXT: ret void639;640 call void @bar5(i32 %v)641 ret void642}643 644define dso_local void @foo4(i32 %v) {645; CHECK-LABEL: define {{[^@]+}}@foo4646; CHECK-SAME: (i32 [[V:%.*]]) {647; CHECK-NEXT: call void @bar5(i32 [[V]])648; CHECK-NEXT: ret void649;650 call void @bar5(i32 %v)651 ret void652}653 654define void @prop_range_empty_intersect(i32 %v) {655; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_intersect656; CHECK-SAME: (i32 [[V:%.*]]) {657; CHECK-NEXT: call void @bar5(i32 range(i32 0, 0) [[V]])658; CHECK-NEXT: ret void659;660 call void @foo4_range_0_10(i32 range(i32 11, 50) %v)661 ret void662}663 664define void @prop_range_empty(i32 %v) {665; CHECK-LABEL: define {{[^@]+}}@prop_range_empty666; CHECK-SAME: (i32 [[V:%.*]]) {667; CHECK-NEXT: call void @bar5(i32 range(i32 1, 0) [[V]])668; CHECK-NEXT: ret void669;670 call void @foo4(i32 range(i32 1, 0) %v)671 ret void672}673 674define void @prop_range_empty_with_intersect(i32 %v) {675; CHECK-LABEL: define {{[^@]+}}@prop_range_empty_with_intersect676; CHECK-SAME: (i32 [[V:%.*]]) {677; CHECK-NEXT: call void @bar5(i32 range(i32 1, 10) [[V]])678; CHECK-NEXT: ret void679;680 call void @foo4_range_0_10(i32 range(i32 1, 0) %v)681 ret void682}683 684define void @prop_range_intersect1(i32 %v) {685; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect1686; CHECK-SAME: (i32 [[V:%.*]]) {687; CHECK-NEXT: call void @bar5(i32 range(i32 0, 9) [[V]])688; CHECK-NEXT: ret void689;690 call void @foo4_range_0_10(i32 range(i32 0, 9) %v)691 ret void692}693 694define void @prop_range_intersect2(i32 %v) {695; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect2696; CHECK-SAME: (i32 [[V:%.*]]) {697; CHECK-NEXT: call void @bar5(i32 range(i32 1, 9) [[V]])698; CHECK-NEXT: ret void699;700 call void @foo4_range_0_10(i32 range(i32 1, 9) %v)701 ret void702}703 704define void @prop_range_intersect3(i32 %v) {705; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect3706; CHECK-SAME: (i32 [[V:%.*]]) {707; CHECK-NEXT: call void @bar5(i32 range(i32 0, 11) [[V]])708; CHECK-NEXT: ret void709;710 call void @foo4_2_range_0_10(i32 range(i32 0, 11) %v)711 ret void712}713 714define void @prop_range_intersect4(i32 %v) {715; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect4716; CHECK-SAME: (i32 [[V:%.*]]) {717; CHECK-NEXT: call void @bar5(i32 range(i32 0, 5) [[V]])718; CHECK-NEXT: ret void719;720 call void @foo4_range_0_10(i32 range(i32 40, 5) %v)721 ret void722}723 724define void @prop_range_intersect5(i32 %v) {725; CHECK-LABEL: define {{[^@]+}}@prop_range_intersect5726; CHECK-SAME: (i32 [[V:%.*]]) {727; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])728; CHECK-NEXT: ret void729;730 call void @foo4_range_10_40(i32 range(i32 30, 20) %v)731 ret void732}733 734define void @prop_range_keep(i32 %v) {735; CHECK-LABEL: define {{[^@]+}}@prop_range_keep736; CHECK-SAME: (i32 [[V:%.*]]) {737; CHECK-NEXT: call void @bar5(i32 range(i32 10, 40) [[V]])738; CHECK-NEXT: ret void739;740 call void @foo4_range_10_40(i32 %v)741 ret void742}743 744define void @prop_range_direct(i32 %v) {745; CHECK-LABEL: define {{[^@]+}}@prop_range_direct746; CHECK-SAME: (i32 [[V:%.*]]) {747; CHECK-NEXT: call void @bar5(i32 range(i32 1, 11) [[V]])748; CHECK-NEXT: ret void749;750 call void @foo4(i32 range(i32 1, 11) %v)751 ret void752}753 754declare void @bar_fp(float %x)755 756define void @foo_fp(float %x) {757; CHECK-LABEL: define {{[^@]+}}@foo_fp758; CHECK-SAME: (float [[X:%.*]]) {759; CHECK-NEXT: call void @bar_fp(float [[X]])760; CHECK-NEXT: ret void761;762 call void @bar_fp(float %x)763 ret void764}765 766define void @prop_param_nofpclass(float %x) {767; CHECK-LABEL: define {{[^@]+}}@prop_param_nofpclass768; CHECK-SAME: (float [[X:%.*]]) {769; CHECK-NEXT: call void @bar_fp(float nofpclass(nan inf) [[X]])770; CHECK-NEXT: ret void771;772 call void @foo_fp(float nofpclass(nan inf) %x)773 ret void774}775 776declare void @func_fp(float)777 778define void @union_nofpclass(float %v) {779; CHECK-LABEL: define {{[^@]+}}@union_nofpclass780; CHECK-SAME: (float [[V:%.*]]) {781; CHECK-NEXT: call void @func_fp(float nofpclass(inf) [[V]])782; CHECK-NEXT: ret void783;784 call void @func_fp(float nofpclass(inf) %v)785 ret void786}787 788define void @prop_nofpclass_union(float %v) {789; CHECK-LABEL: define {{[^@]+}}@prop_nofpclass_union790; CHECK-SAME: (float [[V:%.*]]) {791; CHECK-NEXT: call void @func_fp(float nofpclass(nan inf) [[V]])792; CHECK-NEXT: ret void793;794 call void @union_nofpclass(float nofpclass(nan) %v)795 ret void796}797 798declare void @ext_f32_i32(float, i32)799 800define void @callee_callsite_has_nofpclass(float %a, i32 %b) {801; CHECK-LABEL: define {{[^@]+}}@callee_callsite_has_nofpclass802; CHECK-SAME: (float [[A:%.*]], i32 [[B:%.*]]) {803; CHECK-NEXT: call void @ext_f32_i32(float nofpclass(nan inf) [[A]], i32 [[B]])804; CHECK-NEXT: ret void805;806 call void @ext_f32_i32(float nofpclass(inf nan) %a, i32 %b)807 ret void808}809 810; Need to have one attribute on the callsite to attempt the attribute811; propagation in some argument,.812define void @prop_param_nofpclass_none_on_input_arg(float %a, i32 %b) {813; CHECK-LABEL: define {{[^@]+}}@prop_param_nofpclass_none_on_input_arg814; CHECK-SAME: (float [[A:%.*]], i32 [[B:%.*]]) {815; CHECK-NEXT: call void @ext_f32_i32(float nofpclass(nan inf) [[A]], i32 range(i32 0, 256) [[B]])816; CHECK-NEXT: ret void817;818 call void @callee_callsite_has_nofpclass(float %a, i32 range(i32 0, 256) %b)819 ret void820}821