Change the table datastructure to be a vector<smallvector>, instead of

vector<vector> to avoid allocations.  This speeds up bcwriting of 447.dealII
from 0.8276 to 0.7637s (8.4%).

This concludes this round of proding the bcwriter into submission.  Final
speedup from 24.4s to 0.7637s (32x).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34142 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-02-10 07:42:59 +00:00
parent ae052aa5a7
commit 863da4c4f5
3 changed files with 14 additions and 16 deletions

View File

@ -21,6 +21,7 @@
#define LLVM_ANALYSIS_SLOTCALCULATOR_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include <vector>
namespace llvm {
@ -44,9 +45,10 @@ struct ModuleLevelDenseMapKeyInfo {
class SlotCalculator {
const Module *TheModule;
public:
typedef std::vector<const Type*> TypeList;
typedef std::vector<const Value*> TypePlane;
typedef SmallVector<const Value*, 16> TypePlane;
private:
std::vector<TypePlane> Table;
TypeList Types;
typedef DenseMap<const Value*, unsigned> NodeMapType;

View File

@ -812,21 +812,22 @@ void BytecodeWriter::outputTypes(unsigned TypeNum) {
// Helper function for outputConstants().
// Writes out all the constants in the plane Plane starting at entry StartNo.
//
void BytecodeWriter::outputConstantsInPlane(const std::vector<const Value*>
&Plane, unsigned StartNo) {
void BytecodeWriter::outputConstantsInPlane(const Value *const *Plane,
unsigned PlaneSize,
unsigned StartNo) {
unsigned ValNo = StartNo;
// Scan through and ignore function arguments, global values, and constant
// strings.
for (; ValNo < Plane.size() &&
for (; ValNo < PlaneSize &&
(isa<Argument>(Plane[ValNo]) || isa<GlobalValue>(Plane[ValNo]) ||
(isa<ConstantArray>(Plane[ValNo]) &&
cast<ConstantArray>(Plane[ValNo])->isString())); ValNo++)
/*empty*/;
unsigned NC = ValNo; // Number of constants
for (; NC < Plane.size() && (isa<Constant>(Plane[NC]) ||
isa<InlineAsm>(Plane[NC])); NC++)
for (; NC < PlaneSize && (isa<Constant>(Plane[NC]) ||
isa<InlineAsm>(Plane[NC])); NC++)
/*empty*/;
NC -= ValNo; // Convert from index into count
if (NC == 0) return; // Skip empty type planes...
@ -839,7 +840,7 @@ void BytecodeWriter::outputConstantsInPlane(const std::vector<const Value*>
output_vbr(NC);
// Put out the Type ID Number.
output_typeid(Table.getTypeSlot(Plane.front()->getType()));
output_typeid(Table.getTypeSlot(Plane[0]->getType()));
for (unsigned i = ValNo; i < ValNo+NC; ++i) {
const Value *V = Plane[i];
@ -864,7 +865,7 @@ void BytecodeWriter::outputConstants() {
outputConstantStrings();
for (unsigned pno = 0; pno != NumPlanes; pno++) {
const std::vector<const Value*> &Plane = Table.getPlane(pno);
const SlotCalculator::TypePlane &Plane = Table.getPlane(pno);
if (!Plane.empty()) { // Skip empty type planes...
unsigned ValNo = 0;
if (hasNullValue(Plane[0]->getType())) {
@ -873,7 +874,7 @@ void BytecodeWriter::outputConstants() {
}
// Write out constants in the plane
outputConstantsInPlane(Plane, ValNo);
outputConstantsInPlane(&Plane[0], Plane.size(), ValNo);
}
}
}

View File

@ -35,11 +35,6 @@ private:
void outputConstants();
void outputConstantStrings();
void outputFunction(const Function *F);
void outputCompactionTable();
void outputCompactionTypes(unsigned StartNo);
void outputCompactionTablePlane(unsigned PlaneNo,
const std::vector<const Value*> &TypePlane,
unsigned StartNo);
void outputInstructions(const Function *F);
void outputInstruction(const Instruction &I);
void outputInstructionFormat0(const Instruction *I, unsigned Opcode,
@ -66,7 +61,7 @@ private:
void outputTypeSymbolTable(const TypeSymbolTable &TST);
void outputValueSymbolTable(const ValueSymbolTable &ST);
void outputTypes(unsigned StartNo);
void outputConstantsInPlane(const std::vector<const Value*> &Plane,
void outputConstantsInPlane(const Value *const*Plane, unsigned PlaneSize,
unsigned StartNo);
void outputConstant(const Constant *CPV);
void outputInlineAsm(const InlineAsm *IA);