diff options
| author | Daniel Jasper <djasper@google.com> | 2014-02-20 11:10:48 +0000 |
|---|---|---|
| committer | Daniel Jasper <djasper@google.com> | 2014-02-20 11:10:48 +0000 |
| commit | 2f0f297bdb3f6f2127485b8b4dfbc9543b162139 (patch) | |
| tree | f96108648a959e2d5a99f52f962fe6bd32be98b6 | |
| parent | 1f2ce39006c583d0ab981bdb3d6ce7d64b1f365a (diff) | |
| download | bcm5719-llvm-2f0f297bdb3f6f2127485b8b4dfbc9543b162139.tar.gz bcm5719-llvm-2f0f297bdb3f6f2127485b8b4dfbc9543b162139.zip | |
Revert r201734 and r201742.
This breaks backwards compatibility with existing code. Previously, this
was defined as
#define _mm_prefetch(a, sel) (__builtin_prefetch((void *)(a), 0, (sel)))
Which basically accepts any pointer. Changing this to char* simply
breaks a lot of existing code. I have tried changing char* to
"const void*", which seems to be the right thing as per Intel
specification this should work on basically any pointer. However,
apparently this breaks windows compatibility (because of a conflicting
declaration in windows.h).
So, we probably need to #ifdef this based on whether clang is compiling
for windows. According to Chandler, this might be done by introducing an
additional symbol to a fake type in BuiltinsX86.def and then condition
the type expansion on the platform.
llvm-svn: 201775
| -rw-r--r-- | clang/include/clang/Basic/Builtins.def | 4 | ||||
| -rw-r--r-- | clang/include/clang/Basic/BuiltinsX86.def | 1 | ||||
| -rw-r--r-- | clang/include/clang/Sema/Sema.h | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 44 | ||||
| -rw-r--r-- | clang/lib/Headers/Intrin.h | 18 | ||||
| -rw-r--r-- | clang/lib/Headers/xmmintrin.h | 5 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 34 | ||||
| -rw-r--r-- | clang/test/CodeGen/ms-builtins.c | 21 | ||||
| -rw-r--r-- | clang/test/Headers/mmprefetch.c | 16 |
9 files changed, 23 insertions, 122 deletions
diff --git a/clang/include/clang/Basic/Builtins.def b/clang/include/clang/Basic/Builtins.def index 2f71f805a3b..af8a4dae7df 100644 --- a/clang/include/clang/Basic/Builtins.def +++ b/clang/include/clang/Basic/Builtins.def @@ -679,10 +679,6 @@ LANGBUILTIN(_alloca, "v*z", "n", ALL_MS_LANGUAGES) 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 diff --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def index 4a67fc1f5ff..51397fa45df 100644 --- a/clang/include/clang/Basic/BuiltinsX86.def +++ b/clang/include/clang/Basic/BuiltinsX86.def @@ -59,7 +59,6 @@ BUILTIN(__builtin_ia32_pswapdsi, "V2iV2i", "nc") // 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", "") diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index fca2d610910..ff21c1d284a 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -7892,7 +7892,6 @@ 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); @@ -7907,7 +7906,6 @@ public: private: bool SemaBuiltinPrefetch(CallExpr *TheCall); - bool SemaBuiltinMMPrefetch(CallExpr *TheCall); bool SemaBuiltinObjectSize(CallExpr *TheCall); bool SemaBuiltinLongjmp(CallExpr *TheCall); ExprResult SemaBuiltinAtomicOverloaded(ExprResult TheCallResult); diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 4f744217b07..defa0716629 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1500,42 +1500,6 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD, 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 @@ -4523,14 +4487,6 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, 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: diff --git a/clang/lib/Headers/Intrin.h b/clang/lib/Headers/Intrin.h index f5843cfab06..3bb304a3115 100644 --- a/clang/lib/Headers/Intrin.h +++ b/clang/lib/Headers/Intrin.h @@ -623,6 +623,10 @@ static __inline__ short __attribute__((__always_inline__, __nodebug__)) _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) { @@ -657,6 +661,10 @@ static __inline__ short __attribute__((__always_inline__, __nodebug__)) _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) { @@ -670,6 +678,10 @@ static __inline__ short __attribute__((__always_inline__, __nodebug__)) _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) { @@ -779,6 +791,12 @@ _InterlockedCompareExchange16(short volatile *_Destination, __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, diff --git a/clang/lib/Headers/xmmintrin.h b/clang/lib/Headers/xmmintrin.h index 172b9e21d14..c68d3ed7b67 100644 --- a/clang/lib/Headers/xmmintrin.h +++ b/clang/lib/Headers/xmmintrin.h @@ -672,6 +672,11 @@ _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) { diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 01bb497a412..cfd042f9459 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -317,11 +317,6 @@ Sema::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { 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; } @@ -660,15 +655,6 @@ bool Sema::CheckMipsBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { 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 @@ -1935,26 +1921,6 @@ bool Sema::SemaBuiltinPrefetch(CallExpr *TheCall) { 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. bool Sema::SemaBuiltinConstantArg(CallExpr *TheCall, int ArgNum, diff --git a/clang/test/CodeGen/ms-builtins.c b/clang/test/CodeGen/ms-builtins.c deleted file mode 100644 index 2eecd94bc86..00000000000 --- a/clang/test/CodeGen/ms-builtins.c +++ /dev/null @@ -1,21 +0,0 @@ -// RUN: %clang_cc1 -triple=i686-unknown-unknown -fms-extensions -emit-llvm -o - %s | FileCheck %s - -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* %{{.*}}, i32 0, i32 0, i32 1) -// CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 1, i32 1) -// CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 2, i32 1) -// CHECK: call void @llvm.prefetch(i8* %{{.*}}, i32 0, i32 3, i32 1) -// CHECK: cmpxchg -// CHECK: atomicrmw volatile add -// CHECK: atomicrmw volatile sub -// CHECK: atomicrmw volatile add diff --git a/clang/test/Headers/mmprefetch.c b/clang/test/Headers/mmprefetch.c deleted file mode 100644 index 7452bea85d2..00000000000 --- a/clang/test/Headers/mmprefetch.c +++ /dev/null @@ -1,16 +0,0 @@ -// RUN: %clang_cc1 -triple=x86_64-unknown-unknown -fms-extensions -emit-llvm-only -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}} -}; |

