brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.9 KiB · a2f3d52 Raw
397 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 42; RUN: opt -passes=ctx-instr-gen -profile-context-root=an_entrypoint \3; RUN:   -S < %s | FileCheck --check-prefix=INSTRUMENT %s4; RUN: opt -passes=ctx-instr-gen,assign-guid,ctx-instr-lower -profile-context-root=an_entrypoint \5; RUN:   -profile-context-root=another_entrypoint_no_callees \6; RUN:   -S < %s | FileCheck --check-prefix=LOWERING %s7 8 9declare void @bar()10 11;.12; INSTRUMENT: @foo_alias = weak_odr unnamed_addr alias void (i32, ptr), ptr @foo13;.14; LOWERING: @__llvm_ctx_profile_callsite = external hidden thread_local global ptr15; LOWERING: @__llvm_ctx_profile_expected_callee = external hidden thread_local global ptr16; LOWERING: @[[GLOB0:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer17; LOWERING: @[[GLOB1:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer18; LOWERING: @[[GLOB2:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer19; LOWERING: @[[GLOB3:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer20; LOWERING: @[[GLOB4:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer21; LOWERING: @[[GLOB5:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer22; LOWERING: @[[GLOB6:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer23; LOWERING: @[[GLOB7:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } { ptr null, ptr null, ptr inttoptr (i64 1 to ptr), ptr null, i8 0 }24; LOWERING: @[[GLOB8:[0-9]+]] = internal global { ptr, ptr, ptr, ptr, i8 } zeroinitializer25; LOWERING: @foo_alias = weak_odr unnamed_addr alias void (i32, ptr), ptr @foo26;.27define void @foo(i32 %a, ptr %fct) {28; INSTRUMENT-LABEL: define void @foo(29; INSTRUMENT-SAME: i32 [[A:%.*]], ptr [[FCT:%.*]]) {30; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @foo, i64 728453322856651412, i32 2, i32 0)31; INSTRUMENT-NEXT:    [[T:%.*]] = icmp eq i32 [[A]], 032; INSTRUMENT-NEXT:    br i1 [[T]], label [[YES:%.*]], label [[NO:%.*]]33; INSTRUMENT:       yes:34; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @foo, i64 728453322856651412, i32 2, i32 1)35; INSTRUMENT-NEXT:    call void @llvm.instrprof.callsite(ptr @foo, i64 728453322856651412, i32 2, i32 0, ptr [[FCT]])36; INSTRUMENT-NEXT:    call void [[FCT]](i32 [[A]])37; INSTRUMENT-NEXT:    br label [[EXIT:%.*]]38; INSTRUMENT:       no:39; INSTRUMENT-NEXT:    call void @llvm.instrprof.callsite(ptr @foo, i64 728453322856651412, i32 2, i32 1, ptr @bar)40; INSTRUMENT-NEXT:    call void @bar()41; INSTRUMENT-NEXT:    br label [[EXIT]]42; INSTRUMENT:       exit:43; INSTRUMENT-NEXT:    ret void44;45; LOWERING-LABEL: define void @foo(46; LOWERING-SAME: i32 [[A:%.*]], ptr [[FCT:%.*]]) !guid [[META0:![0-9]+]] {47; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB0]], ptr @foo, i64 6699318081062747564, i32 2, i32 2)48; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i6449; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], 150; LOWERING-NEXT:    [[TMP4:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_expected_callee)51; LOWERING-NEXT:    [[TMP5:%.*]] = getelementptr ptr, ptr [[TMP4]], i64 [[TMP3]]52; LOWERING-NEXT:    [[TMP6:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_callsite)53; LOWERING-NEXT:    [[TMP7:%.*]] = getelementptr i32, ptr [[TMP6]], i64 [[TMP3]]54; LOWERING-NEXT:    [[TMP8:%.*]] = and i64 [[TMP2]], -255; LOWERING-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr56; LOWERING-NEXT:    [[T:%.*]] = icmp eq i32 [[A]], 057; LOWERING-NEXT:    br i1 [[T]], label [[YES:%.*]], label [[NO:%.*]]58; LOWERING:       yes:59; LOWERING-NEXT:    [[TMP10:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [2 x ptr] }, ptr [[TMP9]], i32 0, i32 1, i32 160; LOWERING-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP10]], align 461; LOWERING-NEXT:    [[TMP12:%.*]] = add i64 [[TMP11]], 162; LOWERING-NEXT:    store i64 [[TMP12]], ptr [[TMP10]], align 463; LOWERING-NEXT:    store volatile ptr [[FCT]], ptr [[TMP5]], align 864; LOWERING-NEXT:    [[TMP13:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [2 x ptr] }, ptr [[TMP1]], i32 0, i32 2, i32 065; LOWERING-NEXT:    store volatile ptr [[TMP13]], ptr [[TMP7]], align 866; LOWERING-NEXT:    call void [[FCT]](i32 [[A]])67; LOWERING-NEXT:    br label [[EXIT:%.*]]68; LOWERING:       no:69; LOWERING-NEXT:    store volatile ptr @bar, ptr [[TMP5]], align 870; LOWERING-NEXT:    [[TMP14:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [2 x ptr] }, ptr [[TMP1]], i32 0, i32 2, i32 171; LOWERING-NEXT:    store volatile ptr [[TMP14]], ptr [[TMP7]], align 872; LOWERING-NEXT:    call void @bar()73; LOWERING-NEXT:    br label [[EXIT]]74; LOWERING:       exit:75; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB0]])76; LOWERING-NEXT:    ret void77;78  %t = icmp eq i32 %a, 079  br i1 %t, label %yes, label %no80yes:81  call void %fct(i32 %a)82  br label %exit83no:84  call void @bar()85  br label %exit86exit:87  ret void88}89 90define void @an_entrypoint(i32 %a) {91; INSTRUMENT-LABEL: define void @an_entrypoint(92; INSTRUMENT-SAME: i32 [[A:%.*]]) {93; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @an_entrypoint, i64 784007058953177093, i32 2, i32 0)94; INSTRUMENT-NEXT:    [[T:%.*]] = icmp eq i32 [[A]], 095; INSTRUMENT-NEXT:    br i1 [[T]], label [[YES:%.*]], label [[NO:%.*]]96; INSTRUMENT:       yes:97; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @an_entrypoint, i64 784007058953177093, i32 2, i32 1)98; INSTRUMENT-NEXT:    call void @llvm.instrprof.callsite(ptr @an_entrypoint, i64 784007058953177093, i32 1, i32 0, ptr @foo)99; INSTRUMENT-NEXT:    call void @foo(i32 1, ptr null)100; INSTRUMENT-NEXT:    ret void101; INSTRUMENT:       no:102; INSTRUMENT-NEXT:    ret void103;104; LOWERING-LABEL: define void @an_entrypoint(105; LOWERING-SAME: i32 [[A:%.*]]) !guid [[META1:![0-9]+]] {106; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_start_context(ptr @[[GLOB1]], i64 4909520559318251808, i32 2, i32 1)107; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64108; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], 1109; LOWERING-NEXT:    [[TMP4:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_expected_callee)110; LOWERING-NEXT:    [[TMP5:%.*]] = getelementptr ptr, ptr [[TMP4]], i64 [[TMP3]]111; LOWERING-NEXT:    [[TMP6:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_callsite)112; LOWERING-NEXT:    [[TMP7:%.*]] = getelementptr i32, ptr [[TMP6]], i64 [[TMP3]]113; LOWERING-NEXT:    [[TMP8:%.*]] = and i64 [[TMP2]], -2114; LOWERING-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr115; LOWERING-NEXT:    [[T:%.*]] = icmp eq i32 [[A]], 0116; LOWERING-NEXT:    br i1 [[T]], label [[YES:%.*]], label [[NO:%.*]]117; LOWERING:       yes:118; LOWERING-NEXT:    [[TMP10:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [1 x ptr] }, ptr [[TMP9]], i32 0, i32 1, i32 1119; LOWERING-NEXT:    [[TMP11:%.*]] = load i64, ptr [[TMP10]], align 4120; LOWERING-NEXT:    [[TMP12:%.*]] = add i64 [[TMP11]], 1121; LOWERING-NEXT:    store i64 [[TMP12]], ptr [[TMP10]], align 4122; LOWERING-NEXT:    store volatile ptr @foo, ptr [[TMP5]], align 8123; LOWERING-NEXT:    [[TMP13:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [1 x ptr] }, ptr [[TMP1]], i32 0, i32 2, i32 0124; LOWERING-NEXT:    store volatile ptr [[TMP13]], ptr [[TMP7]], align 8125; LOWERING-NEXT:    call void @foo(i32 1, ptr null)126; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB1]])127; LOWERING-NEXT:    ret void128; LOWERING:       no:129; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB1]])130; LOWERING-NEXT:    ret void131;132  %t = icmp eq i32 %a, 0133  br i1 %t, label %yes, label %no134 135yes:136  call void @foo(i32 1, ptr null)137  ret void138no:139  ret void140}141 142define void @another_entrypoint_no_callees(i32 %a) {143; INSTRUMENT-LABEL: define void @another_entrypoint_no_callees(144; INSTRUMENT-SAME: i32 [[A:%.*]]) {145; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @another_entrypoint_no_callees, i64 784007058953177093, i32 2, i32 0)146; INSTRUMENT-NEXT:    [[T:%.*]] = icmp eq i32 [[A]], 0147; INSTRUMENT-NEXT:    br i1 [[T]], label [[YES:%.*]], label [[NO:%.*]]148; INSTRUMENT:       yes:149; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @another_entrypoint_no_callees, i64 784007058953177093, i32 2, i32 1)150; INSTRUMENT-NEXT:    ret void151; INSTRUMENT:       no:152; INSTRUMENT-NEXT:    ret void153;154; LOWERING-LABEL: define void @another_entrypoint_no_callees(155; LOWERING-SAME: i32 [[A:%.*]]) !guid [[META2:![0-9]+]] {156; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_start_context(ptr @[[GLOB2]], i64 -6371873725078000974, i32 2, i32 0)157; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64158; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], -2159; LOWERING-NEXT:    [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr160; LOWERING-NEXT:    [[T:%.*]] = icmp eq i32 [[A]], 0161; LOWERING-NEXT:    br i1 [[T]], label [[YES:%.*]], label [[NO:%.*]]162; LOWERING:       yes:163; LOWERING-NEXT:    [[TMP5:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [0 x ptr] }, ptr [[TMP4]], i32 0, i32 1, i32 1164; LOWERING-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 4165; LOWERING-NEXT:    [[TMP7:%.*]] = add i64 [[TMP6]], 1166; LOWERING-NEXT:    store i64 [[TMP7]], ptr [[TMP5]], align 4167; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB2]])168; LOWERING-NEXT:    ret void169; LOWERING:       no:170; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB2]])171; LOWERING-NEXT:    ret void172;173  %t = icmp eq i32 %a, 0174  br i1 %t, label %yes, label %no175 176yes:177  ret void178no:179  ret void180}181 182define void @simple(i32 %a) {183; INSTRUMENT-LABEL: define void @simple(184; INSTRUMENT-SAME: i32 [[A:%.*]]) {185; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @simple, i64 742261418966908927, i32 1, i32 0)186; INSTRUMENT-NEXT:    ret void187;188; LOWERING-LABEL: define void @simple(189; LOWERING-SAME: i32 [[A:%.*]]) !guid [[META3:![0-9]+]] {190; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB3]], ptr @simple, i64 -3006003237940970099, i32 1, i32 0)191; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64192; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], -2193; LOWERING-NEXT:    [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr194; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB3]])195; LOWERING-NEXT:    ret void196;197  ret void198}199 200 201define i32 @no_callsites(i32 %a) {202; INSTRUMENT-LABEL: define i32 @no_callsites(203; INSTRUMENT-SAME: i32 [[A:%.*]]) {204; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @no_callsites, i64 784007058953177093, i32 2, i32 0)205; INSTRUMENT-NEXT:    [[C:%.*]] = icmp eq i32 [[A]], 0206; INSTRUMENT-NEXT:    br i1 [[C]], label [[YES:%.*]], label [[NO:%.*]]207; INSTRUMENT:       yes:208; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @no_callsites, i64 784007058953177093, i32 2, i32 1)209; INSTRUMENT-NEXT:    ret i32 1210; INSTRUMENT:       no:211; INSTRUMENT-NEXT:    ret i32 0212;213; LOWERING-LABEL: define i32 @no_callsites(214; LOWERING-SAME: i32 [[A:%.*]]) !guid [[META4:![0-9]+]] {215; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB4]], ptr @no_callsites, i64 5679753335911435902, i32 2, i32 0)216; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64217; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], -2218; LOWERING-NEXT:    [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr219; LOWERING-NEXT:    [[C:%.*]] = icmp eq i32 [[A]], 0220; LOWERING-NEXT:    br i1 [[C]], label [[YES:%.*]], label [[NO:%.*]]221; LOWERING:       yes:222; LOWERING-NEXT:    [[TMP5:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [2 x i64], [0 x ptr] }, ptr [[TMP4]], i32 0, i32 1, i32 1223; LOWERING-NEXT:    [[TMP6:%.*]] = load i64, ptr [[TMP5]], align 4224; LOWERING-NEXT:    [[TMP7:%.*]] = add i64 [[TMP6]], 1225; LOWERING-NEXT:    store i64 [[TMP7]], ptr [[TMP5]], align 4226; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB4]])227; LOWERING-NEXT:    ret i32 1228; LOWERING:       no:229; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB4]])230; LOWERING-NEXT:    ret i32 0231;232  %c = icmp eq i32 %a, 0233  br i1 %c, label %yes, label %no234yes:235  ret i32 1236no:237  ret i32 0238}239 240define void @no_counters() {241; INSTRUMENT-LABEL: define void @no_counters() {242; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @no_counters, i64 742261418966908927, i32 1, i32 0)243; INSTRUMENT-NEXT:    call void @llvm.instrprof.callsite(ptr @no_counters, i64 742261418966908927, i32 1, i32 0, ptr @bar)244; INSTRUMENT-NEXT:    call void @bar()245; INSTRUMENT-NEXT:    ret void246;247; LOWERING-LABEL: define void @no_counters(248; LOWERING-SAME: ) !guid [[META5:![0-9]+]] {249; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB5]], ptr @no_counters, i64 5458232184388660970, i32 1, i32 1)250; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64251; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], 1252; LOWERING-NEXT:    [[TMP4:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_expected_callee)253; LOWERING-NEXT:    [[TMP5:%.*]] = getelementptr ptr, ptr [[TMP4]], i64 [[TMP3]]254; LOWERING-NEXT:    [[TMP6:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_callsite)255; LOWERING-NEXT:    [[TMP7:%.*]] = getelementptr i32, ptr [[TMP6]], i64 [[TMP3]]256; LOWERING-NEXT:    [[TMP8:%.*]] = and i64 [[TMP2]], -2257; LOWERING-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr258; LOWERING-NEXT:    store volatile ptr @bar, ptr [[TMP5]], align 8259; LOWERING-NEXT:    [[TMP10:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [1 x i64], [1 x ptr] }, ptr [[TMP1]], i32 0, i32 2, i32 0260; LOWERING-NEXT:    store volatile ptr [[TMP10]], ptr [[TMP7]], align 8261; LOWERING-NEXT:    call void @bar()262; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB5]])263; LOWERING-NEXT:    ret void264;265  call void @bar()266  ret void267}268 269; Ensure "calls" to inline asm don't get callsite-instrumented.270define void @inlineasm() {271; INSTRUMENT-LABEL: define void @inlineasm() {272; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @inlineasm, i64 742261418966908927, i32 1, i32 0)273; INSTRUMENT-NEXT:    call void asm "nop", ""()274; INSTRUMENT-NEXT:    ret void275;276; LOWERING-LABEL: define void @inlineasm(277; LOWERING-SAME: ) !guid [[META6:![0-9]+]] {278; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB6]], ptr @inlineasm, i64 -3771893999295659109, i32 1, i32 0)279; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64280; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], -2281; LOWERING-NEXT:    [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr282; LOWERING-NEXT:    call void asm "nop", ""()283; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB6]])284; LOWERING-NEXT:    ret void285;286  call void asm "nop", ""()287  ret void288}289 290define void @has_musttail_calls() {291; INSTRUMENT-LABEL: define void @has_musttail_calls() {292; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @has_musttail_calls, i64 742261418966908927, i32 1, i32 0)293; INSTRUMENT-NEXT:    call void @llvm.instrprof.callsite(ptr @has_musttail_calls, i64 742261418966908927, i32 1, i32 0, ptr @bar)294; INSTRUMENT-NEXT:    musttail call void @bar()295; INSTRUMENT-NEXT:    ret void296;297; LOWERING-LABEL: define void @has_musttail_calls(298; LOWERING-SAME: ) !guid [[META7:![0-9]+]] {299; LOWERING-NEXT:    [[TMP1:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB7]], ptr @has_musttail_calls, i64 -4680624981836544329, i32 1, i32 1)300; LOWERING-NEXT:    [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64301; LOWERING-NEXT:    [[TMP3:%.*]] = and i64 [[TMP2]], 1302; LOWERING-NEXT:    [[TMP4:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_expected_callee)303; LOWERING-NEXT:    [[TMP5:%.*]] = getelementptr ptr, ptr [[TMP4]], i64 [[TMP3]]304; LOWERING-NEXT:    [[TMP6:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_callsite)305; LOWERING-NEXT:    [[TMP7:%.*]] = getelementptr i32, ptr [[TMP6]], i64 [[TMP3]]306; LOWERING-NEXT:    [[TMP8:%.*]] = and i64 [[TMP2]], -2307; LOWERING-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr308; LOWERING-NEXT:    store volatile ptr @bar, ptr [[TMP5]], align 8309; LOWERING-NEXT:    [[TMP10:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [1 x i64], [1 x ptr] }, ptr [[TMP1]], i32 0, i32 2, i32 0310; LOWERING-NEXT:    store volatile ptr [[TMP10]], ptr [[TMP7]], align 8311; LOWERING-NEXT:    musttail call void @bar()312; LOWERING-NEXT:    ret void313;314  musttail call void @bar()315  ret void316}317 318define void @does_not_return() noreturn {319; INSTRUMENT-LABEL: define void @does_not_return(320; INSTRUMENT-SAME: ) #[[ATTR0:[0-9]+]] {321; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @does_not_return, i64 742261418966908927, i32 1, i32 0)322; INSTRUMENT-NEXT:    unreachable323;324; LOWERING-LABEL: define void @does_not_return(325; LOWERING-SAME: ) #[[ATTR0:[0-9]+]] !guid [[META8:![0-9]+]] {326; LOWERING-NEXT:    unreachable327;328  unreachable329}330 331define void @unreachable() {332; INSTRUMENT-LABEL: define void @unreachable() {333; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @unreachable, i64 742261418966908927, i32 1, i32 0)334; INSTRUMENT-NEXT:    unreachable335;336; LOWERING-LABEL: define void @unreachable(337; LOWERING-SAME: ) !guid [[META9:![0-9]+]] {338; LOWERING-NEXT:    unreachable339;340  unreachable341}342 343@foo_alias = weak_odr unnamed_addr alias void (i32, ptr), ptr @foo344 345define void @call_alias(ptr %a) {346; INSTRUMENT-LABEL: define void @call_alias(347; INSTRUMENT-SAME: ptr [[A:%.*]]) {348; INSTRUMENT-NEXT:  entry:349; INSTRUMENT-NEXT:    call void @llvm.instrprof.increment(ptr @call_alias, i64 742261418966908927, i32 1, i32 0)350; INSTRUMENT-NEXT:    call void @llvm.instrprof.callsite(ptr @call_alias, i64 742261418966908927, i32 1, i32 0, ptr @foo_alias)351; INSTRUMENT-NEXT:    call void @foo_alias(i32 0, ptr [[A]])352; INSTRUMENT-NEXT:    ret void353;354; LOWERING-LABEL: define void @call_alias(355; LOWERING-SAME: ptr [[A:%.*]]) !guid [[META10:![0-9]+]] {356; LOWERING-NEXT:  entry:357; LOWERING-NEXT:    [[TMP0:%.*]] = call ptr @__llvm_ctx_profile_get_context(ptr @[[GLOB8]], ptr @call_alias, i64 2172368043968427688, i32 1, i32 1)358; LOWERING-NEXT:    [[TMP1:%.*]] = ptrtoint ptr [[TMP0]] to i64359; LOWERING-NEXT:    [[TMP2:%.*]] = and i64 [[TMP1]], 1360; LOWERING-NEXT:    [[TMP3:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_expected_callee)361; LOWERING-NEXT:    [[TMP4:%.*]] = getelementptr ptr, ptr [[TMP3]], i64 [[TMP2]]362; LOWERING-NEXT:    [[TMP5:%.*]] = call ptr @llvm.threadlocal.address.p0(ptr @__llvm_ctx_profile_callsite)363; LOWERING-NEXT:    [[TMP6:%.*]] = getelementptr i32, ptr [[TMP5]], i64 [[TMP2]]364; LOWERING-NEXT:    [[TMP7:%.*]] = and i64 [[TMP1]], -2365; LOWERING-NEXT:    [[TMP8:%.*]] = inttoptr i64 [[TMP7]] to ptr366; LOWERING-NEXT:    store volatile ptr @foo_alias, ptr [[TMP4]], align 8367; LOWERING-NEXT:    [[TMP9:%.*]] = getelementptr { { i64, ptr, i32, i32 }, [1 x i64], [1 x ptr] }, ptr [[TMP0]], i32 0, i32 2, i32 0368; LOWERING-NEXT:    store volatile ptr [[TMP9]], ptr [[TMP6]], align 8369; LOWERING-NEXT:    call void @foo_alias(i32 0, ptr [[A]])370; LOWERING-NEXT:    call void @__llvm_ctx_profile_release_context(ptr @[[GLOB8]])371; LOWERING-NEXT:    ret void372;373entry:374  call void @foo_alias(i32 0, ptr %a)375  ret void376}377;.378; LOWERING: attributes #[[ATTR0]] = { noreturn }379; LOWERING: attributes #[[ATTR1:[0-9]+]] = { nounwind }380; LOWERING: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }381;.382; INSTRUMENT: attributes #[[ATTR0]] = { noreturn }383; INSTRUMENT: attributes #[[ATTR1:[0-9]+]] = { nounwind }384;.385; LOWERING: [[META0]] = !{i64 6699318081062747564}386; LOWERING: [[META1]] = !{i64 4909520559318251808}387; LOWERING: [[META2]] = !{i64 -6371873725078000974}388; LOWERING: [[META3]] = !{i64 -3006003237940970099}389; LOWERING: [[META4]] = !{i64 5679753335911435902}390; LOWERING: [[META5]] = !{i64 5458232184388660970}391; LOWERING: [[META6]] = !{i64 -3771893999295659109}392; LOWERING: [[META7]] = !{i64 -4680624981836544329}393; LOWERING: [[META8]] = !{i64 5519225910966780583}394; LOWERING: [[META9]] = !{i64 -565652589829076809}395; LOWERING: [[META10]] = !{i64 2172368043968427688}396;.397