[llvm-commits] [llvm] r162569 - /llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp

Jakob Stoklund Olesen stoklund at 2pi.dk
Fri Aug 24 10:08:42 PDT 2012


Author: stoklund
Date: Fri Aug 24 12:08:41 2012
New Revision: 162569

URL: http://llvm.org/viewvc/llvm-project?rev=162569&view=rev
Log:
Verify explicit instruction properties when they can be inferred.

It is now allowed to explicitly set hasSideEffects, mayStore, and
mayLoad on instructions with patterns.

Verify that the patterns are consistent with the explicit flags.

Modified:
    llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp

Modified: llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp?rev=162569&r1=162568&r2=162569&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenDAGPatterns.cpp Fri Aug 24 12:08:41 2012
@@ -2457,13 +2457,44 @@
 
 };
 
-static void InferFromPattern(CodeGenInstruction &InstInfo,
+static bool InferFromPattern(CodeGenInstruction &InstInfo,
                              const InstAnalyzer &PatInfo,
                              Record *PatDef) {
+  bool Error = false;
+
   // Remember where InstInfo got its flags.
   if (InstInfo.hasUndefFlags())
       InstInfo.InferredFrom = PatDef;
 
+  // Check explicitly set flags for consistency.
+  if (InstInfo.hasSideEffects != PatInfo.hasSideEffects &&
+      !InstInfo.hasSideEffects_Unset) {
+    // Allow explicitly setting hasSideEffects = 1 on instructions, even when
+    // the pattern has no side effects. That could be useful for div/rem
+    // instructions that may trap.
+    if (!InstInfo.hasSideEffects) {
+      Error = true;
+      PrintError(PatDef->getLoc(), "Pattern doesn't match hasSideEffects = " +
+                 Twine(InstInfo.hasSideEffects));
+    }
+  }
+
+  if (InstInfo.mayStore != PatInfo.mayStore && !InstInfo.mayStore_Unset) {
+    Error = true;
+    PrintError(PatDef->getLoc(), "Pattern doesn't match mayStore = " +
+               Twine(InstInfo.mayStore));
+  }
+
+  if (InstInfo.mayLoad != PatInfo.mayLoad && !InstInfo.mayLoad_Unset) {
+    // Allow explicitly setting mayLoad = 1, even when the pattern has no loads.
+    // Some targets translate imediates to loads.
+    if (!InstInfo.mayLoad) {
+      Error = true;
+      PrintError(PatDef->getLoc(), "Pattern doesn't match mayLoad = " +
+                 Twine(InstInfo.mayLoad));
+    }
+  }
+
   // Transfer inferred flags.
   InstInfo.hasSideEffects |= PatInfo.hasSideEffects;
   InstInfo.mayStore |= PatInfo.mayStore;
@@ -2472,6 +2503,8 @@
   // These flags are silently added without any verification.
   InstInfo.isBitcast |= PatInfo.isBitcast;
   InstInfo.Operands.isVariadic |= PatInfo.isVariadic;
+
+  return Error;
 }
 
 /// hasNullFragReference - Return true if the DAG has any reference to the
@@ -2809,6 +2842,7 @@
 
   // First try to infer flags from the primary instruction pattern, if any.
   SmallVector<CodeGenInstruction*, 8> Revisit;
+  unsigned Errors = 0;
   for (unsigned i = 0, e = Instructions.size(); i != e; ++i) {
     CodeGenInstruction &InstInfo =
       const_cast<CodeGenInstruction &>(*Instructions[i]);
@@ -2829,9 +2863,12 @@
     }
     InstAnalyzer PatInfo(*this);
     PatInfo.Analyze(Pattern);
-    InferFromPattern(InstInfo, PatInfo, InstInfo.TheDef);
+    Errors += InferFromPattern(InstInfo, PatInfo, InstInfo.TheDef);
   }
 
+  if (Errors)
+    throw "pattern conflicts";
+
   // Revisit instructions with undefined flags and no pattern.
   if (Target.guessInstructionProperties()) {
     for (unsigned i = 0, e = Revisit.size(); i != e; ++i) {





More information about the llvm-commits mailing list