<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Yeah, that fixed it. Thanks<div><br></div><div>-Juergen<br><div><div><br></div><div><br></div><div>On Feb 19, 2014, at 4:32 PM, Warren Hunt <<a href="mailto:whunt@google.com">whunt@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">Yeah, these are addressed in: <span style="font-size:18px">r201734</span><div><br></div><div>Sorry about that,</div><div><span class="" tabindex="-1">-Warren</span></div></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On Wed, Feb 19, 2014 at 4:07 PM, Juergen Ributzka <span dir="ltr"><<a href="mailto:juergen@apple.com" target="_blank">juergen@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Warren,<br>
<br>
this is failing on our build bots with:<br>
******************** TEST 'Clang :: CodeGen/ms-builtins.c' FAILED ********************<br>
Script:<br>
--<br>
Release/bin/clang -cc1 -internal-isystem /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/BuildRecords/clang-9999.99_install/Objects/x86_64/Release/bin/../lib/clang/6.0/include -triple=i686-unknown-unknown -fms-extensions -emit-llvm -o - /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c | FileCheck /Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c<br>

--<br>
Exit Code: 1<br>
<br>
Command Output (stderr):<br>
--<br>
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c:3:13: warning: incompatible redeclaration of library function 'printf'<br>

extern void printf(const char*, ...);<br>
            ^<br>
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c:3:13: note: 'printf' is a builtin with type 'int (const char *, ...)'<br>

1 warning generated.<br>
/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c:15:11: error: expected string not found in input<br>
<div class="">// CHECK: call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1)<br>
</div>          ^<br>
<stdin>:1:1: note: scanning from here<br>
; ModuleID = '/Users/buildslave/zorg/buildbot/smooshlab/slave-0.8/build.apple-clang-nobootstrap-R_master/clang.roots/Sources/clang/src/tools/clang/test/CodeGen/ms-builtins.c'<br>
^<br>
<stdin>:13:2: note: possible intended match here<br>
 call void @llvm.prefetch(i8* %4, i32 0, i32 0, i32 1)<br>
 ^<br>
<br>
Could you please take a look?<br>
<br>
Thanks<br>
<br>
Cheers,<br>
Juergen<br>
<div class="HOEnZb"><div class="h5"><br>
On Feb 19, 2014, at 3:20 PM, Warren Hunt <<a href="mailto:whunt@google.com">whunt@google.com</a>> wrote:<br>
<br>
> Author: whunt<br>
> Date: Wed Feb 19 17:20:20 2014<br>
> New Revision: 201734<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=201734&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=201734&view=rev</a><br>
> Log:<br>
> Add _mm_prefetch and some others as MS builtins<br>
><br>
> This patch adds several built-ins that are required for ms<br>
> compatibility. _mm_prefetch must be a built-in because it takes a<br>
> compile-time constant argument and our prior approach of using a #define<br>
> to the current built-in doesn't work in the presence of re-declaration<br>
> of _mm_prefetch. The others can be obtained by including the windows<br>
> system headers. If a user includes the windows system headers but not<br>
> intrin.h they still need to work and therefore must be built-in because<br>
> we don't get a chance to implement them in intrin.h in this case.<br>
><br>
><br>
> Added:<br>
>    cfe/trunk/test/CodeGen/ms-builtins.c<br>
>    cfe/trunk/test/Headers/mmprefetch.c<br>
> Modified:<br>
>    cfe/trunk/include/clang/Basic/Builtins.def<br>
>    cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
>    cfe/trunk/include/clang/Sema/Sema.h<br>
>    cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
>    cfe/trunk/lib/Headers/Intrin.h<br>
>    cfe/trunk/lib/Headers/xmmintrin.h<br>
>    cfe/trunk/lib/Sema/SemaChecking.cpp<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/Builtins.def<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Basic/Builtins.def (original)<br>
> +++ cfe/trunk/include/clang/Basic/Builtins.def Wed Feb 19 17:20:20 2014<br>
> @@ -679,6 +679,10 @@ LANGBUILTIN(_alloca,      "v*z", "n", AL<br>
> LANGBUILTIN(__assume,     "vb",  "n", ALL_MS_LANGUAGES)<br>
> LANGBUILTIN(__noop,       "v.",  "n", ALL_MS_LANGUAGES)<br>
> LANGBUILTIN(__debugbreak, "v",   "n", ALL_MS_LANGUAGES)<br>
> +LANGBUILTIN(_InterlockedCompareExchange, "LiLiD*LiLi", "n", ALL_MS_LANGUAGES)<br>
> +LANGBUILTIN(_InterlockedIncrement, "LiLiD*", "n", ALL_MS_LANGUAGES)<br>
> +LANGBUILTIN(_InterlockedDecrement, "LiLiD*", "n", ALL_MS_LANGUAGES)<br>
> +LANGBUILTIN(_InterlockedExchangeAdd, "LiLiD*Li", "n", ALL_MS_LANGUAGES)<br>
><br>
> // C99 library functions<br>
> // C99 stdlib.h<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)<br>
> +++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Wed Feb 19 17:20:20 2014<br>
> @@ -59,6 +59,7 @@ BUILTIN(__builtin_ia32_pswapdsi, "V2iV2i<br>
> // All MMX instructions will be generated via builtins. Any MMX vector<br>
> // types (<1 x i64>, <2 x i32>, etc.) that aren't used by these builtins will be<br>
> // expanded by the back-end.<br>
> +BUILTIN(_mm_prefetch, "vcC*i", "nc")<br>
> BUILTIN(__builtin_ia32_emms, "v", "")<br>
> BUILTIN(__builtin_ia32_paddb, "V8cV8cV8c", "")<br>
> BUILTIN(__builtin_ia32_paddw, "V4sV4sV4s", "")<br>
><br>
> Modified: cfe/trunk/include/clang/Sema/Sema.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Sema/Sema.h (original)<br>
> +++ cfe/trunk/include/clang/Sema/Sema.h Wed Feb 19 17:20:20 2014<br>
> @@ -7892,6 +7892,7 @@ private:<br>
>   bool CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);<br>
>   bool CheckAArch64BuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);<br>
>   bool CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);<br>
> +  bool CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);<br>
><br>
>   bool SemaBuiltinVAStart(CallExpr *TheCall);<br>
>   bool SemaBuiltinUnorderedCompare(CallExpr *TheCall);<br>
> @@ -7906,6 +7907,7 @@ public:<br>
><br>
> private:<br>
>   bool SemaBuiltinPrefetch(CallExpr *TheCall);<br>
> +  bool SemaBuiltinMMPrefetch(CallExpr *TheCall);<br>
>   bool SemaBuiltinObjectSize(CallExpr *TheCall);<br>
>   bool SemaBuiltinLongjmp(CallExpr *TheCall);<br>
>   ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult);<br>
><br>
> Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)<br>
> +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Feb 19 17:20:20 2014<br>
> @@ -1500,6 +1500,42 @@ RValue CodeGenFunction::EmitBuiltinExpr(<br>
>     return RValue::get(EmitLValue(E->getArg(0)).getAddress());<br>
>   case Builtin::BI__noop:<br>
>     return RValue::get(0);<br>
> +  case Builtin::BI_InterlockedCompareExchange: {<br>
> +    AtomicCmpXchgInst *CXI = Builder.CreateAtomicCmpXchg(<br>
> +        EmitScalarExpr(E->getArg(0)),<br>
> +        EmitScalarExpr(E->getArg(2)),<br>
> +        EmitScalarExpr(E->getArg(1)),<br>
> +        SequentiallyConsistent);<br>
> +      CXI->setVolatile(true);<br>
> +      return RValue::get(CXI);<br>
> +  }<br>
> +  case Builtin::BI_InterlockedIncrement: {<br>
> +    AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(<br>
> +      AtomicRMWInst::Add,<br>
> +      EmitScalarExpr(E->getArg(0)),<br>
> +      ConstantInt::get(Int32Ty, 1),<br>
> +      llvm::SequentiallyConsistent);<br>
> +    RMWI->setVolatile(true);<br>
> +    return RValue::get(Builder.CreateAdd(RMWI, ConstantInt::get(Int32Ty, 1)));<br>
> +  }<br>
> +  case Builtin::BI_InterlockedDecrement: {<br>
> +    AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(<br>
> +      AtomicRMWInst::Sub,<br>
> +      EmitScalarExpr(E->getArg(0)),<br>
> +      ConstantInt::get(Int32Ty, 1),<br>
> +      llvm::SequentiallyConsistent);<br>
> +    RMWI->setVolatile(true);<br>
> +    return RValue::get(Builder.CreateSub(RMWI, ConstantInt::get(Int32Ty, 1)));<br>
> +  }<br>
> +  case Builtin::BI_InterlockedExchangeAdd: {<br>
> +    AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(<br>
> +      AtomicRMWInst::Add,<br>
> +      EmitScalarExpr(E->getArg(0)),<br>
> +      EmitScalarExpr(E->getArg(1)),<br>
> +      llvm::SequentiallyConsistent);<br>
> +    RMWI->setVolatile(true);<br>
> +    return RValue::get(RMWI);<br>
> +  }<br>
>   }<br>
><br>
>   // If this is an alias for a lib function (e.g. __builtin_sin), emit<br>
> @@ -4487,6 +4523,14 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
><br>
>   switch (BuiltinID) {<br>
>   default: return 0;<br>
> +  case X86::BI_mm_prefetch: {<br>
> +    Value *Address = EmitScalarExpr(E->getArg(0));<br>
> +    Value *RW = ConstantInt::get(Int32Ty, 0);<br>
> +    Value *Locality = EmitScalarExpr(E->getArg(1));<br>
> +    Value *Data = ConstantInt::get(Int32Ty, 1);<br>
> +    Value *F = CGM.getIntrinsic(Intrinsic::prefetch);<br>
> +    return Builder.CreateCall4(F, Address, RW, Locality, Data);<br>
> +  }<br>
>   case X86::BI__builtin_ia32_vec_init_v8qi:<br>
>   case X86::BI__builtin_ia32_vec_init_v4hi:<br>
>   case X86::BI__builtin_ia32_vec_init_v2si:<br>
><br>
> Modified: cfe/trunk/lib/Headers/Intrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Headers/Intrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/Intrin.h Wed Feb 19 17:20:20 2014<br>
> @@ -623,10 +623,6 @@ static __inline__ short __attribute__((_<br>
> _InterlockedExchangeAdd16(short volatile *_Addend, short _Value) {<br>
>   return __atomic_add_fetch(_Addend, _Value, 0) - _Value;<br>
> }<br>
> -static __inline__ long __attribute__((__always_inline__, __nodebug__))<br>
> -_InterlockedExchangeAdd(long volatile *_Addend, long _Value) {<br>
> -  return __atomic_add_fetch(_Addend, _Value, 0) - _Value;<br>
> -}<br>
> #ifdef __x86_64__<br>
> static __inline__ __int64 __attribute__((__always_inline__, __nodebug__))<br>
> _InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value) {<br>
> @@ -661,10 +657,6 @@ static __inline__ short __attribute__((_<br>
> _InterlockedIncrement16(short volatile *_Value) {<br>
>   return __atomic_add_fetch(_Value, 1, 0);<br>
> }<br>
> -static __inline__ long __attribute__((__always_inline__, __nodebug__))<br>
> -_InterlockedIncrement(long volatile *_Value) {<br>
> -  return __atomic_add_fetch(_Value, 1, 0);<br>
> -}<br>
> #ifdef __x86_64__<br>
> static __inline__ __int64 __attribute__((__always_inline__, __nodebug__))<br>
> _InterlockedIncrement64(__int64 volatile *_Value) {<br>
> @@ -678,10 +670,6 @@ static __inline__ short __attribute__((_<br>
> _InterlockedDecrement16(short volatile *_Value) {<br>
>   return __atomic_sub_fetch(_Value, 1, 0);<br>
> }<br>
> -static __inline__ long __attribute__((__always_inline__, __nodebug__))<br>
> -_InterlockedDecrement(long volatile *_Value) {<br>
> -  return __atomic_sub_fetch(_Value, 1, 0);<br>
> -}<br>
> #ifdef __x86_64__<br>
> static __inline__ __int64 __attribute__((__always_inline__, __nodebug__))<br>
> _InterlockedDecrement64(__int64 volatile *_Value) {<br>
> @@ -791,12 +779,6 @@ _InterlockedCompareExchange16(short vola<br>
>   __atomic_compare_exchange(_Destination, &_Comparand, &_Exchange, 0, 0, 0);<br>
>   return _Comparand;<br>
> }<br>
> -static __inline__ long __attribute__((__always_inline__, __nodebug__))<br>
> -_InterlockedCompareExchange(long volatile *_Destination,<br>
> -                            long _Exchange, long _Comparand) {<br>
> -  __atomic_compare_exchange(_Destination, &_Comparand, &_Exchange, 0, 0, 0);<br>
> -  return _Comparand;<br>
> -}<br>
> #ifdef __x86_64__<br>
> static __inline__ void *__attribute__((__always_inline__, __nodebug__))<br>
> _InterlockedCompareExchangePointer(void *volatile *_Destination,<br>
><br>
> Modified: cfe/trunk/lib/Headers/xmmintrin.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xmmintrin.h?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xmmintrin.h?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Headers/xmmintrin.h (original)<br>
> +++ cfe/trunk/lib/Headers/xmmintrin.h Wed Feb 19 17:20:20 2014<br>
> @@ -672,11 +672,6 @@ _mm_storer_ps(float *__p, __m128 __a)<br>
> #define _MM_HINT_T2 1<br>
> #define _MM_HINT_NTA 0<br>
><br>
> -/* FIXME: We have to #define this because "sel" must be a constant integer, and<br>
> -   Sema doesn't do any form of constant propagation yet. */<br>
> -<br>
> -#define _mm_prefetch(a, sel) (__builtin_prefetch((void *)(a), 0, (sel)))<br>
> -<br>
> static __inline__ void __attribute__((__always_inline__, __nodebug__))<br>
> _mm_stream_pi(__m64 *__p, __m64 __a)<br>
> {<br>
><br>
> Modified: cfe/trunk/lib/Sema/SemaChecking.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=201734&r1=201733&r2=201734&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=201734&r1=201733&r2=201734&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)<br>
> +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Feb 19 17:20:20 2014<br>
> @@ -317,6 +317,11 @@ Sema::CheckBuiltinFunctionCall(unsigned<br>
>         if (CheckMipsBuiltinFunctionCall(BuiltinID, TheCall))<br>
>           return ExprError();<br>
>         break;<br>
> +      case llvm::Triple::x86:<br>
> +      case llvm::Triple::x86_64:<br>
> +        if (CheckX86BuiltinFunctionCall(BuiltinID, TheCall))<br>
> +          return ExprError();<br>
> +        break;<br>
>       default:<br>
>         break;<br>
>     }<br>
> @@ -655,6 +660,15 @@ bool Sema::CheckMipsBuiltinFunctionCall(<br>
>   return false;<br>
> }<br>
><br>
> +bool Sema::CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {<br>
> +  switch (BuiltinID) {<br>
> +  case X86::BI_mm_prefetch:<br>
> +    return SemaBuiltinMMPrefetch(TheCall);<br>
> +    break;<br>
> +  }<br>
> +  return false;<br>
> +}<br>
> +<br>
> /// Given a FunctionDecl's FormatAttr, attempts to populate the FomatStringInfo<br>
> /// parameter with the FormatAttr's correct format_idx and firstDataArg.<br>
> /// Returns true when the format fits the function and the FormatStringInfo has<br>
> @@ -1920,6 +1934,26 @@ bool Sema::SemaBuiltinPrefetch(CallExpr<br>
><br>
>   return false;<br>
> }<br>
> +<br>
> +/// SemaBuiltinMMPrefetch - Handle _mm_prefetch.<br>
> +// This is declared to take (const char*, int)<br>
> +bool Sema::SemaBuiltinMMPrefetch(CallExpr *TheCall) {<br>
> +  Expr *Arg = TheCall->getArg(1);<br>
> +<br>
> +  // We can't check the value of a dependent argument.<br>
> +  if (Arg->isTypeDependent() || Arg->isValueDependent())<br>
> +    return false;<br>
> +<br>
> +  llvm::APSInt Result;<br>
> +  if (SemaBuiltinConstantArg(TheCall, 1, Result))<br>
> +    return true;<br>
> +<br>
> +  if (Result.getLimitedValue() > 3)<br>
> +    return Diag(TheCall->getLocStart(), diag::err_argument_invalid_range)<br>
> +        << "0" << "3" << Arg->getSourceRange();<br>
> +<br>
> +  return false;<br>
> +}<br>
><br>
> /// SemaBuiltinConstantArg - Handle a check if argument ArgNum of CallExpr<br>
> /// TheCall is a constant expression.<br>
><br>
> Added: cfe/trunk/test/CodeGen/ms-builtins.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-builtins.c?rev=201734&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-builtins.c?rev=201734&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/CodeGen/ms-builtins.c (added)<br>
> +++ cfe/trunk/test/CodeGen/ms-builtins.c Wed Feb 19 17:20:20 2014<br>
> @@ -0,0 +1,22 @@<br>
> +// RUN: %clang_cc1 -triple=i686-unknown-unknown -fms-extensions -emit-llvm -o - %s | FileCheck %s<br>
> +<br>
> +extern void printf(const char*, ...);<br>
> +void f(char *a, volatile long* b) {<br>
> +  _mm_prefetch(a, 0);<br>
> +  _mm_prefetch(a, 1);<br>
> +  _mm_prefetch(a, 2);<br>
> +  _mm_prefetch(a, 3);<br>
> +  _InterlockedCompareExchange(b, 1, 0);<br>
> +  _InterlockedIncrement(b);<br>
> +  _InterlockedDecrement(b);<br>
> +  _InterlockedExchangeAdd(b, 2);<br>
> +};<br>
> +<br>
> +// CHECK: call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1)<br>
> +// CHECK: call void @llvm.prefetch(i8* %3, i32 0, i32 1, i32 1)<br>
> +// CHECK: call void @llvm.prefetch(i8* %5, i32 0, i32 2, i32 1)<br>
> +// CHECK: call void @llvm.prefetch(i8* %7, i32 0, i32 3, i32 1)<br>
> +// CHECK: cmpxchg<br>
> +// CHECK: atomicrmw volatile add<br>
> +// CHECK: atomicrmw volatile sub<br>
> +// CHECK: atomicrmw volatile add<br>
><br>
> Added: cfe/trunk/test/Headers/mmprefetch.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/mmprefetch.c?rev=201734&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/mmprefetch.c?rev=201734&view=auto</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Headers/mmprefetch.c (added)<br>
> +++ cfe/trunk/test/Headers/mmprefetch.c Wed Feb 19 17:20:20 2014<br>
> @@ -0,0 +1,16 @@<br>
> +// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fms-extensions -emit-llvm -verify %s<br>
> +<br>
> +#include <mmintrin.h><br>
> +<br>
> +// Check to make sure that _mm_prefetch survives redeclaration.<br>
> +void _mm_prefetch(char const*, int);<br>
> +<br>
> +void f(char *a) {<br>
> +  _mm_prefetch(a, 0);<br>
> +  _mm_prefetch(a, 1);<br>
> +  _mm_prefetch(a, 2);<br>
> +  _mm_prefetch(a, 3);<br>
> +  _mm_prefetch(a, 4); // expected-error {{argument should be a value from 0 to 3}}<br>
> +  _mm_prefetch(a, 0, 0); // expected-error {{too many arguments to function call, expected 2, have 3}}<br>
> +  _mm_prefetch(a); // expected-error {{too few arguments to function call, expected 2, have 1}}<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>
<br>
</div></div></blockquote></div><br></div>
</blockquote></div><br></div></body></html>