Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit d3a4c18

Browse files
committedJul 28, 2014
WIP ldc-developers#539 resetAll made up several percent running time for phobos
1 parent f937750 commit d3a4c18

File tree

2 files changed

+27
-43
lines changed

2 files changed

+27
-43
lines changed
 

‎ir/irdsymbol.cpp

+16-28
Original file line numberDiff line numberDiff line change
@@ -12,60 +12,48 @@
1212
#include "ir/irdsymbol.h"
1313
#include "ir/irvar.h"
1414

15-
std::set<IrDsymbol*> IrDsymbol::list;
15+
std::vector<IrDsymbol*> IrDsymbol::list;
1616

1717
void IrDsymbol::resetAll()
1818
{
1919
Logger::println("resetting %zu Dsymbols", list.size());
20-
std::set<IrDsymbol*>::iterator it;
21-
for(it = list.begin(); it != list.end(); ++it)
20+
21+
for (std::vector<IrDsymbol*>::iterator it = list.begin(), end = list.end(); it != end; ++it)
2222
(*it)->reset();
2323
}
2424

2525
IrDsymbol::IrDsymbol()
2626
{
27-
bool incr = list.insert(this).second;
28-
assert(incr);
27+
list.push_back(this);
2928
reset();
3029
}
3130

3231
IrDsymbol::IrDsymbol(const IrDsymbol& s)
3332
{
34-
bool incr = list.insert(this).second;
35-
assert(incr);
36-
DModule = s.DModule;
37-
irModule = s.irModule;
38-
irAggr = s.irAggr;
39-
irFunc = s.irFunc;
40-
resolved = s.resolved;
41-
declared = s.declared;
42-
initialized = s.initialized;
43-
defined = s.defined;
44-
irGlobal = s.irGlobal;
45-
irLocal = s.irLocal;
46-
irField = s.irField;
33+
list.push_back(this);
34+
memcpy(this, &s, sizeof(IrDsymbol));
4735
}
4836

4937
IrDsymbol::~IrDsymbol()
5038
{
51-
list.erase(this);
39+
if (this == list.back())
40+
{
41+
list.pop_back();
42+
return;
43+
}
44+
45+
std::vector<IrDsymbol*>::iterator it = std::find(list.rbegin(), list.rend(), this).base();
46+
list.erase(it);
5247
}
5348

5449
void IrDsymbol::reset()
5550
{
56-
DModule = NULL;
57-
irModule = NULL;
58-
irAggr = NULL;
59-
irFunc = NULL;
60-
resolved = declared = initialized = defined = false;
61-
irGlobal = NULL;
62-
irLocal = NULL;
63-
irField = NULL;
51+
memset(this, 0, sizeof(IrDsymbol));
6452
}
6553

6654
bool IrDsymbol::isSet()
6755
{
68-
return (irAggr || irFunc || irGlobal || irLocal || irField);
56+
return (size_t)irAggr | (size_t)irFunc | (size_t)irGlobal | (size_t)irLocal | (size_t)irField;
6957
}
7058

7159
IrVar* IrDsymbol::getIrVar()

‎ir/irdsymbol.h

+11-15
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#ifndef LDC_IR_IRDSYMBOL_H
1515
#define LDC_IR_IRDSYMBOL_H
1616

17-
#include <set>
17+
#include <vector>
1818

1919
struct IrModule;
2020
struct IrFunction;
@@ -33,7 +33,7 @@ namespace llvm {
3333

3434
struct IrDsymbol
3535
{
36-
static std::set<IrDsymbol*> list;
36+
static std::vector<IrDsymbol*> list;
3737
static void resetAll();
3838

3939
// overload all of these to make sure
@@ -44,25 +44,21 @@ struct IrDsymbol
4444

4545
void reset();
4646

47-
Module* DModule;
48-
49-
bool resolved;
50-
bool declared;
51-
bool initialized;
52-
bool defined;
53-
54-
IrModule* irModule;
55-
56-
IrAggr* irAggr;
57-
47+
Module* DModule;
48+
IrModule* irModule;
49+
IrAggr* irAggr;
5850
IrFunction* irFunc;
59-
60-
IrGlobal* irGlobal;
51+
IrGlobal* irGlobal;
6152
union {
6253
IrLocal* irLocal;
6354
IrParameter *irParam;
6455
};
6556
IrField* irField;
57+
bool resolved;
58+
bool declared;
59+
bool initialized;
60+
bool defined;
61+
6662
IrVar* getIrVar();
6763
llvm::Value*& getIrValue();
6864

0 commit comments

Comments
 (0)
Please sign in to comment.