summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAaron M Barnes <[email protected]>2022-04-06 10:14:13 -0400
committerAaron M Barnes <[email protected]>2022-04-06 10:14:13 -0400
commitc9cc0a013e867a4df04e674a86b7fd91c0116eab (patch)
tree460acf1b1bdc29ced33d00de20763ce639e2a571 /src
parent371340d2bbe0cad6613e4ebf2bd321c7e93c63cd (diff)
fix duplicate regfile accesses within same instruction
Diffstat (limited to 'src')
-rw-r--r--src/gpgpu-sim/shader.cc9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gpgpu-sim/shader.cc b/src/gpgpu-sim/shader.cc
index 814311d..ad9278c 100644
--- a/src/gpgpu-sim/shader.cc
+++ b/src/gpgpu-sim/shader.cc
@@ -4241,12 +4241,19 @@ bool opndcoll_rfu_t::collector_unit_t::allocate(register_set *pipeline_reg_set,
warp_inst_t **pipeline_reg = pipeline_reg_set->get_ready();
if ((pipeline_reg) and !((*pipeline_reg)->empty())) {
m_warp_id = (*pipeline_reg)->warp_id();
+ std::vector<int> prev_regs; // remove duplicate regs within same instr
for (unsigned op = 0; op < MAX_REG_OPERANDS; op++) {
int reg_num =
(*pipeline_reg)
->arch_reg.src[op]; // this math needs to match that used in
// function_info::ptx_decode_inst
- if (reg_num >= 0) { // valid register
+ bool new_reg = true;
+ for (auto r : prev_regs) {
+ if (r == reg_num)
+ new_reg = false;
+ }
+ if (reg_num >= 0 && new_reg) { // valid register
+ prev_regs.push_back(reg_num);
m_src_op[op] = op_t(this, op, reg_num, m_num_banks, m_bank_warp_shift,
m_sub_core_model, m_num_banks_per_sched,
(*pipeline_reg)->get_schd_id());