[llvm-commits] [llvm-gcc-4.2] r74403 - in /llvm-gcc-4.2/trunk/gcc: llvm-convert.cpp llvm-internal.h

Owen Anderson resistor at mac.com
Sat Jun 27 19:23:52 PDT 2009


I forgot to mention that this patch was by Duncan Sands.

--Owen

On Jun 27, 2009, at 7:22 PM, Owen Anderson wrote:

> Author: resistor
> Date: Sat Jun 27 21:22:04 2009
> New Revision: 74403
>
> URL: http://llvm.org/viewvc/llvm-project?rev=74403&view=rev
> Log:
> To honor the semantics of GCC's atomic builtins, we need to put  
> fences around
> atomic operations.  In the future, targets will (hopefully)  
> implement optzns
> to fold these away if their memory model is strong enough to make  
> them unnecessary.
>
> Modified:
>    llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
>    llvm-gcc-4.2/trunk/gcc/llvm-internal.h
>
> Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=74403&r1=74402&r2=74403&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
> +++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Sat Jun 27 21:22:04 2009
> @@ -4461,6 +4461,20 @@
>   TargetBuiltinCache.clear();
> }
>
> +void TreeToLLVM::EmitMemoryBarrier(bool ll, bool ls, bool sl, bool  
> ss) {
> +  Value* C[5];
> +  C[0] = ConstantInt::get(Type::Int1Ty, ll);
> +  C[1] = ConstantInt::get(Type::Int1Ty, ls);
> +  C[2] = ConstantInt::get(Type::Int1Ty, sl);
> +  C[3] = ConstantInt::get(Type::Int1Ty, ss);
> +  // We assume like gcc appears to, that this only applies to  
> cached memory.
> +  C[4] = ConstantInt::get(Type::Int1Ty, false);
> +
> +  Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
> +                                                
> Intrinsic::memory_barrier),
> +                     C, C + 5);
> +}
> +
> Value *
> TreeToLLVM::BuildBinaryAtomicBuiltin(tree exp, Intrinsic::ID id) {
>   const Type *ResultTy = ConvertType(TREE_TYPE(exp));
> @@ -4474,6 +4488,9 @@
>   Ty[1] = PointerType::getUnqual(ResultTy);
>   C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>   C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +  // The gcc builtins are also full memory barriers.
> +  // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +  EmitMemoryBarrier(true, true, true, true);
>   Value *Result =
>     Builder.CreateCall(Intrinsic::getDeclaration(TheModule,  id,
>                                                  Ty, 2),
> @@ -4498,11 +4515,20 @@
>   C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
>   C[2] = Builder.CreateIntCast(C[2], Ty[0], "cast");
>
> +  // The gcc builtins are also full memory barriers.
> +  // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +  EmitMemoryBarrier(true, true, true, true);
> +
>   Value *Result =
>     Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                   
> Intrinsic::atomic_cmp_swap,
>                                                  Ty, 2),
>     C, C + 3);
> +
> +  // The gcc builtins are also full memory barriers.
> +  // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +  EmitMemoryBarrier(true, true, true, true);
> +
>   if (isBool)
>     Result = CastToUIntType(Builder.CreateICmpEQ(Result, C[1]),
>                             ConvertType(boolean_type_node));
> @@ -4970,11 +4996,21 @@
>     Ty[1] = PointerType::getUnqual(ResultTy);
>     C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>     C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result =
>       Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                     
> Intrinsic::atomic_load_add,
>                                                    Ty, 2),
>                          C, C + 2);
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result = Builder.CreateAdd(Result, C[1]);
>     Result = Builder.CreateIntToPtr(Result, ResultTy);
>     return true;
> @@ -4998,11 +5034,21 @@
>     Ty[1] = PointerType::getUnqual(ResultTy);
>     C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>     C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result =
>       Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                     
> Intrinsic::atomic_load_sub,
>                                                    Ty, 2),
>                          C, C + 2);
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result = Builder.CreateSub(Result, C[1]);
>     Result = Builder.CreateIntToPtr(Result, ResultTy);
>     return true;
> @@ -5026,11 +5072,21 @@
>     Ty[1] = PointerType::getUnqual(ResultTy);
>     C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>     C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result =
>       Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                     
> Intrinsic::atomic_load_or,
>                                                    Ty, 2),
>                          C, C + 2);
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result = Builder.CreateOr(Result, C[1]);
>     Result = Builder.CreateIntToPtr(Result, ResultTy);
>     return true;
> @@ -5054,11 +5110,21 @@
>     Ty[1] = PointerType::getUnqual(ResultTy);
>     C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>     C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result =
>       Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                     
> Intrinsic::atomic_load_and,
>                                                    Ty, 2),
>                          C, C + 2);
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result = Builder.CreateAnd(Result, C[1]);
>     Result = Builder.CreateIntToPtr(Result, ResultTy);
>     return true;
> @@ -5082,11 +5148,21 @@
>     Ty[1] = PointerType::getUnqual(ResultTy);
>     C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>     C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result =
>       Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                     
> Intrinsic::atomic_load_xor,
>                                                    Ty, 2),
>                          C, C + 2);
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result = Builder.CreateXor(Result, C[1]);
>     Result = Builder.CreateIntToPtr(Result, ResultTy);
>     return true;
> @@ -5110,11 +5186,21 @@
>     Ty[1] = PointerType::getUnqual(ResultTy);
>     C[0] = Builder.CreateBitCast(C[0], Ty[1]);
>     C[1] = Builder.CreateIntCast(C[1], Ty[0], "cast");
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result =
>       Builder.CreateCall(Intrinsic::getDeclaration(TheModule,
>                                                     
> Intrinsic::atomic_load_nand,
>                                                    Ty, 2),
>                          C, C + 2);
> +
> +    // The gcc builtins are also full memory barriers.
> +    // FIXME: __sync_lock_test_and_set and __sync_lock_release  
> require less.
> +    EmitMemoryBarrier(true, true, true, true);
> +
>     Result = Builder.CreateAnd(Builder.CreateNot(Result), C[1]);
>     Result = Builder.CreateIntToPtr(Result, ResultTy);
>     return true;
>
> Modified: llvm-gcc-4.2/trunk/gcc/llvm-internal.h
> URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-internal.h?rev=74403&r1=74402&r2=74403&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm-gcc-4.2/trunk/gcc/llvm-internal.h (original)
> +++ llvm-gcc-4.2/trunk/gcc/llvm-internal.h Sat Jun 27 21:22:04 2009
> @@ -540,6 +540,7 @@
>   void EmitModifyOfRegisterVariable(tree_node *vardecl, Value *RHS);
>
>   // Helpers for Builtin Function Expansion.
> +  void EmitMemoryBarrier(bool ll, bool ls, bool sl, bool ss);
>   Value *BuildVector(const std::vector<Value*> &Elts);
>   Value *BuildVector(Value *Elt, ...);
>   Value *BuildVectorShuffle(Value *InVec1, Value *InVec2, ...);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list