[PATCH] CodeGen: Let arrays be inputs to inline asm

Richard Smith richard at metafoo.co.uk
Mon Jul 7 16:31:24 PDT 2014


2014-07-04 1:07 GMT-07:00 David Majnemer <david.majnemer at gmail.com>:

> Hi rsmith, rnk,
>
> An array showing up in an inline assembly input is accepted in ICC and
> GCC 4.8
>
> This fixes PR20201.
>
> http://reviews.llvm.org/D4382
>
> Files:
>   lib/CodeGen/CGExpr.cpp
>   test/CodeGen/asm.c
>   test/CodeGen/x86-64-inline-asm.c
>
> Index: lib/CodeGen/CGExpr.cpp
> ===================================================================
> --- lib/CodeGen/CGExpr.cpp
> +++ lib/CodeGen/CGExpr.cpp
> @@ -2781,7 +2781,6 @@
>    switch (E->getCastKind()) {
>    case CK_ToVoid:
>    case CK_BitCast:
> -  case CK_ArrayToPointerDecay:
>

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.


>    case CK_FunctionToPointerDecay:
>    case CK_NullToMemberPointer:
>    case CK_NullToPointer:
> @@ -2836,6 +2835,7 @@
>      return MakeAddrLValue(EmitDynamicCast(V, DCE), E->getType());
>    }
>
> +  case CK_ArrayToPointerDecay:
>    case CK_ConstructorConversion:
>    case CK_UserDefinedConversion:
>    case CK_CPointerToObjCPointerCast:
> Index: test/CodeGen/asm.c
> ===================================================================
> --- test/CodeGen/asm.c
> +++ test/CodeGen/asm.c
> @@ -239,3 +239,12 @@
>  // CHECK: call void asm sideeffect "/* $0 */",
> "i|r,~{dirflag},~{fpsr},~{flags}"(i32 1)
>  }
>
> +static unsigned t29_var[1];
> +
> +void t29(void) {
> +  asm volatile("movl %%eax, %0"
> +               :
> +               : "m"(t29_var));
> +  // CHECK: @t29
> +  // CHECK: call void asm sideeffect "movl %eax, $0",
> "*m,~{dirflag},~{fpsr},~{flags}"([1 x i32]* @t29_var)
> +}
> Index: test/CodeGen/x86-64-inline-asm.c
> ===================================================================
> --- test/CodeGen/x86-64-inline-asm.c
> +++ test/CodeGen/x86-64-inline-asm.c
> @@ -10,3 +10,8 @@
>  // expected-error at -5 {{scale factor without index register is ignored}}
>  #endif
>  }
> +
> +static unsigned var[1] = {};
> +void g(void) { asm volatile("movd %%xmm0, %0"
> +                            :
> +                            : "m"(var)); }
>

http://reviews.llvm.org/D4382






More information about the cfe-commits mailing list