Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions src/analysis/type_analysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,17 @@ class BasicBlockTypePropagator : public StmtVisitor {
ExprTypeMap& expr_types;
TypeSpeculations& type_speculations;
TypeAnalysis::SpeculationLevel speculation;
const ConstantVRegInfo& constant_vregs;
const CodeConstants& code_constants;

BasicBlockTypePropagator(CFGBlock* block, TypeMap& initial, ExprTypeMap& expr_types,
TypeSpeculations& type_speculations, TypeAnalysis::SpeculationLevel speculation,
const ConstantVRegInfo& constant_vregs)
const CodeConstants& code_constants)
: block(block),
sym_table(initial),
expr_types(expr_types),
type_speculations(type_speculations),
speculation(speculation),
constant_vregs(constant_vregs) {}
code_constants(code_constants) {}

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

CompilerType* getConstantType(int vreg) {
Box* o = constant_vregs.getConstant(vreg);
Box* o = code_constants.getConstant(vreg);
if (o->cls == int_cls)
return INT;
else if (o->cls == float_cls)
Expand Down Expand Up @@ -284,7 +284,7 @@ class BasicBlockTypePropagator : public StmtVisitor {

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

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

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

Expand Down Expand Up @@ -399,7 +399,7 @@ class BasicBlockTypePropagator : public StmtVisitor {

if (VERBOSITY() >= 2 && rtn == UNDEF) {
printf("Think %s.%s is undefined, at %d\n", t->debugName().c_str(), node->attr.c_str(), node->lineno);
print_bst(node, constant_vregs);
print_bst(node, code_constants);
printf("\n");
}
_doSet(node->vreg_dst, rtn);
Expand Down Expand Up @@ -551,9 +551,9 @@ class BasicBlockTypePropagator : public StmtVisitor {
public:
static TypeMap propagate(CFGBlock* block, const TypeMap& starting, ExprTypeMap& expr_types,
TypeSpeculations& type_speculations, TypeAnalysis::SpeculationLevel speculation,
const ConstantVRegInfo& constant_vregs) {
const CodeConstants& code_constants) {
TypeMap ending = starting;
BasicBlockTypePropagator(block, ending, expr_types, type_speculations, speculation, constant_vregs).run();
BasicBlockTypePropagator(block, ending, expr_types, type_speculations, speculation, code_constants).run();
return ending;
}
};
Expand Down Expand Up @@ -632,7 +632,7 @@ class PropagatingTypeAnalysis : public TypeAnalysis {
}

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

CFG* cfg = initial_block->cfg;
Expand Down Expand Up @@ -673,7 +673,7 @@ class PropagatingTypeAnalysis : public TypeAnalysis {
}

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

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

return PropagatingTypeAnalysis::doAnalysis(speculation, std::move(initial_types), cfg->getStartingBlock(),
constant_vregs);
code_constants);
}

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

return PropagatingTypeAnalysis::doAnalysis(speculation, std::move(initial_types),
entry_descriptor->backedge->target, constant_vregs);
entry_descriptor->backedge->target, code_constants);
}
}
6 changes: 3 additions & 3 deletions src/analysis/type_analysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
namespace pyston {

class CFGBlock;
class ConstantVRegInfo;
class CodeConstants;
class BoxedClass;
class BST_stmt_with_dest;
class OSREntryDescriptor;
Expand All @@ -45,9 +45,9 @@ class TypeAnalysis {

TypeAnalysis* doTypeAnalysis(CFG* cfg, const ParamNames& param_names,
const std::vector<ConcreteCompilerType*>& arg_types, EffortLevel effort,
TypeAnalysis::SpeculationLevel speculation, const ConstantVRegInfo& constant_vregs);
TypeAnalysis::SpeculationLevel speculation, const CodeConstants& code_constants);
TypeAnalysis* doTypeAnalysis(const OSREntryDescriptor* entry_descriptor, EffortLevel effort,
TypeAnalysis::SpeculationLevel speculation, const ConstantVRegInfo& constant_vregs);
TypeAnalysis::SpeculationLevel speculation, const CodeConstants& code_constants);
}

#endif
10 changes: 5 additions & 5 deletions src/codegen/ast_interpreter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ class ASTInterpreter {
BoxedClosure* getPassedClosure() { return frame_info.passed_closure; }
Box** getVRegs() { return vregs; }
const ScopingResults& getScopeInfo() { return scope_info; }
const ConstantVRegInfo& getConstantVRegInfo() { return getCode()->constant_vregs; }
const CodeConstants& getCodeConstants() { return getCode()->code_constants; }

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

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

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

Expand Down Expand Up @@ -1564,10 +1564,10 @@ Value ASTInterpreter::getVReg(int vreg, bool is_kill) {
}


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

assert(0);
return Value();
Expand Down
6 changes: 3 additions & 3 deletions src/codegen/irgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1027,7 +1027,7 @@ std::pair<CompiledFunction*, llvm::Function*> doCompile(BoxedCode* code, SourceI
assert((entry_descriptor != NULL) + (spec != NULL) == 1);

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

assert(g.cur_module == NULL);

Expand Down Expand Up @@ -1101,10 +1101,10 @@ std::pair<CompiledFunction*, llvm::Function*> doCompile(BoxedCode* code, SourceI
speculation_level = TypeAnalysis::SOME;
TypeAnalysis* types;
if (entry_descriptor)
types = doTypeAnalysis(entry_descriptor, effort, speculation_level, code->constant_vregs);
types = doTypeAnalysis(entry_descriptor, effort, speculation_level, code->code_constants);
else
types = doTypeAnalysis(source->cfg, *param_names, spec->arg_types, effort, speculation_level,
code->constant_vregs);
code->code_constants);


_t2.split();
Expand Down
3 changes: 3 additions & 0 deletions src/codegen/irgen/hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -694,6 +694,9 @@ void BoxedCode::addVersion(void* f, ConcreteCompilerType* rtn_type, const std::v
}

bool BoxedCode::tryDeallocatingTheBJitCode() {
if (code_blocks.empty())
return true;

// we can only delete the code object if we are not executing it currently
assert(bjit_num_inside >= 0);
if (bjit_num_inside != 0) {
Expand Down
14 changes: 9 additions & 5 deletions src/codegen/irgen/irgenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,10 @@ IRGenState::IRGenState(BoxedCode* code, CompiledFunction* cf, llvm::Function* fu
IRGenState::~IRGenState() {
}

const CodeConstants& IRGenState::getCodeConstants() {
return code->code_constants;
}

llvm::Value* IRGenState::getPassedClosure() {
assert(getScopeInfo().takesClosure());
assert(passed_closure);
Expand Down Expand Up @@ -721,9 +725,9 @@ class IREmitterImpl : public IREmitter {
return rtn;
}

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

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

void refConsumed(llvm::Value* v, llvm::Instruction* inst) override {
irstate->getRefcounts()->refConsumed(v, inst);
Expand Down Expand Up @@ -1225,7 +1229,7 @@ class IRGeneratorImpl : public IRGenerator {
CompilerVariable* evalVReg(int vreg, bool is_kill = true) {
assert(vreg != VREG_UNDEFINED);
if (vreg < 0) {
Box* o = irstate->getCode()->constant_vregs.getConstant(vreg);
Box* o = irstate->getCode()->code_constants.getConstant(vreg);
if (o->cls == int_cls) {
return makeInt(((BoxedInt*)o)->n);
} else if (o->cls == float_cls) {
Expand Down Expand Up @@ -1612,7 +1616,7 @@ class IRGeneratorImpl : public IRGenerator {
printf("Speculating that %s is actually %s, at ", rtn->getType()->debugName().c_str(),
speculated_type->debugName().c_str());
fflush(stdout);
print_bst(node, irstate->getCode()->constant_vregs);
print_bst(node, irstate->getCode()->code_constants);
llvm::outs().flush();
printf("\n");
}
Expand All @@ -1624,7 +1628,7 @@ class IRGeneratorImpl : public IRGenerator {
auto source = irstate->getSourceInfo();
printf("On %s:%d, function %s:\n", irstate->getCode()->filename->c_str(),
irstate->getCode()->firstlineno, irstate->getCode()->name->c_str());
irstate->getSourceInfo()->cfg->print(irstate->getCode()->constant_vregs);
irstate->getSourceInfo()->cfg->print(irstate->getCode()->code_constants);
}
RELEASE_ASSERT(!rtn->canConvertTo(speculated_type), "%s %s", rtn->getType()->debugName().c_str(),
speculated_type->debugName().c_str());
Expand Down
1 change: 1 addition & 0 deletions src/codegen/irgen/irgenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class IRGenState {

CompiledFunction* getCurFunction() { return cf; }
BoxedCode* getCode() { return code; }
const CodeConstants& getCodeConstants();

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

Expand Down
6 changes: 3 additions & 3 deletions src/core/bst.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -754,8 +754,8 @@ void BST_MakeSlice::accept_stmt(StmtVisitor* v) {
return v->visit_makeslice(this);
}

void print_bst(BST_stmt* bst, const ConstantVRegInfo& constant_vregs) {
PrintVisitor v(constant_vregs, 0, llvm::outs());
void print_bst(BST_stmt* bst, const CodeConstants& code_constants) {
PrintVisitor v(code_constants, 0, llvm::outs());
bst->accept(&v);
v.flush();
}
Expand All @@ -771,7 +771,7 @@ bool PrintVisitor::visit_vreg(int* vreg, bool is_dst) {
if (*vreg != VREG_UNDEFINED) {
stream << "%" << *vreg;
if (*vreg < 0)
stream << "|" << autoDecref(repr(constant_vregs.getConstant(*vreg)))->s() << "|";
stream << "|" << autoDecref(repr(code_constants.getConstant(*vreg)))->s() << "|";
} else
stream << "%undef";

Expand Down
Loading