From: Vadim Girlin Date: Tue, 23 Apr 2013 06:34:42 +0000 (+0400) Subject: r600g/sb: improve error checking in ra_coalesce pass X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6d6c8c88a38ccdd453d2ad184e58b3eb35230a5a;p=mesa.git r600g/sb: improve error checking in ra_coalesce pass --- diff --git a/src/gallium/drivers/r600/sb/sb_ra_coalesce.cpp b/src/gallium/drivers/r600/sb/sb_ra_coalesce.cpp index 52e76687b95..cec4bbc74de 100644 --- a/src/gallium/drivers/r600/sb/sb_ra_coalesce.cpp +++ b/src/gallium/drivers/r600/sb/sb_ra_coalesce.cpp @@ -40,10 +40,7 @@ namespace r600_sb { using std::cerr; int ra_coalesce::run() { - - sh.coal.run(); - - return 0; + return sh.coal.run(); } void coalescer::add_edge(value* a, value* b, unsigned cost) { @@ -417,7 +414,9 @@ coalescer::~coalescer() { } } -void coalescer::run() { +int coalescer::run() { + int r; + RA_DUMP( dump_edges(); ); build_chunks(); @@ -426,10 +425,13 @@ void coalescer::run() { build_constraint_queue(); RA_DUMP( dump_constraint_queue(); ); - color_constraints(); + if ((r = color_constraints())) + return r; build_chunk_queue(); color_chunks(); + + return 0; } void coalescer::color_phi_constraint(ra_constraint* c) { @@ -457,7 +459,7 @@ ra_chunk* coalescer::detach_value(value *v) { } -void coalescer::color_reg_constraint(ra_constraint *c) { +int coalescer::color_reg_constraint(ra_constraint *c) { unsigned k, cnt = c->values.size(); vvec & cv = c->values; @@ -558,6 +560,11 @@ void coalescer::color_reg_constraint(ra_constraint *c) { } while (std::next_permutation(swz, swz + 4)); + if (!done && pass) { + cerr << "sb: ra_coalesce - out of registers\n"; + return -1; + } + if (pass == 0 && done) break; @@ -585,9 +592,13 @@ void coalescer::color_reg_constraint(ra_constraint *c) { color_chunk(cc, color); cc->fix(); } + + return 0; } -void coalescer::color_constraints() { +int coalescer::color_constraints() { + int r; + for (constraint_queue::iterator I = constraints.begin(), E = constraints.end(); I != E; ++I) { @@ -598,11 +609,13 @@ void coalescer::color_constraints() { dump_constraint(c); ); - if (c->kind == CK_SAME_REG) - color_reg_constraint(c); - else if (c->kind == CK_PHI) + if (c->kind == CK_SAME_REG) { + if ((r = color_reg_constraint(c))) + return r; + } else if (c->kind == CK_PHI) color_phi_constraint(c); } + return 0; } } // namespace r600_sb diff --git a/src/gallium/drivers/r600/sb/sb_shader.h b/src/gallium/drivers/r600/sb/sb_shader.h index 5531fdaa092..039d1fa5c84 100644 --- a/src/gallium/drivers/r600/sb/sb_shader.h +++ b/src/gallium/drivers/r600/sb/sb_shader.h @@ -192,13 +192,13 @@ public: coalescer(shader &sh) : sh(sh), edges(), chunks(), constraints() {} ~coalescer(); - void run(); + int run(); void add_edge(value *a, value *b, unsigned cost); void build_chunks(); void build_constraint_queue(); void build_chunk_queue(); - void color_constraints(); + int color_constraints(); void color_chunks(); ra_constraint* create_constraint(constraint_kind kind); @@ -223,7 +223,7 @@ private: void unify_chunks(ra_edge *e); bool chunks_interference(ra_chunk *c1, ra_chunk *c2); - void color_reg_constraint(ra_constraint *c); + int color_reg_constraint(ra_constraint *c); void color_phi_constraint(ra_constraint *c);