[llvm] r347464 - [llvm-mca] Use a SmallVector instead of std::vector to track register reads/writes. NFCI
Andrea Di Biagio via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 22 06:48:53 PST 2018
Author: adibiagio
Date: Thu Nov 22 06:48:53 2018
New Revision: 347464
URL: http://llvm.org/viewvc/llvm-project?rev=347464&view=rev
Log:
[llvm-mca] Use a SmallVector instead of std::vector to track register reads/writes. NFCI
This avoids a heap allocation most of the times.
This patch gives a small but consistent 3% speedup on a release build (up to ~5%
on a debug build).
Modified:
llvm/trunk/tools/llvm-mca/include/Instruction.h
llvm/trunk/tools/llvm-mca/lib/Instruction.cpp
Modified: llvm/trunk/tools/llvm-mca/include/Instruction.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mca/include/Instruction.h?rev=347464&r1=347463&r2=347464&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-mca/include/Instruction.h (original)
+++ llvm/trunk/tools/llvm-mca/include/Instruction.h Thu Nov 22 06:48:53 2018
@@ -26,8 +26,6 @@
#endif
#include <memory>
-#include <set>
-#include <vector>
namespace llvm {
namespace mca {
@@ -134,7 +132,7 @@ class WriteState {
// gets notified with the actual CyclesLeft.
// The 'second' element of a pair is a "ReadAdvance" number of cycles.
- std::set<std::pair<ReadState *, int>> Users;
+ SmallVector<std::pair<ReadState *, int>, 4> Users;
public:
WriteState(const WriteDescriptor &Desc, unsigned RegID,
@@ -319,15 +317,16 @@ struct ResourceUsage {
/// An instruction descriptor
struct InstrDesc {
- std::vector<WriteDescriptor> Writes; // Implicit writes are at the end.
- std::vector<ReadDescriptor> Reads; // Implicit reads are at the end.
+ SmallVector<WriteDescriptor, 4> Writes; // Implicit writes are at the end.
+ SmallVector<ReadDescriptor, 4> Reads; // Implicit reads are at the end.
// For every resource used by an instruction of this kind, this vector
// reports the number of "consumed cycles".
- std::vector<std::pair<uint64_t, ResourceUsage>> Resources;
+ SmallVector<std::pair<uint64_t, ResourceUsage>, 4> Resources;
// A list of buffered resources consumed by this instruction.
- std::vector<uint64_t> Buffers;
+ SmallVector<uint64_t, 4> Buffers;
+
unsigned MaxLatency;
// Number of MicroOps for this instruction.
unsigned NumMicroOps;
Modified: llvm/trunk/tools/llvm-mca/lib/Instruction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mca/lib/Instruction.cpp?rev=347464&r1=347463&r2=347464&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-mca/lib/Instruction.cpp (original)
+++ llvm/trunk/tools/llvm-mca/lib/Instruction.cpp Thu Nov 22 06:48:53 2018
@@ -65,8 +65,11 @@ void WriteState::addUser(ReadState *User
return;
}
- std::pair<ReadState *, int> NewPair(User, ReadAdvance);
- Users.insert(NewPair);
+ if (llvm::find_if(Users, [&User](const std::pair<ReadState *, int> &Use) {
+ return Use.first == User;
+ }) == Users.end()) {
+ Users.emplace_back(User, ReadAdvance);
+ }
}
void WriteState::addUser(WriteState *User) {
More information about the llvm-commits
mailing list