mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-01 01:00:10 +01:00
r600g/sb: fix issues with loops created for switch
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
34e512d9ea
commit
de0fd375f6
5 changed files with 16 additions and 4 deletions
|
|
@ -110,6 +110,8 @@ int bc_finalizer::run() {
|
|||
|
||||
void bc_finalizer::finalize_loop(region_node* r) {
|
||||
|
||||
update_nstack(r);
|
||||
|
||||
cf_node *loop_start = sh.create_cf(CF_OP_LOOP_START_DX10);
|
||||
cf_node *loop_end = sh.create_cf(CF_OP_LOOP_END);
|
||||
|
||||
|
|
|
|||
|
|
@ -758,6 +758,8 @@ int bc_parser::prepare_loop(cf_node* c) {
|
|||
c->insert_before(reg);
|
||||
rep->move(c, end->next);
|
||||
|
||||
reg->src_loop = true;
|
||||
|
||||
loop_stack.push(reg);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -115,13 +115,13 @@ void if_conversion::convert_kill_instructions(region_node *r,
|
|||
bool if_conversion::check_and_convert(region_node *r) {
|
||||
|
||||
depart_node *nd1 = static_cast<depart_node*>(r->first);
|
||||
if (!nd1->is_depart())
|
||||
if (!nd1->is_depart() || nd1->target != r)
|
||||
return false;
|
||||
if_node *nif = static_cast<if_node*>(nd1->first);
|
||||
if (!nif->is_if())
|
||||
return false;
|
||||
depart_node *nd2 = static_cast<depart_node*>(nif->first);
|
||||
if (!nd2->is_depart())
|
||||
if (!nd2->is_depart() || nd2->target != r)
|
||||
return false;
|
||||
|
||||
value* &em = nif->cond;
|
||||
|
|
|
|||
|
|
@ -1089,7 +1089,8 @@ typedef std::vector<repeat_node*> repeat_vec;
|
|||
class region_node : public container_node {
|
||||
protected:
|
||||
region_node(unsigned id) : container_node(NT_REGION, NST_LIST), region_id(id),
|
||||
loop_phi(), phi(), vars_defined(), departs(), repeats() {}
|
||||
loop_phi(), phi(), vars_defined(), departs(), repeats(), src_loop()
|
||||
{}
|
||||
public:
|
||||
unsigned region_id;
|
||||
|
||||
|
|
@ -1101,12 +1102,16 @@ public:
|
|||
depart_vec departs;
|
||||
repeat_vec repeats;
|
||||
|
||||
// true if region was created for loop in the parser, sometimes repeat_node
|
||||
// may be optimized away so we need to remember this information
|
||||
bool src_loop;
|
||||
|
||||
virtual bool accept(vpass &p, bool enter);
|
||||
|
||||
unsigned dep_count() { return departs.size(); }
|
||||
unsigned rep_count() { return repeats.size() + 1; }
|
||||
|
||||
bool is_loop() { return !repeats.empty(); }
|
||||
bool is_loop() { return src_loop || !repeats.empty(); }
|
||||
|
||||
container_node* get_entry_code_location() {
|
||||
node *p = first;
|
||||
|
|
|
|||
|
|
@ -1527,6 +1527,9 @@ bool post_scheduler::check_copy(node *n) {
|
|||
|
||||
if (!s->is_prealloc()) {
|
||||
recolor_local(s);
|
||||
|
||||
if (!s->chunk || s->chunk != d->chunk)
|
||||
return false;
|
||||
}
|
||||
|
||||
if (s->gpr == d->gpr) {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue