From ac95515741692bd61e4ea774b9ad3c7a9b414149 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 29 Mar 2008 04:52:12 +0000 Subject: [PATCH] make the common case of a single store (which clearly shouldn't be turned into a memset!) faster by avoiding an allocation of an std::list node. llvm-svn: 48939 --- llvm/lib/Transforms/Scalar/GVN.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/GVN.cpp b/llvm/lib/Transforms/Scalar/GVN.cpp index 636590d54450..42418f0ac4e7 100644 --- a/llvm/lib/Transforms/Scalar/GVN.cpp +++ b/llvm/lib/Transforms/Scalar/GVN.cpp @@ -1182,7 +1182,7 @@ public: typedef std::list::const_iterator const_iterator; const_iterator begin() const { return Ranges.begin(); } const_iterator end() const { return Ranges.end(); } - + bool empty() const { return Ranges.empty(); } void addStore(int64_t OffsetFromFirst, StoreInst *SI); }; @@ -1281,8 +1281,6 @@ bool GVN::processStore(StoreInst *SI, SmallVectorImpl &toErase) { // are stored. MemsetRanges Ranges(TD); - // Add our first pointer. - Ranges.addStore(0, SI); Value *StartPtr = SI->getPointerOperand(); BasicBlock::iterator BI = SI; @@ -1319,6 +1317,17 @@ bool GVN::processStore(StoreInst *SI, SmallVectorImpl &toErase) { Ranges.addStore(Offset, NextStore); } + + // If we have no ranges, then we just had a single store with nothing that + // could be merged in. This is a very common case of course. + if (Ranges.empty()) + return false; + + // If we had at least one store that could be merged in, add the starting + // store as well. We try to avoid this unless there is at least something + // interesting as a small compile-time optimization. + Ranges.addStore(0, SI); + Function *MemSetF = 0;