summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-01-15 21:06:57 +0000
committerChris Lattner <sabre@nondot.org>2004-01-15 21:06:57 +0000
commit4c57267eceb7da7afb54491c37ea618d819d2e2f (patch)
tree8b7d02df19b530b02dc81bd2f0e4401cbe2a6bc7
parent2d0e6f63268cb67ee407ddf48c4b2710d40af83c (diff)
downloadbcm5719-llvm-4c57267eceb7da7afb54491c37ea618d819d2e2f.tar.gz
bcm5719-llvm-4c57267eceb7da7afb54491c37ea618d819d2e2f.zip
If these blocks are empty, there is no reason to even emit the bytecode blocks.
This saves about 15K in 176.gcc, coupled with another patch that I'm working on. llvm-svn: 10889
-rw-r--r--llvm/lib/Bytecode/Writer/Writer.cpp6
-rw-r--r--llvm/lib/Bytecode/Writer/WriterInternals.h26
2 files changed, 24 insertions, 8 deletions
diff --git a/llvm/lib/Bytecode/Writer/Writer.cpp b/llvm/lib/Bytecode/Writer/Writer.cpp
index 5675b2af491..6467921d053 100644
--- a/llvm/lib/Bytecode/Writer/Writer.cpp
+++ b/llvm/lib/Bytecode/Writer/Writer.cpp
@@ -164,7 +164,8 @@ void BytecodeWriter::outputConstantsInPlane(const std::vector<const Value*>
void BytecodeWriter::outputConstants(bool isFunction) {
ConstantTotalBytes -= Out.size();
if (isFunction) FunctionConstantTotalBytes -= Out.size();
- BytecodeBlock CPool(BytecodeFormat::ConstantPool, Out);
+ BytecodeBlock CPool(BytecodeFormat::ConstantPool, Out,
+ true /* Elide block if empty */);
unsigned NumPlanes = Table.getNumPlanes();
@@ -286,7 +287,8 @@ void BytecodeWriter::outputSymbolTable(const SymbolTable &MST) {
SymTabBytes -= Out.size();
- BytecodeBlock SymTabBlock(BytecodeFormat::SymbolTable, Out);
+ BytecodeBlock SymTabBlock(BytecodeFormat::SymbolTable, Out,
+ true/* ElideIfEmpty*/);
for (SymbolTable::const_iterator TI = MST.begin(); TI != MST.end(); ++TI) {
SymbolTable::type_const_iterator I = MST.type_begin(TI->first);
diff --git a/llvm/lib/Bytecode/Writer/WriterInternals.h b/llvm/lib/Bytecode/Writer/WriterInternals.h
index 51ec362d846..15dbeffc869 100644
--- a/llvm/lib/Bytecode/Writer/WriterInternals.h
+++ b/llvm/lib/Bytecode/Writer/WriterInternals.h
@@ -50,27 +50,41 @@ private:
-// BytecodeBlock - Little helper class that helps us do backpatching of bytecode
-// block sizes really easily. It backpatches when it goes out of scope.
-//
+/// BytecodeBlock - Little helper class is used by the bytecode writer to help
+/// do backpatching of bytecode block sizes really easily. It backpatches when
+/// it goes out of scope.
+///
class BytecodeBlock {
unsigned Loc;
std::deque<unsigned char> &Out;
+ /// ElideIfEmpty - If this is true and the bytecode block ends up being empty,
+ /// the block can remove itself from the output stream entirely.
+ bool ElideIfEmpty;
+
BytecodeBlock(const BytecodeBlock &); // do not implement
void operator=(const BytecodeBlock &); // do not implement
public:
- inline BytecodeBlock(unsigned ID, std::deque<unsigned char> &o) : Out(o) {
+ inline BytecodeBlock(unsigned ID, std::deque<unsigned char> &o,
+ bool elideIfEmpty = false)
+ : Out(o), ElideIfEmpty(elideIfEmpty) {
output(ID, Out);
- output((unsigned)0, Out); // Reserve the space for the block size...
+ output(0U, Out); // Reserve the space for the block size...
Loc = Out.size();
}
inline ~BytecodeBlock() { // Do backpatch when block goes out
// of scope...
+ if (Loc == Out.size() && ElideIfEmpty) {
+ // If the block is empty, and we are allowed to, do not emit the block at
+ // all!
+ Out.resize(Out.size()-8);
+ return;
+ }
+
//cerr << "OldLoc = " << Loc << " NewLoc = " << NewLoc << " diff = "
// << (NewLoc-Loc) << endl;
- output((unsigned)(Out.size()-Loc), Out, (int)Loc-4);
+ output(unsigned(Out.size()-Loc), Out, int(Loc-4));
align32(Out); // Blocks must ALWAYS be aligned
}
};
OpenPOWER on IntegriCloud