diff --git a/lib/VMCore/InlineAsm.cpp b/lib/VMCore/InlineAsm.cpp
index cdb8c46e95f..b36d2128a61 100644
--- a/lib/VMCore/InlineAsm.cpp
+++ b/lib/VMCore/InlineAsm.cpp
@@ -51,6 +51,7 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str,
   isEarlyClobber = false;
   isIndirectOutput = false;
   hasMatchingInput = false;
+  isCommutative = false;
   
   // Parse the prefix.
   if (*I == '~') {
@@ -74,12 +75,21 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str,
     default:
       DoneWithModifiers = true;
       break;
-    case '&':
+    case '&':     // Early clobber.
       if (Type != isOutput ||      // Cannot early clobber anything but output.
           isEarlyClobber)          // Reject &&&&&&
         return true;
       isEarlyClobber = true;
       break;
+    case '%':     // Commutative.
+      if (Type == isClobber ||     // Cannot commute clobbers.
+          isCommutative)           // Reject %%%%%
+        return true;
+      isCommutative = true;
+      break;
+    case '#':     // Comment.
+    case '*':     // Register preferencing.
+      return true;     // Not supported.
     }
     
     if (!DoneWithModifiers) {