]> granicus.if.org Git - clang/commitdiff
Don't emit a warning with an input/output parameter. We assume the user knows what...
authorBill Wendling <isanbard@gmail.com>
Fri, 30 Nov 2012 23:46:56 +0000 (23:46 +0000)
committerBill Wendling <isanbard@gmail.com>
Fri, 30 Nov 2012 23:46:56 +0000 (23:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@169059 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp
test/CodeGen/arm-asm-warn.c

index 3c076ca4f039db1409981412b4414aedd0a07927..6a30ca847641bacdecc797a62ceee1abd4af08a8 100644 (file)
@@ -3365,6 +3365,7 @@ public:
                                           const char Modifier,
                                           unsigned Size) const {
     bool isOutput = (Constraint[0] == '=');
+    bool isInOut = (Constraint[0] == '+');
 
     // Strip off constraint modifiers.
     while (Constraint[0] == '=' ||
@@ -3377,7 +3378,8 @@ public:
     case 'r': {
       switch (Modifier) {
       default:
-        return (isOutput && Size >= 32) || Size <= 32;
+        return isInOut || (isOutput && Size >= 32) ||
+          (!isOutput && !isInOut && Size <= 32);
       case 'q':
         // A register of size 32 cannot fit a vector type.
         return false;
index 38d5345cbdc868aac73af501d0974f4d578c0a6e..9b52dd695a518ca968bb45c1dad31463cdd9a79d 100644 (file)
@@ -8,6 +8,10 @@ void t1(int x, char y) {
                    "mrc p15, 0, %0, c9, c13, 2;"
                    : "=r" (x)
                    : "r" (bar())); // no warning
+  __asm__ volatile("foo %0, %1"
+                   : "+r" (x),
+                     "+r" (y)
+                   :);
 }
 
 // <rdar://problem/12284092>