Does "+" warn? If so, it probably shouldn't.<div><br></div><div>-eric</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Nov 30, 2012 at 3:18 PM, Bill Wendling <span dir="ltr"><<a href="mailto:isanbard@gmail.com" target="_blank">isanbard@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: void<br>
Date: Fri Nov 30 17:18:12 2012<br>
New Revision: 169054<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=169054&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=169054&view=rev</a><br>
Log:<br>
Don't warn if the input size is less than the register size. Also don't warn if<br>
the output size is greater than the register size. No truncation occurs with<br>
those. Reword warning to make it clearer what's the problem is.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
    cfe/trunk/lib/Basic/Targets.cpp<br>
    cfe/trunk/test/CodeGen/arm-asm-warn.c<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=169054&r1=169053&r2=169054&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=169054&r1=169053&r2=169054&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Nov 30 17:18:12 2012<br>
@@ -5152,7 +5152,8 @@<br>
     "accepted due to -fheinous-gnu-extensions, but clang may remove support "<br>
     "for this in the future">;<br>
   def warn_asm_mismatched_size_modifier : Warning<<br>
-    "the size being stored is truncated, use a modifier to specify the size">,<br>
+    "the value is truncated when put into register, "<br>
+    "use a modifier to specify the size">,<br>
     InGroup<ASMOperandWidths>;<br>
 }<br>
<br>
<br>
Modified: cfe/trunk/lib/Basic/Targets.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=169054&r1=169053&r2=169054&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=169054&r1=169053&r2=169054&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Basic/Targets.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Targets.cpp Fri Nov 30 17:18:12 2012<br>
@@ -3364,6 +3364,8 @@<br>
   virtual bool validateConstraintModifier(StringRef Constraint,<br>
                                           const char Modifier,<br>
                                           unsigned Size) const {<br>
+    bool isOutput = (Constraint[0] == '=');<br>
+<br>
     // Strip off constraint modifiers.<br>
     while (Constraint[0] == '=' ||<br>
            Constraint[0] == '+' ||<br>
@@ -3375,7 +3377,7 @@<br>
     case 'r': {<br>
       switch (Modifier) {<br>
       default:<br>
-        return Size == 32;<br>
+        return (isOutput && Size >= 32) || Size <= 32;<br>
       case 'q':<br>
         // A register of size 32 cannot fit a vector type.<br>
         return false;<br>
<br>
Modified: cfe/trunk/test/CodeGen/arm-asm-warn.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-asm-warn.c?rev=169054&r1=169053&r2=169054&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-asm-warn.c?rev=169054&r1=169053&r2=169054&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/CodeGen/arm-asm-warn.c (original)<br>
+++ cfe/trunk/test/CodeGen/arm-asm-warn.c Fri Nov 30 17:18:12 2012<br>
@@ -1,7 +1,16 @@<br>
 // REQUIRES: arm-registered-target<br>
 // RUN: %clang_cc1 -triple armv7 %s -emit-llvm -o /dev/null<br>
-// <rdar://problem/12284092><br>
<br>
+char bar();<br>
+<br>
+void t1(int x, char y) {<br>
+  __asm__ volatile("mcr p15, 0, %1, c9, c12, 5;"<br>
+                   "mrc p15, 0, %0, c9, c13, 2;"<br>
+                   : "=r" (x)<br>
+                   : "r" (bar())); // no warning<br>
+}<br>
+<br>
+// <rdar://problem/12284092><br>
 typedef __attribute__((neon_vector_type(2))) long long int64x2_t;<br>
 typedef struct int64x2x4_t {<br>
   int64x2_t val[4];<br>
@@ -9,10 +18,10 @@<br>
 int64x2x4_t t2(const long long a[]) {<br>
   int64x2x4_t r;<br>
   __asm__("vldm %[a], { %q[r0], %q[r1], %q[r2], %q[r3] }"<br>
-          : [r0] "=r"(r.val[0]), // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}<br>
-            [r1] "=r"(r.val[1]), // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}<br>
-            [r2] "=r"(r.val[2]), // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}<br>
-            [r3] "=r"(r.val[3])  // expected-warning {{the size being stored is truncated, use a modifier to specify the size}}<br>
+          : [r0] "=r"(r.val[0]), // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}<br>
+            [r1] "=r"(r.val[1]), // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}<br>
+            [r2] "=r"(r.val[2]), // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}<br>
+            [r3] "=r"(r.val[3])  // expected-warning {{the value is truncated when put into register, use a modifier to specify the size}}<br>
           : [a] "r"(a));<br>
   return r;<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>