Fix sanity-checking in 'maskUnsigned' code to be more precise:

use or def-and-use operands can be substituted after one def-only
operand has been substituted.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7674 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve 2003-08-07 15:01:26 +00:00
parent 7d3c5795f9
commit 97a95bdbdd

View File

@ -2859,9 +2859,19 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
unsigned numSubst = 0;
for (unsigned i=0, N=mvec.size(); i < N; ++i) {
// Make sure we substitute all occurrences of dest in these instrs.
// Otherwise, we will have bogus code.
bool someArgsWereIgnored = false;
numSubst += mvec[i]->substituteValue(dest, tmpI, /*defsOnly*/ true,
/*defsAndUses*/ false,
// Make sure not to substitute an upwards-exposed use -- that would
// introduce a use of `tmpI' with no preceding def. Therefore,
// substitute a use or def-and-use operand only if a previous def
// operand has already been substituted (i.e., numSusbt > 0).
//
numSubst += mvec[i]->substituteValue(dest, tmpI,
/*defsOnly*/ numSubst == 0,
/*notDefsAndUses*/ numSubst > 0,
someArgsWereIgnored);
assert(!someArgsWereIgnored &&
"Operand `dest' exists but not replaced: probably bogus!");