forked from OSchip/llvm-project
9ab9a9595b
The NS==0 condition used by D103717 missed a corner case: if the current copy does not have a hash suffix (e.g. weak_odr), a copy with value profiling (with a different CFG) may exist. This is super rare, but is possible with pre-inlining PGO instrumentation (which can make a weak_odr function inlines its callees differently, sometimes with value profiling while sometimes without). If the current copy with private profd is prevailing, the non-prevailing copy may get an undefined symbol if a caller inlining the non-prevailing function references its profd. If the other copy with non-private profd is prevailing, the current copy may cause a "relocation to discarded section" linker error. The fix is straightforward: just keep non-private profd in such a `DataReferencedByCode` case. With this change, a stage 2 (`-DLLVM_TARGETS_TO_BUILD=X86 -DLLVM_BUILD_INSTRUMENTED=IR`) clang is 0.08% larger (172431496/172286720-1). `stat -c %s **/*.o | awk '{s+=$1}END{print s}' is 0.026% larger. The majority of D103717's benefits remains. Reviewed By: xur Differential Revision: https://reviews.llvm.org/D108432 |
||
---|---|---|
.. | ||
Inputs | ||
X86 | ||
PR28219.ll | ||
PR41279.ll | ||
PR41279_2.ll | ||
bfi_verification.ll | ||
branch1.ll | ||
branch2.ll | ||
callbr.ll | ||
chr.ll | ||
comdat.ll | ||
comdat_internal.ll | ||
comdat_rename.ll | ||
consecutive-zeros.ll | ||
counter_promo.ll | ||
counter_promo_exit_catchswitch.ll | ||
counter_promo_exit_merge.ll | ||
counter_promo_mexits.ll | ||
counter_promo_nest-inseltpoison.ll | ||
counter_promo_nest.ll | ||
criticaledge.ll | ||
cspgo_profile_summary.ll | ||
diag_FE_profile.ll | ||
diag_mismatch.ll | ||
diag_no_funcprofdata.ll | ||
diag_no_profile.ll | ||
diag_no_value_sites.ll | ||
do-not-instrument.ll | ||
fix_bfi.ll | ||
fix_entry_count.ll | ||
func_entry.ll | ||
hash_mismatch_metadata.ll | ||
icp_covariant_call_return.ll | ||
icp_covariant_invoke_return.ll | ||
icp_invoke.ll | ||
icp_invoke_nouse.ll | ||
icp_mismatch_msg.ll | ||
icp_sample.ll | ||
icp_vararg.ll | ||
icp_vararg_sret.ll | ||
indirect_call_annotation.ll | ||
indirect_call_profile.ll | ||
indirect_call_profile_funclet.ll | ||
indirect_call_promotion.ll | ||
indirect_call_promotion_byval.ll | ||
indirect_call_promotion_musttail.ll | ||
indirect_call_promotion_unique.ll | ||
indirect_call_promotion_vla.ll | ||
indirectbr.ll | ||
infinite_loop.ll | ||
infinite_loop_gen.ll | ||
instr_entry_bb.ll | ||
irreducible.ll | ||
landingpad.ll | ||
large_count_remarks.ll | ||
loop1.ll | ||
loop2.ll | ||
lto_cspgo_gen.ll | ||
memcpy.ll | ||
memop_clone.ll | ||
memop_hash.ll | ||
memop_profile_funclet.ll | ||
memop_size_annotation.ll | ||
memop_size_from_strlen.ll | ||
memop_size_opt.ll | ||
memop_size_opt_skip_ranges_promote_three.ll | ||
memop_size_opt_zero.ll | ||
mismatched-byval.ll | ||
mismatched-inalloca.ll | ||
multiple_hash_profile.ll | ||
noprofile.ll | ||
noreturncall.ll | ||
not_promote_ret_exit.ll | ||
preinline.ll | ||
remap.ll | ||
select1.ll | ||
select2.ll | ||
select_hash_conflict.ll | ||
single_bb.ll | ||
split-indirectbr-critical-edges.ll | ||
statics_counter_naming.ll | ||
suppl-profile.ll | ||
switch.ll | ||
thinlto_cspgo_gen.ll | ||
thinlto_cspgo_use.ll | ||
thinlto_indirect_call_promotion.ll | ||
thinlto_samplepgo_icp.ll | ||
thinlto_samplepgo_icp2.ll | ||
thinlto_samplepgo_icp3.ll | ||
thinlto_samplepgo_icp_droppeddead.ll | ||
unreachable_bb.ll |