Skip to content

Commit c53136b

Browse files
committed
Merge pull request #687 from Trass3r/perfimprovements
first step #539
2 parents 50e1fd1 + 0854c84 commit c53136b

File tree

2 files changed

+39
-37
lines changed

2 files changed

+39
-37
lines changed

ir/irdsymbol.cpp

+28-22
Original file line numberDiff line numberDiff line change
@@ -12,60 +12,66 @@
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;
33+
list.push_back(this);
34+
DModule = s.DModule;
3735
irModule = s.irModule;
38-
irAggr = s.irAggr;
39-
irFunc = s.irFunc;
36+
irAggr = s.irAggr;
37+
irFunc = s.irFunc;
38+
irGlobal = s.irGlobal;
39+
irLocal = s.irLocal;
40+
irField = s.irField;
4041
resolved = s.resolved;
4142
declared = s.declared;
4243
initialized = s.initialized;
43-
defined = s.defined;
44-
irGlobal = s.irGlobal;
45-
irLocal = s.irLocal;
46-
irField = s.irField;
44+
defined = s.defined;
4745
}
4846

4947
IrDsymbol::~IrDsymbol()
5048
{
51-
list.erase(this);
49+
if (this == list.back())
50+
{
51+
list.pop_back();
52+
return;
53+
}
54+
55+
std::vector<IrDsymbol*>::iterator it = std::find(list.rbegin(), list.rend(), this).base();
56+
// base() returns the iterator _after_ the found position
57+
list.erase(--it);
5258
}
5359

5460
void IrDsymbol::reset()
5561
{
56-
DModule = NULL;
62+
DModule = NULL;
5763
irModule = NULL;
58-
irAggr = NULL;
59-
irFunc = NULL;
60-
resolved = declared = initialized = defined = false;
64+
irAggr = NULL;
65+
irFunc = NULL;
6166
irGlobal = NULL;
62-
irLocal = NULL;
63-
irField = NULL;
67+
irLocal = NULL;
68+
irField = NULL;
69+
resolved = declared = initialized = defined = false;
6470
}
6571

6672
bool IrDsymbol::isSet()
6773
{
68-
return (irAggr || irFunc || irGlobal || irLocal || irField);
74+
return irAggr || irFunc || irGlobal || irLocal || irField;
6975
}
7076

7177
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)