<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2014-07-04 1:07 GMT-07:00 David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi rsmith, rnk,<br>
<br>
An array showing up in an inline assembly input is accepted in ICC and<br>
GCC 4.8<br>
<br>
This fixes PR20201.<br>
<br>
<a href="http://reviews.llvm.org/D4382" target="_blank">http://reviews.llvm.org/D4382</a><br>
<br>
Files:<br>
  lib/CodeGen/CGExpr.cpp<br>
  test/CodeGen/asm.c<br>
  test/CodeGen/x86-64-inline-asm.c<br>
<br>
Index: lib/CodeGen/CGExpr.cpp<br>
===================================================================<br>
--- lib/CodeGen/CGExpr.cpp<br>
+++ lib/CodeGen/CGExpr.cpp<br>
@@ -2781,7 +2781,6 @@<br>
   switch (E->getCastKind()) {<br>
   case CK_ToVoid:<br>
   case CK_BitCast:<br>
-  case CK_ArrayToPointerDecay:<br></blockquote><div><br></div><div>As discussed in person, I think this is addressing the symptom rather than the cause. A memory operand expects an lvalue, and we're incorrectly performing an lvalue-to-rvalue conversion on it in Sema.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   case CK_FunctionToPointerDecay:<br>
   case CK_NullToMemberPointer:<br>
   case CK_NullToPointer:<br>
@@ -2836,6 +2835,7 @@<br>
     return MakeAddrLValue(EmitDynamicCast(V, DCE), E->getType());<br>
   }<br>
<br>
+  case CK_ArrayToPointerDecay:<br>
   case CK_ConstructorConversion:<br>
   case CK_UserDefinedConversion:<br>
   case CK_CPointerToObjCPointerCast:<br>
Index: test/CodeGen/asm.c<br>
===================================================================<br>
--- test/CodeGen/asm.c<br>
+++ test/CodeGen/asm.c<br>
@@ -239,3 +239,12 @@<br>
 // CHECK: call void asm sideeffect "/* $0 */", "i|r,~{dirflag},~{fpsr},~{flags}"(i32 1)<br>
 }<br>
<br>
+static unsigned t29_var[1];<br>
+<br>
+void t29(void) {<br>
+  asm volatile("movl %%eax, %0"<br>
+               :<br>
+               : "m"(t29_var));<br>
+  // CHECK: @t29<br>
+  // CHECK: call void asm sideeffect "movl %eax, $0", "*m,~{dirflag},~{fpsr},~{flags}"([1 x i32]* @t29_var)<br>
+}<br>
Index: test/CodeGen/x86-64-inline-asm.c<br>
===================================================================<br>
--- test/CodeGen/x86-64-inline-asm.c<br>
+++ test/CodeGen/x86-64-inline-asm.c<br>
@@ -10,3 +10,8 @@<br>
 // expected-error@-5 {{scale factor without index register is ignored}}<br>
 #endif<br>
 }<br>
+<br>
+static unsigned var[1] = {};<br>
+void g(void) { asm volatile("movd %%xmm0, %0"<br>
+                            :<br>
+                            : "m"(var)); }<br>
</blockquote></div><br></div></div>