LSQ: Only trigger a memory violation with a load/load if the value changes.
authorAli Saidi <saidi@eecs.umich.edu>
Tue, 13 Sep 2011 16:58:08 +0000 (12:58 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Tue, 13 Sep 2011 16:58:08 +0000 (12:58 -0400)
commit649c239ceef2d107fae253b1008c6f214f242d73
tree06edeb7bfa7b9d1e9167b9cb80f7f9600d41b9a0
parentbb921b1459ef3ec55f9cea4ac8d203cd3c801cfd
LSQ: Only trigger a memory  violation with a load/load if the value changes.

Only create a memory ordering violation when the value could have changed
between two subsequent loads, instead of just when loads go out-of-order
to the same address. While not very common in the case of Alpha, with
an architecture with a hardware table walker this can happen reasonably
frequently beacuse a translation will miss and start a table walk and
before the CPU re-schedules the faulting instruction another one will
pass it to the same address (or cache block depending on the dendency
checking).

This patch has been tested with a couple of self-checking hand crafted
programs to stress ordering between two cores.

The performance improvement on SPEC benchmarks can be substantial (2-10%).
src/arch/arm/faults.cc
src/arch/arm/faults.hh
src/cpu/base_dyn_inst.hh
src/cpu/base_dyn_inst_impl.hh
src/cpu/o3/lsq_impl.hh
src/cpu/o3/lsq_unit.hh
src/cpu/o3/lsq_unit_impl.hh
src/sim/faults.cc
src/sim/faults.hh