summaryrefslogtreecommitdiff
path: root/include/llvm/Support/raw_ostream.h
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-04-03 18:43:17 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-04-03 18:43:17 +0000
commit38f4dd7b5e333aee8f89cee85d1c79378fee0ffc (patch)
tree6ede6d59455a6e690ba24c379ac69e368aaf241e /include/llvm/Support/raw_ostream.h
parentcf2202a84908f64a49b93e232fc375837963b01d (diff)
downloadllvm-38f4dd7b5e333aee8f89cee85d1c79378fee0ffc.tar.gz
llvm-38f4dd7b5e333aee8f89cee85d1c79378fee0ffc.tar.bz2
llvm-38f4dd7b5e333aee8f89cee85d1c79378fee0ffc.tar.xz
Add fast path for raw_ostream output of strings.
- Particularly nice for small constant strings, which get optimized down nicely. On a synthetic benchmark writing out "hello" in a loop, this is about 2x faster with gcc and 3x faster with llvm-gcc. llc on insn-attrtab.bc from 403.gcc is about .5% faster. - I tried for a fancier solution which wouldn't increase code size as much (by trying to match constant arrays), but can't quite make it fly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68396 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Support/raw_ostream.h')
-rw-r--r--include/llvm/Support/raw_ostream.h12
1 files changed, 11 insertions, 1 deletions
diff --git a/include/llvm/Support/raw_ostream.h b/include/llvm/Support/raw_ostream.h
index 3de31d6676..96adc465a7 100644
--- a/include/llvm/Support/raw_ostream.h
+++ b/include/llvm/Support/raw_ostream.h
@@ -119,7 +119,17 @@ public:
}
raw_ostream &operator<<(const char *Str) {
- write(Str, strlen(Str));
+ // Inline fast path, particulary for constant strings where a
+ // sufficiently smart compiler will simplify strlen.
+
+ unsigned Size = strlen(Str);
+
+ // Make sure we can use the fast path.
+ if (OutBufCur+Size > OutBufEnd)
+ return write(Str, Size);
+
+ memcpy(OutBufCur, Str, Size);
+ OutBufCur += Size;
return *this;
}