Skip to content

Commit 106533f

Browse files
authored
Merge pull request #1383 from undingen/cleanup_bst
move constants into CodeConstants, call BoxedCode destructor, cleanup BST nodes
2 parents 1961ce6 + a256041 commit 106533f

File tree

15 files changed

+256
-488
lines changed

15 files changed

+256
-488
lines changed

src/analysis/type_analysis.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,17 @@ class BasicBlockTypePropagator : public StmtVisitor {
8989
ExprTypeMap& expr_types;
9090
TypeSpeculations& type_speculations;
9191
TypeAnalysis::SpeculationLevel speculation;
92-
const ConstantVRegInfo& constant_vregs;
92+
const CodeConstants& code_constants;
9393

9494
BasicBlockTypePropagator(CFGBlock* block, TypeMap& initial, ExprTypeMap& expr_types,
9595
TypeSpeculations& type_speculations, TypeAnalysis::SpeculationLevel speculation,
96-
const ConstantVRegInfo& constant_vregs)
96+
const CodeConstants& code_constants)
9797
: block(block),
9898
sym_table(initial),
9999
expr_types(expr_types),
100100
type_speculations(type_speculations),
101101
speculation(speculation),
102-
constant_vregs(constant_vregs) {}
102+
code_constants(code_constants) {}
103103

104104
void run() {
105105
for (int i = 0; i < block->body.size(); i++) {
@@ -118,7 +118,7 @@ class BasicBlockTypePropagator : public StmtVisitor {
118118
printf("in propagator, speculating that %s would actually be %s, at ",
119119
old_type->debugName().c_str(), speculated_type->debugName().c_str());
120120
fflush(stdout);
121-
print_bst(node, constant_vregs);
121+
print_bst(node, code_constants);
122122
llvm::outs().flush();
123123
printf("\n");
124124
}
@@ -131,7 +131,7 @@ class BasicBlockTypePropagator : public StmtVisitor {
131131
}
132132

133133
CompilerType* getConstantType(int vreg) {
134-
Box* o = constant_vregs.getConstant(vreg);
134+
Box* o = code_constants.getConstant(vreg);
135135
if (o->cls == int_cls)
136136
return INT;
137137
else if (o->cls == float_cls)
@@ -284,7 +284,7 @@ class BasicBlockTypePropagator : public StmtVisitor {
284284

285285
if (VERBOSITY() >= 2 && func == UNDEF) {
286286
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno);
287-
print_bst(node, constant_vregs);
287+
print_bst(node, code_constants);
288288
printf("\n");
289289
}
290290

@@ -297,7 +297,7 @@ class BasicBlockTypePropagator : public StmtVisitor {
297297

298298
if (VERBOSITY() >= 2 && func == UNDEF) {
299299
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno);
300-
print_bst(node, constant_vregs);
300+
print_bst(node, code_constants);
301301
printf("\n");
302302
}
303303

@@ -399,7 +399,7 @@ class BasicBlockTypePropagator : public StmtVisitor {
399399

400400
if (VERBOSITY() >= 2 && rtn == UNDEF) {
401401
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno);
402-
print_bst(node, constant_vregs);
402+
print_bst(node, code_constants);
403403
printf("\n");
404404
}
405405
_doSet(node->vreg_dst, rtn);
@@ -551,9 +551,9 @@ class BasicBlockTypePropagator : public StmtVisitor {
551551
public:
552552
static TypeMap propagate(CFGBlock* block, const TypeMap& starting, ExprTypeMap& expr_types,
553553
TypeSpeculations& type_speculations, TypeAnalysis::SpeculationLevel speculation,
554-
const ConstantVRegInfo& constant_vregs) {
554+
const CodeConstants& code_constants) {
555555
TypeMap ending = starting;
556-
BasicBlockTypePropagator(block, ending, expr_types, type_speculations, speculation, constant_vregs).run();
556+
BasicBlockTypePropagator(block, ending, expr_types, type_speculations, speculation, code_constants).run();
557557
return ending;
558558
}
559559
};
@@ -632,7 +632,7 @@ class PropagatingTypeAnalysis : public TypeAnalysis {
632632
}
633633

634634
static PropagatingTypeAnalysis* doAnalysis(SpeculationLevel speculation, TypeMap&& initial_types,
635-
CFGBlock* initial_block, const ConstantVRegInfo& constant_vregs) {
635+
CFGBlock* initial_block, const CodeConstants& code_constants) {
636636
Timer _t("PropagatingTypeAnalysis::doAnalysis()");
637637

638638
CFG* cfg = initial_block->cfg;
@@ -673,7 +673,7 @@ class PropagatingTypeAnalysis : public TypeAnalysis {
673673
}
674674

675675
TypeMap ending = BasicBlockTypePropagator::propagate(block, starting_types.find(block)->second, expr_types,
676-
type_speculations, speculation, constant_vregs);
676+
type_speculations, speculation, code_constants);
677677

678678
if (VERBOSITY("types") >= 3) {
679679
printf("before (after):\n");
@@ -730,7 +730,7 @@ class PropagatingTypeAnalysis : public TypeAnalysis {
730730
// public entry point:
731731
TypeAnalysis* doTypeAnalysis(CFG* cfg, const ParamNames& arg_names, const std::vector<ConcreteCompilerType*>& arg_types,
732732
EffortLevel effort, TypeAnalysis::SpeculationLevel speculation,
733-
const ConstantVRegInfo& constant_vregs) {
733+
const CodeConstants& code_constants) {
734734
// if (effort == EffortLevel::INTERPRETED) {
735735
// return new NullTypeAnalysis();
736736
//}
@@ -750,11 +750,11 @@ TypeAnalysis* doTypeAnalysis(CFG* cfg, const ParamNames& arg_names, const std::v
750750
assert(i == arg_types.size());
751751

752752
return PropagatingTypeAnalysis::doAnalysis(speculation, std::move(initial_types), cfg->getStartingBlock(),
753-
constant_vregs);
753+
code_constants);
754754
}
755755

756756
TypeAnalysis* doTypeAnalysis(const OSREntryDescriptor* entry_descriptor, EffortLevel effort,
757-
TypeAnalysis::SpeculationLevel speculation, const ConstantVRegInfo& constant_vregs) {
757+
TypeAnalysis::SpeculationLevel speculation, const CodeConstants& code_constants) {
758758
auto cfg = entry_descriptor->code->source->cfg;
759759
auto&& vreg_info = cfg->getVRegInfo();
760760
TypeMap initial_types(vreg_info.getTotalNumOfVRegs());
@@ -764,6 +764,6 @@ TypeAnalysis* doTypeAnalysis(const OSREntryDescriptor* entry_descriptor, EffortL
764764
}
765765

766766
return PropagatingTypeAnalysis::doAnalysis(speculation, std::move(initial_types),
767-
entry_descriptor->backedge->target, constant_vregs);
767+
entry_descriptor->backedge->target, code_constants);
768768
}
769769
}

src/analysis/type_analysis.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
namespace pyston {
2525

2626
class CFGBlock;
27-
class ConstantVRegInfo;
27+
class CodeConstants;
2828
class BoxedClass;
2929
class BST_stmt_with_dest;
3030
class OSREntryDescriptor;
@@ -45,9 +45,9 @@ class TypeAnalysis {
4545

4646
TypeAnalysis* doTypeAnalysis(CFG* cfg, const ParamNames& param_names,
4747
const std::vector<ConcreteCompilerType*>& arg_types, EffortLevel effort,
48-
TypeAnalysis::SpeculationLevel speculation, const ConstantVRegInfo& constant_vregs);
48+
TypeAnalysis::SpeculationLevel speculation, const CodeConstants& code_constants);
4949
TypeAnalysis* doTypeAnalysis(const OSREntryDescriptor* entry_descriptor, EffortLevel effort,
50-
TypeAnalysis::SpeculationLevel speculation, const ConstantVRegInfo& constant_vregs);
50+
TypeAnalysis::SpeculationLevel speculation, const CodeConstants& code_constants);
5151
}
5252

5353
#endif

src/codegen/ast_interpreter.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ class ASTInterpreter {
181181
BoxedClosure* getPassedClosure() { return frame_info.passed_closure; }
182182
Box** getVRegs() { return vregs; }
183183
const ScopingResults& getScopeInfo() { return scope_info; }
184-
const ConstantVRegInfo& getConstantVRegInfo() { return getCode()->constant_vregs; }
184+
const CodeConstants& getCodeConstants() { return getCode()->code_constants; }
185185

186186
void addSymbol(int vreg, Box* value, bool allow_duplicates);
187187
void setGenerator(Box* gen);
@@ -900,7 +900,7 @@ Value ASTInterpreter::visit_stmt(BST_stmt* node) {
900900

901901
if (0) {
902902
printf("%20s % 2d ", getCode()->name->c_str(), current_block->idx);
903-
print_bst(node, getConstantVRegInfo());
903+
print_bst(node, getCodeConstants());
904904
printf("\n");
905905
}
906906

@@ -1528,7 +1528,7 @@ Value ASTInterpreter::visit_set(BST_Set* node) {
15281528
Value ASTInterpreter::getVReg(int vreg, bool is_kill) {
15291529
assert(vreg != VREG_UNDEFINED);
15301530
if (vreg < 0) {
1531-
Box* o = getConstantVRegInfo().getConstant(vreg);
1531+
Box* o = getCodeConstants().getConstant(vreg);
15321532
return Value(incref(o), jit ? jit->imm(o)->setType(RefType::BORROWED) : NULL);
15331533
}
15341534

@@ -1564,10 +1564,10 @@ Value ASTInterpreter::getVReg(int vreg, bool is_kill) {
15641564
}
15651565

15661566

1567-
current_block->print(getConstantVRegInfo());
1567+
current_block->print(getCodeConstants());
15681568
printf("vreg: %d num cross: %d\n", vreg, getVRegInfo().getNumOfCrossBlockVRegs());
15691569
printf("\n\n");
1570-
current_block->cfg->print(getConstantVRegInfo());
1570+
current_block->cfg->print(getCodeConstants());
15711571

15721572
assert(0);
15731573
return Value();

src/codegen/irgen.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ std::pair<CompiledFunction*, llvm::Function*> doCompile(BoxedCode* code, SourceI
10271027
assert((entry_descriptor != NULL) + (spec != NULL) == 1);
10281028

10291029
if (VERBOSITY("irgen") >= 2)
1030-
source->cfg->print(code->constant_vregs);
1030+
source->cfg->print(code->code_constants);
10311031

10321032
assert(g.cur_module == NULL);
10331033

@@ -1101,10 +1101,10 @@ std::pair<CompiledFunction*, llvm::Function*> doCompile(BoxedCode* code, SourceI
11011101
speculation_level = TypeAnalysis::SOME;
11021102
TypeAnalysis* types;
11031103
if (entry_descriptor)
1104-
types = doTypeAnalysis(entry_descriptor, effort, speculation_level, code->constant_vregs);
1104+
types = doTypeAnalysis(entry_descriptor, effort, speculation_level, code->code_constants);
11051105
else
11061106
types = doTypeAnalysis(source->cfg, *param_names, spec->arg_types, effort, speculation_level,
1107-
code->constant_vregs);
1107+
code->code_constants);
11081108

11091109

11101110
_t2.split();

src/codegen/irgen/hooks.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,9 @@ void BoxedCode::addVersion(void* f, ConcreteCompilerType* rtn_type, const std::v
694694
}
695695

696696
bool BoxedCode::tryDeallocatingTheBJitCode() {
697+
if (code_blocks.empty())
698+
return true;
699+
697700
// we can only delete the code object if we are not executing it currently
698701
assert(bjit_num_inside >= 0);
699702
if (bjit_num_inside != 0) {

src/codegen/irgen/irgenerator.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ IRGenState::IRGenState(BoxedCode* code, CompiledFunction* cf, llvm::Function* fu
6969
IRGenState::~IRGenState() {
7070
}
7171

72+
const CodeConstants& IRGenState::getCodeConstants() {
73+
return code->code_constants;
74+
}
75+
7276
llvm::Value* IRGenState::getPassedClosure() {
7377
assert(getScopeInfo().takesClosure());
7478
assert(passed_closure);
@@ -721,9 +725,9 @@ class IREmitterImpl : public IREmitter {
721725
return rtn;
722726
}
723727

724-
Box* getIntConstant(int64_t n) override { return irstate->getSourceInfo()->parent_module->getIntConstant(n); }
728+
Box* getIntConstant(int64_t n) override { return irstate->getCodeConstants().getIntConstant(n); }
725729

726-
Box* getFloatConstant(double d) override { return irstate->getSourceInfo()->parent_module->getFloatConstant(d); }
730+
Box* getFloatConstant(double d) override { return irstate->getCodeConstants().getFloatConstant(d); }
727731

728732
void refConsumed(llvm::Value* v, llvm::Instruction* inst) override {
729733
irstate->getRefcounts()->refConsumed(v, inst);
@@ -1225,7 +1229,7 @@ class IRGeneratorImpl : public IRGenerator {
12251229
CompilerVariable* evalVReg(int vreg, bool is_kill = true) {
12261230
assert(vreg != VREG_UNDEFINED);
12271231
if (vreg < 0) {
1228-
Box* o = irstate->getCode()->constant_vregs.getConstant(vreg);
1232+
Box* o = irstate->getCode()->code_constants.getConstant(vreg);
12291233
if (o->cls == int_cls) {
12301234
return makeInt(((BoxedInt*)o)->n);
12311235
} else if (o->cls == float_cls) {
@@ -1612,7 +1616,7 @@ class IRGeneratorImpl : public IRGenerator {
16121616
printf("Speculating that %s is actually %s, at ", rtn->getType()->debugName().c_str(),
16131617
speculated_type->debugName().c_str());
16141618
fflush(stdout);
1615-
print_bst(node, irstate->getCode()->constant_vregs);
1619+
print_bst(node, irstate->getCode()->code_constants);
16161620
llvm::outs().flush();
16171621
printf("\n");
16181622
}
@@ -1624,7 +1628,7 @@ class IRGeneratorImpl : public IRGenerator {
16241628
auto source = irstate->getSourceInfo();
16251629
printf("On %s:%d, function %s:\n", irstate->getCode()->filename->c_str(),
16261630
irstate->getCode()->firstlineno, irstate->getCode()->name->c_str());
1627-
irstate->getSourceInfo()->cfg->print(irstate->getCode()->constant_vregs);
1631+
irstate->getSourceInfo()->cfg->print(irstate->getCode()->code_constants);
16281632
}
16291633
RELEASE_ASSERT(!rtn->canConvertTo(speculated_type), "%s %s", rtn->getType()->debugName().c_str(),
16301634
speculated_type->debugName().c_str());

src/codegen/irgen/irgenerator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class IRGenState {
9292

9393
CompiledFunction* getCurFunction() { return cf; }
9494
BoxedCode* getCode() { return code; }
95+
const CodeConstants& getCodeConstants();
9596

9697
ExceptionStyle getExceptionStyle() { return cf->exception_style; }
9798

src/core/bst.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -754,8 +754,8 @@ void BST_MakeSlice::accept_stmt(StmtVisitor* v) {
754754
return v->visit_makeslice(this);
755755
}
756756

757-
void print_bst(BST_stmt* bst, const ConstantVRegInfo& constant_vregs) {
758-
PrintVisitor v(constant_vregs, 0, llvm::outs());
757+
void print_bst(BST_stmt* bst, const CodeConstants& code_constants) {
758+
PrintVisitor v(code_constants, 0, llvm::outs());
759759
bst->accept(&v);
760760
v.flush();
761761
}
@@ -771,7 +771,7 @@ bool PrintVisitor::visit_vreg(int* vreg, bool is_dst) {
771771
if (*vreg != VREG_UNDEFINED) {
772772
stream << "%" << *vreg;
773773
if (*vreg < 0)
774-
stream << "|" << autoDecref(repr(constant_vregs.getConstant(*vreg)))->s() << "|";
774+
stream << "|" << autoDecref(repr(code_constants.getConstant(*vreg)))->s() << "|";
775775
} else
776776
stream << "%undef";
777777

0 commit comments

Comments
 (0)