From: Julian Seward Date: Sat, 22 Oct 2005 12:46:06 +0000 (+0000) Subject: Remove inefficient and not-completely-general logic in addHRegUse and X-Git-Tag: svn/VALGRIND_3_1_1^2~68 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d8cf652994787264818dfd302707ed2fd664eaf5;p=thirdparty%2Fvalgrind.git Remove inefficient and not-completely-general logic in addHRegUse and replace with something general and simpler. git-svn-id: svn://svn.valgrind.org/vex/trunk@1423 --- diff --git a/VEX/priv/host-generic/h_generic_regs.c b/VEX/priv/host-generic/h_generic_regs.c index 0388c6bc5a..b0d58b627a 100644 --- a/VEX/priv/host-generic/h_generic_regs.c +++ b/VEX/priv/host-generic/h_generic_regs.c @@ -122,15 +122,21 @@ void addHRegUse ( HRegUsage* tab, HRegMode mode, HReg reg ) tab->n_used++; } else { /* Found: combine or ignore. */ - if (tab->mode[i] == mode) - return; /* duplicate, ignore */ - if (mode == HRmModify) { + /* This is a greatest-lower-bound operation in the poset: + + R W + \ / + M + + Need to do: tab->mode[i] = GLB(tab->mode, mode). In this + case very simple -- if tab->mode[i] != mode then result must + be M. + */ + if (tab->mode[i] == mode) { + /* duplicate, ignore */ + } else { tab->mode[i] = HRmModify; - return; /* modify mode makes previous mode irrelevant */ } - vassert( (mode == HRmRead && tab->mode[i] == HRmWrite) - || (mode == HRmWrite && tab->mode[i] == HRmRead) ); - tab->mode[i] = HRmModify; } }