From: Jakob Stoklund Olesen Date: Sun, 28 Nov 2010 22:17:14 +0000 (+0000) Subject: Don't use std::copy and std::copy_backward, run 10% faster. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=08d55342e337fd4e80a68b81b8b0cbb100ea0a23;p=oota-llvm.git Don't use std::copy and std::copy_backward, run 10% faster. Sometimes std::copy can become a memmove call, and that is not a good idea when copying relatively few bytes as we are doing. We also get a small win by changing two loops into one. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120265 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/IntervalMap.h b/include/llvm/ADT/IntervalMap.h index d0a3b53087d..b0a0a0ba9a2 100644 --- a/include/llvm/ADT/IntervalMap.h +++ b/include/llvm/ADT/IntervalMap.h @@ -103,7 +103,6 @@ #include "llvm/ADT/PointerIntPair.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/RecyclingAllocator.h" -#include #include // FIXME: Remove debugging code. @@ -211,8 +210,10 @@ public: unsigned j, unsigned Count) { assert(i + Count <= M && "Invalid source range"); assert(j + Count <= N && "Invalid dest range"); - std::copy(Other.first + i, Other.first + i + Count, first + j); - std::copy(Other.second + i, Other.second + i + Count, second + j); + for (unsigned e = i + Count; i != e; ++i, ++j) { + first[j] = Other.first[i]; + second[j] = Other.second[i]; + } } /// moveLeft - Move elements to the left. @@ -231,8 +232,10 @@ public: void moveRight(unsigned i, unsigned j, unsigned Count) { assert(i <= j && "Use moveLeft shift elements left"); assert(j + Count <= N && "Invalid range"); - std::copy_backward(first + i, first + i + Count, first + j + Count); - std::copy_backward(second + i, second + i + Count, second + j + Count); + while (Count--) { + first[j + Count] = first[i + Count]; + second[j + Count] = second[i + Count]; + } } /// erase - Erase elements [i;j).