aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-06-20 00:31:27 +0000
committerChris Lattner <sabre@nondot.org>2006-06-20 00:31:27 +0000
commit186fb7d131d598c3596204886bd754a47bb268a2 (patch)
treee09e63b95b53459f4101f11fa158ab2af15e2b8f
parent30da68acce4f7f8f1ef9f94bc18ee5a1f2364c3c (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.cpp16
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.
{