[llvm] [ThinLTO] optimize propagateAttributes performance (PR #132917)

Zhaoxuan Jiang via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 8 01:24:11 PDT 2025


nocchijiang wrote:

Applying the shift does help, but it is still far from acceptable.

```
Weight	Self Weight		Symbol Name
9.94 min   56.3%	929.00 ms	 	llvm::ModuleSummaryIndex::propagateAttributes(llvm::DenseSet<unsigned long long, llvm::DenseMapInfo<unsigned long long, void>> const&)
9.79 min   55.5%	1.96 s	 	 propagateAttributesToRefs(llvm::GlobalValueSummary*, llvm::DenseSet<llvm::ValueInfo, llvm::DenseMapInfo<llvm::ValueInfo, void>>&)
8.93 min   50.6%	0 s	 	  llvm::detail::DenseSetImpl<llvm::ValueInfo, llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::DenseMapInfo<llvm::ValueInfo, void>>::insert(llvm::ValueInfo const&)
8.93 min   50.6%	0 s	 	   std::__1::pair<llvm::DenseMapIterator<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>, false>, bool> llvm::DenseMapBase<llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>::try_emplace<llvm::detail::DenseSetEmpty&>(llvm::ValueInfo const&, llvm::detail::DenseSetEmpty&)
8.93 min   50.6%	0 s	 	    bool llvm::DenseMapBase<llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>::LookupBucketFor<llvm::ValueInfo>(llvm::ValueInfo const&, llvm::detail::DenseSetPair<llvm::ValueInfo>*&)
8.93 min   50.6%	8.93 min	 	     bool llvm::DenseMapBase<llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>::LookupBucketFor<llvm::ValueInfo>(llvm::ValueInfo const&, llvm::detail::DenseSetPair<llvm::ValueInfo> const*&) const
```

Wrapping the shifted value in `hash_value()` does the trick:

```
Weight	Self Weight		Symbol Name
5.13 s    1.1%	577.00 ms	 	llvm::ModuleSummaryIndex::propagateAttributes(llvm::DenseSet<unsigned long long, llvm::DenseMapInfo<unsigned long long, void>> const&)
2.54 s    0.5%	1.57 s	 	 propagateAttributesToRefs(llvm::GlobalValueSummary*, llvm::DenseSet<llvm::ValueInfo, llvm::DenseMapInfo<llvm::ValueInfo, void>>&)
456.00 ms    0.1%	0 s	 	  llvm::detail::DenseSetImpl<llvm::ValueInfo, llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::DenseMapInfo<llvm::ValueInfo, void>>::contains(llvm::ValueInfo const&) const
456.00 ms    0.1%	50.00 ms	 	   llvm::DenseMapBase<llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>::find(llvm::ValueInfo const&) const
406.00 ms    0.0%	393.00 ms	 	    bool llvm::DenseMapBase<llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>::LookupBucketFor<llvm::ValueInfo>(llvm::ValueInfo const&, llvm::detail::DenseSetPair<llvm::ValueInfo> const*&) const
12.00 ms    0.0%	2.00 ms	 	     llvm::DenseMapBase<llvm::DenseMap<llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>, llvm::ValueInfo, llvm::detail::DenseSetEmpty, llvm::DenseMapInfo<llvm::ValueInfo, void>, llvm::detail::DenseSetPair<llvm::ValueInfo>>::getHashValue(llvm::ValueInfo const&)
10.00 ms    0.0%	0 s	 	      llvm::DenseMapInfo<llvm::ValueInfo, void>::getHashValue(llvm::ValueInfo)
10.00 ms    0.0%	0 s	 	       std::__1::enable_if<is_integral_or_enum<unsigned long>::value, llvm::hash_code>::type llvm::hash_value<unsigned long>(unsigned long)
```

I will update the patch as per @nikic 's great suggestion.

https://github.com/llvm/llvm-project/pull/132917


More information about the llvm-commits mailing list