diff options
author | Chris Lattner <sabre@nondot.org> | 2006-06-20 00:31:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-06-20 00:31:27 +0000 |
commit | 186fb7d131d598c3596204886bd754a47bb268a2 (patch) | |
tree | e09e63b95b53459f4101f11fa158ab2af15e2b8f | |
parent | 30da68acce4f7f8f1ef9f94bc18ee5a1f2364c3c (diff) |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28865 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 5febddaa89..5983fb7c02 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -1568,17 +1568,16 @@ 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 // is considered resolved), but the result knows it needs to be 32- or @@ -1588,6 +1587,13 @@ void DAGISelEmitter::ParsePatterns() { IterateInference |= Result->getOnlyTree()-> 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. { |