r201734 - Add _mm_prefetch and some others as MS builtins

Daniel Jasper djasper at google.com
Thu Feb 20 03:17:27 PST 2014


After trying some other workarounds first, I reverted this and its
dependencies in r201775. Details in r201775's change description.


On Thu, Feb 20, 2014 at 1:34 AM, Juergen Ributzka <juergen at apple.com> wrote:

> Yeah, that fixed it. Thanks
>
> -Juergen
>
>
>
> On Feb 19, 2014, at 4:32 PM, Warren Hunt <whunt at google.com> wrote:
>
> Yeah, these are addressed in: r201734
>
> Sorry about that,
> -Warren
>
>
> On Wed, Feb 19, 2014 at 4:07 PM, Juergen Ributzka <juergen at apple.com>wrote:
>
>> Hi Warren,
>>
>> this is failing on our build bots with:
>> ******************** TEST 'Clang :: CodeGen/ms-builtins.c' FAILED
>> ********************
>> Script:
>> --
>> 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
>> --
>> Exit Code: 1
>>
>> Command Output (stderr):
>> --
>> /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'
>> extern void printf(const char*, ...);
>>             ^
>> /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 *, ...)'
>> 1 warning generated.
>> /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
>> // CHECK: call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1)
>>           ^
>> <stdin>:1:1: note: scanning from here
>> ; 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'
>> ^
>> <stdin>:13:2: note: possible intended match here
>>  call void @llvm.prefetch(i8* %4, i32 0, i32 0, i32 1)
>>  ^
>>
>> Could you please take a look?
>>
>> Thanks
>>
>> Cheers,
>> Juergen
>>
>> On Feb 19, 2014, at 3:20 PM, Warren Hunt <whunt at google.com> wrote:
>>
>> > Author: whunt
>> > Date: Wed Feb 19 17:20:20 2014
>> > New Revision: 201734
>> >
>> > URL: http://llvm.org/viewvc/llvm-project?rev=201734&view=rev
>> > Log:
>> > Add _mm_prefetch and some others as MS builtins
>> >
>> > This patch adds several built-ins that are required for ms
>> > compatibility. _mm_prefetch must be a built-in because it takes a
>> > compile-time constant argument and our prior approach of using a #define
>> > to the current built-in doesn't work in the presence of re-declaration
>> > of _mm_prefetch. The others can be obtained by including the windows
>> > system headers. If a user includes the windows system headers but not
>> > intrin.h they still need to work and therefore must be built-in because
>> > we don't get a chance to implement them in intrin.h in this case.
>> >
>> >
>> > Added:
>> >    cfe/trunk/test/CodeGen/ms-builtins.c
>> >    cfe/trunk/test/Headers/mmprefetch.c
>> > Modified:
>> >    cfe/trunk/include/clang/Basic/Builtins.def
>> >    cfe/trunk/include/clang/Basic/BuiltinsX86.def
>> >    cfe/trunk/include/clang/Sema/Sema.h
>> >    cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>> >    cfe/trunk/lib/Headers/Intrin.h
>> >    cfe/trunk/lib/Headers/xmmintrin.h
>> >    cfe/trunk/lib/Sema/SemaChecking.cpp
>> >
>> > Modified: cfe/trunk/include/clang/Basic/Builtins.def
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/include/clang/Basic/Builtins.def (original)
>> > +++ cfe/trunk/include/clang/Basic/Builtins.def Wed Feb 19 17:20:20 2014
>> > @@ -679,6 +679,10 @@ LANGBUILTIN(_alloca,      "v*z", "n", AL
>> > LANGBUILTIN(__assume,     "vb",  "n", ALL_MS_LANGUAGES)
>> > LANGBUILTIN(__noop,       "v.",  "n", ALL_MS_LANGUAGES)
>> > LANGBUILTIN(__debugbreak, "v",   "n", ALL_MS_LANGUAGES)
>> > +LANGBUILTIN(_InterlockedCompareExchange, "LiLiD*LiLi", "n",
>> ALL_MS_LANGUAGES)
>> > +LANGBUILTIN(_InterlockedIncrement, "LiLiD*", "n", ALL_MS_LANGUAGES)
>> > +LANGBUILTIN(_InterlockedDecrement, "LiLiD*", "n", ALL_MS_LANGUAGES)
>> > +LANGBUILTIN(_InterlockedExchangeAdd, "LiLiD*Li", "n", ALL_MS_LANGUAGES)
>> >
>> > // C99 library functions
>> > // C99 stdlib.h
>> >
>> > Modified: cfe/trunk/include/clang/Basic/BuiltinsX86.def
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)
>> > +++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Wed Feb 19 17:20:20
>> 2014
>> > @@ -59,6 +59,7 @@ BUILTIN(__builtin_ia32_pswapdsi, "V2iV2i
>> > // All MMX instructions will be generated via builtins. Any MMX vector
>> > // types (<1 x i64>, <2 x i32>, etc.) that aren't used by these
>> builtins will be
>> > // expanded by the back-end.
>> > +BUILTIN(_mm_prefetch, "vcC*i", "nc")
>> > BUILTIN(__builtin_ia32_emms, "v", "")
>> > BUILTIN(__builtin_ia32_paddb, "V8cV8cV8c", "")
>> > BUILTIN(__builtin_ia32_paddw, "V4sV4sV4s", "")
>> >
>> > Modified: cfe/trunk/include/clang/Sema/Sema.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/include/clang/Sema/Sema.h (original)
>> > +++ cfe/trunk/include/clang/Sema/Sema.h Wed Feb 19 17:20:20 2014
>> > @@ -7892,6 +7892,7 @@ private:
>> >   bool CheckARMBuiltinFunctionCall(unsigned BuiltinID, CallExpr
>> *TheCall);
>> >   bool CheckAArch64BuiltinFunctionCall(unsigned BuiltinID, CallExpr
>> *TheCall);
>> >   bool CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr
>> *TheCall);
>> > +  bool CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr
>> *TheCall);
>> >
>> >   bool SemaBuiltinVAStart(CallExpr *TheCall);
>> >   bool SemaBuiltinUnorderedCompare(CallExpr *TheCall);
>> > @@ -7906,6 +7907,7 @@ public:
>> >
>> > private:
>> >   bool SemaBuiltinPrefetch(CallExpr *TheCall);
>> > +  bool SemaBuiltinMMPrefetch(CallExpr *TheCall);
>> >   bool SemaBuiltinObjectSize(CallExpr *TheCall);
>> >   bool SemaBuiltinLongjmp(CallExpr *TheCall);
>> >   ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult);
>> >
>> > Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
>> > +++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Wed Feb 19 17:20:20 2014
>> > @@ -1500,6 +1500,42 @@ RValue CodeGenFunction::EmitBuiltinExpr(
>> >     return RValue::get(EmitLValue(E->getArg(0)).getAddress());
>> >   case Builtin::BI__noop:
>> >     return RValue::get(0);
>> > +  case Builtin::BI_InterlockedCompareExchange: {
>> > +    AtomicCmpXchgInst *CXI = Builder.CreateAtomicCmpXchg(
>> > +        EmitScalarExpr(E->getArg(0)),
>> > +        EmitScalarExpr(E->getArg(2)),
>> > +        EmitScalarExpr(E->getArg(1)),
>> > +        SequentiallyConsistent);
>> > +      CXI->setVolatile(true);
>> > +      return RValue::get(CXI);
>> > +  }
>> > +  case Builtin::BI_InterlockedIncrement: {
>> > +    AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(
>> > +      AtomicRMWInst::Add,
>> > +      EmitScalarExpr(E->getArg(0)),
>> > +      ConstantInt::get(Int32Ty, 1),
>> > +      llvm::SequentiallyConsistent);
>> > +    RMWI->setVolatile(true);
>> > +    return RValue::get(Builder.CreateAdd(RMWI,
>> ConstantInt::get(Int32Ty, 1)));
>> > +  }
>> > +  case Builtin::BI_InterlockedDecrement: {
>> > +    AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(
>> > +      AtomicRMWInst::Sub,
>> > +      EmitScalarExpr(E->getArg(0)),
>> > +      ConstantInt::get(Int32Ty, 1),
>> > +      llvm::SequentiallyConsistent);
>> > +    RMWI->setVolatile(true);
>> > +    return RValue::get(Builder.CreateSub(RMWI,
>> ConstantInt::get(Int32Ty, 1)));
>> > +  }
>> > +  case Builtin::BI_InterlockedExchangeAdd: {
>> > +    AtomicRMWInst *RMWI = Builder.CreateAtomicRMW(
>> > +      AtomicRMWInst::Add,
>> > +      EmitScalarExpr(E->getArg(0)),
>> > +      EmitScalarExpr(E->getArg(1)),
>> > +      llvm::SequentiallyConsistent);
>> > +    RMWI->setVolatile(true);
>> > +    return RValue::get(RMWI);
>> > +  }
>> >   }
>> >
>> >   // If this is an alias for a lib function (e.g. __builtin_sin), emit
>> > @@ -4487,6 +4523,14 @@ Value *CodeGenFunction::EmitX86BuiltinEx
>> >
>> >   switch (BuiltinID) {
>> >   default: return 0;
>> > +  case X86::BI_mm_prefetch: {
>> > +    Value *Address = EmitScalarExpr(E->getArg(0));
>> > +    Value *RW = ConstantInt::get(Int32Ty, 0);
>> > +    Value *Locality = EmitScalarExpr(E->getArg(1));
>> > +    Value *Data = ConstantInt::get(Int32Ty, 1);
>> > +    Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
>> > +    return Builder.CreateCall4(F, Address, RW, Locality, Data);
>> > +  }
>> >   case X86::BI__builtin_ia32_vec_init_v8qi:
>> >   case X86::BI__builtin_ia32_vec_init_v4hi:
>> >   case X86::BI__builtin_ia32_vec_init_v2si:
>> >
>> > Modified: cfe/trunk/lib/Headers/Intrin.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/lib/Headers/Intrin.h (original)
>> > +++ cfe/trunk/lib/Headers/Intrin.h Wed Feb 19 17:20:20 2014
>> > @@ -623,10 +623,6 @@ static __inline__ short __attribute__((_
>> > _InterlockedExchangeAdd16(short volatile *_Addend, short _Value) {
>> >   return __atomic_add_fetch(_Addend, _Value, 0) - _Value;
>> > }
>> > -static __inline__ long __attribute__((__always_inline__, __nodebug__))
>> > -_InterlockedExchangeAdd(long volatile *_Addend, long _Value) {
>> > -  return __atomic_add_fetch(_Addend, _Value, 0) - _Value;
>> > -}
>> > #ifdef __x86_64__
>> > static __inline__ __int64 __attribute__((__always_inline__,
>> __nodebug__))
>> > _InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value) {
>> > @@ -661,10 +657,6 @@ static __inline__ short __attribute__((_
>> > _InterlockedIncrement16(short volatile *_Value) {
>> >   return __atomic_add_fetch(_Value, 1, 0);
>> > }
>> > -static __inline__ long __attribute__((__always_inline__, __nodebug__))
>> > -_InterlockedIncrement(long volatile *_Value) {
>> > -  return __atomic_add_fetch(_Value, 1, 0);
>> > -}
>> > #ifdef __x86_64__
>> > static __inline__ __int64 __attribute__((__always_inline__,
>> __nodebug__))
>> > _InterlockedIncrement64(__int64 volatile *_Value) {
>> > @@ -678,10 +670,6 @@ static __inline__ short __attribute__((_
>> > _InterlockedDecrement16(short volatile *_Value) {
>> >   return __atomic_sub_fetch(_Value, 1, 0);
>> > }
>> > -static __inline__ long __attribute__((__always_inline__, __nodebug__))
>> > -_InterlockedDecrement(long volatile *_Value) {
>> > -  return __atomic_sub_fetch(_Value, 1, 0);
>> > -}
>> > #ifdef __x86_64__
>> > static __inline__ __int64 __attribute__((__always_inline__,
>> __nodebug__))
>> > _InterlockedDecrement64(__int64 volatile *_Value) {
>> > @@ -791,12 +779,6 @@ _InterlockedCompareExchange16(short vola
>> >   __atomic_compare_exchange(_Destination, &_Comparand, &_Exchange, 0,
>> 0, 0);
>> >   return _Comparand;
>> > }
>> > -static __inline__ long __attribute__((__always_inline__, __nodebug__))
>> > -_InterlockedCompareExchange(long volatile *_Destination,
>> > -                            long _Exchange, long _Comparand) {
>> > -  __atomic_compare_exchange(_Destination, &_Comparand, &_Exchange, 0,
>> 0, 0);
>> > -  return _Comparand;
>> > -}
>> > #ifdef __x86_64__
>> > static __inline__ void *__attribute__((__always_inline__, __nodebug__))
>> > _InterlockedCompareExchangePointer(void *volatile *_Destination,
>> >
>> > Modified: cfe/trunk/lib/Headers/xmmintrin.h
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xmmintrin.h?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/lib/Headers/xmmintrin.h (original)
>> > +++ cfe/trunk/lib/Headers/xmmintrin.h Wed Feb 19 17:20:20 2014
>> > @@ -672,11 +672,6 @@ _mm_storer_ps(float *__p, __m128 __a)
>> > #define _MM_HINT_T2 1
>> > #define _MM_HINT_NTA 0
>> >
>> > -/* FIXME: We have to #define this because "sel" must be a constant
>> integer, and
>> > -   Sema doesn't do any form of constant propagation yet. */
>> > -
>> > -#define _mm_prefetch(a, sel) (__builtin_prefetch((void *)(a), 0,
>> (sel)))
>> > -
>> > static __inline__ void __attribute__((__always_inline__, __nodebug__))
>> > _mm_stream_pi(__m64 *__p, __m64 __a)
>> > {
>> >
>> > Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=201734&r1=201733&r2=201734&view=diff
>> >
>> ==============================================================================
>> > --- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
>> > +++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Feb 19 17:20:20 2014
>> > @@ -317,6 +317,11 @@ Sema::CheckBuiltinFunctionCall(unsigned
>> >         if (CheckMipsBuiltinFunctionCall(BuiltinID, TheCall))
>> >           return ExprError();
>> >         break;
>> > +      case llvm::Triple::x86:
>> > +      case llvm::Triple::x86_64:
>> > +        if (CheckX86BuiltinFunctionCall(BuiltinID, TheCall))
>> > +          return ExprError();
>> > +        break;
>> >       default:
>> >         break;
>> >     }
>> > @@ -655,6 +660,15 @@ bool Sema::CheckMipsBuiltinFunctionCall(
>> >   return false;
>> > }
>> >
>> > +bool Sema::CheckX86BuiltinFunctionCall(unsigned BuiltinID, CallExpr
>> *TheCall) {
>> > +  switch (BuiltinID) {
>> > +  case X86::BI_mm_prefetch:
>> > +    return SemaBuiltinMMPrefetch(TheCall);
>> > +    break;
>> > +  }
>> > +  return false;
>> > +}
>> > +
>> > /// Given a FunctionDecl's FormatAttr, attempts to populate the
>> FomatStringInfo
>> > /// parameter with the FormatAttr's correct format_idx and firstDataArg.
>> > /// Returns true when the format fits the function and the
>> FormatStringInfo has
>> > @@ -1920,6 +1934,26 @@ bool Sema::SemaBuiltinPrefetch(CallExpr
>> >
>> >   return false;
>> > }
>> > +
>> > +/// SemaBuiltinMMPrefetch - Handle _mm_prefetch.
>> > +// This is declared to take (const char*, int)
>> > +bool Sema::SemaBuiltinMMPrefetch(CallExpr *TheCall) {
>> > +  Expr *Arg = TheCall->getArg(1);
>> > +
>> > +  // We can't check the value of a dependent argument.
>> > +  if (Arg->isTypeDependent() || Arg->isValueDependent())
>> > +    return false;
>> > +
>> > +  llvm::APSInt Result;
>> > +  if (SemaBuiltinConstantArg(TheCall, 1, Result))
>> > +    return true;
>> > +
>> > +  if (Result.getLimitedValue() > 3)
>> > +    return Diag(TheCall->getLocStart(),
>> diag::err_argument_invalid_range)
>> > +        << "0" << "3" << Arg->getSourceRange();
>> > +
>> > +  return false;
>> > +}
>> >
>> > /// SemaBuiltinConstantArg - Handle a check if argument ArgNum of
>> CallExpr
>> > /// TheCall is a constant expression.
>> >
>> > Added: cfe/trunk/test/CodeGen/ms-builtins.c
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/ms-builtins.c?rev=201734&view=auto
>> >
>> ==============================================================================
>> > --- cfe/trunk/test/CodeGen/ms-builtins.c (added)
>> > +++ cfe/trunk/test/CodeGen/ms-builtins.c Wed Feb 19 17:20:20 2014
>> > @@ -0,0 +1,22 @@
>> > +// RUN: %clang_cc1 -triple=i686-unknown-unknown -fms-extensions
>> -emit-llvm -o - %s | FileCheck %s
>> > +
>> > +extern void printf(const char*, ...);
>> > +void f(char *a, volatile long* b) {
>> > +  _mm_prefetch(a, 0);
>> > +  _mm_prefetch(a, 1);
>> > +  _mm_prefetch(a, 2);
>> > +  _mm_prefetch(a, 3);
>> > +  _InterlockedCompareExchange(b, 1, 0);
>> > +  _InterlockedIncrement(b);
>> > +  _InterlockedDecrement(b);
>> > +  _InterlockedExchangeAdd(b, 2);
>> > +};
>> > +
>> > +// CHECK: call void @llvm.prefetch(i8* %1, i32 0, i32 0, i32 1)
>> > +// CHECK: call void @llvm.prefetch(i8* %3, i32 0, i32 1, i32 1)
>> > +// CHECK: call void @llvm.prefetch(i8* %5, i32 0, i32 2, i32 1)
>> > +// CHECK: call void @llvm.prefetch(i8* %7, i32 0, i32 3, i32 1)
>> > +// CHECK: cmpxchg
>> > +// CHECK: atomicrmw volatile add
>> > +// CHECK: atomicrmw volatile sub
>> > +// CHECK: atomicrmw volatile add
>> >
>> > Added: cfe/trunk/test/Headers/mmprefetch.c
>> > URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/mmprefetch.c?rev=201734&view=auto
>> >
>> ==============================================================================
>> > --- cfe/trunk/test/Headers/mmprefetch.c (added)
>> > +++ cfe/trunk/test/Headers/mmprefetch.c Wed Feb 19 17:20:20 2014
>> > @@ -0,0 +1,16 @@
>> > +// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fms-extensions
>> -emit-llvm -verify %s
>> > +
>> > +#include <mmintrin.h>
>> > +
>> > +// Check to make sure that _mm_prefetch survives redeclaration.
>> > +void _mm_prefetch(char const*, int);
>> > +
>> > +void f(char *a) {
>> > +  _mm_prefetch(a, 0);
>> > +  _mm_prefetch(a, 1);
>> > +  _mm_prefetch(a, 2);
>> > +  _mm_prefetch(a, 3);
>> > +  _mm_prefetch(a, 4); // expected-error {{argument should be a value
>> from 0 to 3}}
>> > +  _mm_prefetch(a, 0, 0); // expected-error {{too many arguments to
>> function call, expected 2, have 3}}
>> > +  _mm_prefetch(a); // expected-error {{too few arguments to function
>> call, expected 2, have 1}}
>> > +};
>> >
>> >
>> > _______________________________________________
>> > cfe-commits mailing list
>> > cfe-commits at cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140220/010e1500/attachment.html>


More information about the cfe-commits mailing list