Skip to content

Commit e40d630

Browse files
committed
inst combine will run multiple times
1 parent ffd7830 commit e40d630

File tree

2 files changed

+30
-12
lines changed

2 files changed

+30
-12
lines changed

godel-script/godel-frontend/src/ir/inst_combine.cpp

+25-12
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,35 @@ void inst_combine_pass::visit_compare(lir::compare* c) {
8787
}
8888

8989
bool inst_combine_pass::run() {
90-
for(auto impl : ctx->rule_impls) {
91-
scan(impl);
92-
inst_elimination_worker().copy(impl);
90+
for (auto impl : ctx->rule_impls) {
91+
run_on_single_impl(impl);
9392
}
94-
for(auto impl : ctx->database_get_table) {
95-
scan(impl);
96-
inst_elimination_worker().copy(impl);
93+
for (auto impl : ctx->database_get_table) {
94+
run_on_single_impl(impl);
9795
}
98-
for(auto impl : ctx->schema_get_field) {
99-
scan(impl);
100-
inst_elimination_worker().copy(impl);
96+
for (auto impl : ctx->schema_get_field) {
97+
run_on_single_impl(impl);
10198
}
102-
for(auto impl : ctx->schema_data_constraint_impls) {
103-
scan(impl);
104-
inst_elimination_worker().copy(impl);
99+
for (auto impl : ctx->schema_data_constraint_impls) {
100+
run_on_single_impl(impl);
105101
}
106102
return true;
107103
}
108104

105+
void inst_combine_pass::run_on_single_impl(souffle_rule_impl* b) {
106+
auto worker = inst_elimination_worker();
107+
size_t pass_run_count = 0;
108+
const size_t max_pass_run_count = 16;
109+
scan(b);
110+
worker.copy(b);
111+
++ pass_run_count;
112+
while (worker.get_eliminated_count() && pass_run_count < max_pass_run_count) {
113+
scan(b);
114+
worker.copy(b);
115+
++ pass_run_count;
116+
}
117+
}
118+
109119
void inst_combine_pass::scan(souffle_rule_impl* b) {
110120
variable_reference_graph.clear();
111121
b->get_block()->accept(this);
@@ -265,6 +275,7 @@ void inst_elimination_worker::visit_block(lir::block* node) {
265275
for(auto i : node->get_content()) {
266276
// skip eliminated instruction
267277
if (i->get_flag_eliminated()) {
278+
++ eliminated_count;
268279
continue;
269280
}
270281

@@ -338,6 +349,8 @@ void inst_elimination_worker::visit_aggregator(lir::aggregator* node) {
338349
}
339350

340351
void inst_elimination_worker::copy(souffle_rule_impl* impl) {
352+
eliminated_count = 0;
353+
blk.clear();
341354
auto impl_blk = new lir::block(impl->get_block()->get_location());
342355

343356
blk.push_back(impl_blk);

godel-script/godel-frontend/src/ir/inst_combine.h

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class inst_combine_pass: public pass {
2323

2424
private:
2525
void scan(souffle_rule_impl*);
26+
void run_on_single_impl(souffle_rule_impl*);
2627

2728
public:
2829
inst_combine_pass(ir_context& c): pass(pass_kind::ps_inst_combine, c) {}
@@ -65,6 +66,7 @@ class combine_worker: public lir::inst_visitor {
6566
class inst_elimination_worker: public lir::inst_visitor {
6667
private:
6768
std::vector<lir::block*> blk;
69+
size_t eliminated_count = 0;
6870

6971
private:
7072
void visit_boolean(lir::boolean* node) override {
@@ -111,6 +113,9 @@ class inst_elimination_worker: public lir::inst_visitor {
111113

112114
public:
113115
void copy(souffle_rule_impl*);
116+
auto get_eliminated_count() const {
117+
return eliminated_count;
118+
}
114119
};
115120

116121
}

0 commit comments

Comments
 (0)