From a2a6880743d7370a6425593f22d9e98317bfc3b2 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 8 Nov 2019 16:36:11 +0100 Subject: [PATCH] aco: fix invalid access on Pseudo_instructions Fixes: 93c8ebfa780ebd1495095e794731881aef29e7d3 aco: Initial commit of independent AMD compiler Reviewed-by: Rhys Perry --- src/amd/compiler/aco_register_allocation.cpp | 10 +++++++++- src/amd/compiler/aco_spill.cpp | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/amd/compiler/aco_register_allocation.cpp b/src/amd/compiler/aco_register_allocation.cpp index 9e3d796dc2f..3b4100cddd2 100644 --- a/src/amd/compiler/aco_register_allocation.cpp +++ b/src/amd/compiler/aco_register_allocation.cpp @@ -881,7 +881,15 @@ void handle_pseudo(ra_ctx& ctx, break; } } - if (!writes_sgpr) + /* if all operands are constant, no need to care either */ + bool reads_sgpr = false; + for (Operand& op : instr->operands) { + if (op.isTemp() && op.getTemp().type() == RegType::sgpr) { + reads_sgpr = true; + break; + } + } + if (!(writes_sgpr && reads_sgpr)) return; Pseudo_instruction *pi = (Pseudo_instruction *)instr; diff --git a/src/amd/compiler/aco_spill.cpp b/src/amd/compiler/aco_spill.cpp index 276dcbd7c5b..952094f40d0 100644 --- a/src/amd/compiler/aco_spill.cpp +++ b/src/amd/compiler/aco_spill.cpp @@ -265,7 +265,7 @@ aco_ptr do_reload(spill_ctx& ctx, Temp tmp, Temp new_name, uint32_t } else if (instr->format == Format::SOP1) { res.reset(create_instruction(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size())); } else if (instr->format == Format::PSEUDO) { - res.reset(create_instruction(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size())); + res.reset(create_instruction(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size())); } for (unsigned i = 0; i < instr->operands.size(); i++) { res->operands[i] = instr->operands[i]; -- 2.30.2