Don't require src/dst patterns to be able to fully resolve their types,

because information about one can help refine the other.  This allows us to
write:

def : Pat<(i32 (extload xaddr:$src, i8)),
          (LBZX xaddr:$src)>;

as:

def : Pat<(extload xaddr:$src, i8),
          (LBZX xaddr:$src)>;

because tblgen knows LBZX returns i32.

llvm-svn: 28865
This commit is contained in:
Chris Lattner 2006-06-20 00:31:27 +00:00
parent dbec49d574
commit c23e641055
1 changed files with 11 additions and 5 deletions

View File

@ -1568,16 +1568,15 @@ void DAGISelEmitter::ParsePatterns() {
"with temporaries yet!");
bool IterateInference;
bool InferredAllPatternTypes, InferredAllResultTypes;
do {
// Infer as many types as possible. If we cannot infer all of them, we
// can never do anything with this pattern: report it to the user.
if (!Pattern->InferAllTypes())
Pattern->error("Could not infer all types in pattern!");
InferredAllPatternTypes = Pattern->InferAllTypes();
// Infer as many types as possible. If we cannot infer all of them, we can
// never do anything with this pattern: report it to the user.
if (!Result->InferAllTypes())
Result->error("Could not infer all types in pattern result!");
InferredAllResultTypes = Result->InferAllTypes();
// Apply the type of the result to the source pattern. This helps us
// resolve cases where the input type is known to be a pointer type (which
@ -1589,6 +1588,13 @@ void DAGISelEmitter::ParsePatterns() {
UpdateNodeType(Pattern->getOnlyTree()->getExtTypes(), *Result);
} while (IterateInference);
// Verify that we inferred enough types that we can do something with the
// pattern and result. If these fire the user has to add type casts.
if (!InferredAllPatternTypes)
Pattern->error("Could not infer all types in pattern!");
if (!InferredAllResultTypes)
Result->error("Could not infer all types in pattern result!");
// Validate that the input pattern is correct.
{
std::map<std::string, TreePatternNode*> InstInputs;