[cfe-commits] r139648 - in /cfe/trunk: lib/CodeGen/CGBuiltin.cpp lib/CodeGen/ItaniumCXXABI.cpp test/CodeGen/Atomics.c test/CodeGen/atomic.c test/CodeGenCXX/static-init.cpp
Eli Friedman
eli.friedman at gmail.com
Tue Sep 13 15:08:16 PDT 2011
Author: efriedma
Date: Tue Sep 13 17:08:16 2011
New Revision: 139648
URL: http://llvm.org/viewvc/llvm-project?rev=139648&view=rev
Log:
Revert r139643 while I look into it; it's breaking selfhost.
Modified:
cfe/trunk/lib/CodeGen/CGBuiltin.cpp
cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
cfe/trunk/test/CodeGen/Atomics.c
cfe/trunk/test/CodeGen/atomic.c
cfe/trunk/test/CodeGenCXX/static-init.cpp
Modified: cfe/trunk/lib/CodeGen/CGBuiltin.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=139648&r1=139647&r2=139648&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Sep 13 17:08:16 2011
@@ -900,14 +900,13 @@
case Builtin::BI__sync_lock_release_8:
case Builtin::BI__sync_lock_release_16: {
Value *Ptr = EmitScalarExpr(E->getArg(0));
- llvm::Type *ElLLVMTy =
+ llvm::Type *ElTy =
cast<llvm::PointerType>(Ptr->getType())->getElementType();
llvm::StoreInst *Store =
- Builder.CreateStore(llvm::Constant::getNullValue(ElLLVMTy), Ptr);
- QualType ElTy = E->getArg(0)->getType()->getPointeeType();
- CharUnits StoreSize = getContext().getTypeSizeInChars(ElTy);
- Store->setAlignment(StoreSize.getQuantity());
- Store->setAtomic(llvm::Release);
+ Builder.CreateStore(llvm::Constant::getNullValue(ElTy), Ptr);
+ // FIXME: This is completely, utterly wrong; it only even sort-of works
+ // on x86.
+ Store->setVolatile(true);
return RValue::get(0);
}
Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=139648&r1=139647&r2=139648&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)
+++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Tue Sep 13 17:08:16 2011
@@ -1130,27 +1130,20 @@
} else {
// Load the first byte of the guard variable.
llvm::Type *PtrTy = Builder.getInt8PtrTy();
- llvm::LoadInst *LI =
+ llvm::Value *V =
Builder.CreateLoad(Builder.CreateBitCast(GuardVariable, PtrTy), "tmp");
- LI->setAlignment(1);
- // Itanium ABI:
- // An implementation supporting thread-safety on multiprocessor
- // systems must also guarantee that references to the initialized
- // object do not occur before the load of the initialization flag.
- //
- // In LLVM, we do this by marking the load Acquire.
- if (threadsafe)
- LI->setAtomic(llvm::Acquire);
-
- IsInitialized = Builder.CreateIsNull(LI, "guard.uninitialized");
+ IsInitialized = Builder.CreateIsNull(V, "guard.uninitialized");
}
llvm::BasicBlock *InitCheckBlock = CGF.createBasicBlock("init.check");
llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
+ llvm::BasicBlock *NoCheckBlock = EndBlock;
+ if (threadsafe) NoCheckBlock = CGF.createBasicBlock("init.barrier");
+
// Check if the first byte of the guard variable is zero.
- Builder.CreateCondBr(IsInitialized, InitCheckBlock, EndBlock);
+ Builder.CreateCondBr(IsInitialized, InitCheckBlock, NoCheckBlock);
CGF.EmitBlock(InitCheckBlock);
@@ -1184,5 +1177,23 @@
Builder.CreateStore(llvm::ConstantInt::get(GuardTy, 1), GuardVariable);
}
+ // Emit an acquire memory barrier if using thread-safe statics:
+ // Itanium ABI:
+ // An implementation supporting thread-safety on multiprocessor
+ // systems must also guarantee that references to the initialized
+ // object do not occur before the load of the initialization flag.
+ if (threadsafe) {
+ Builder.CreateBr(EndBlock);
+ CGF.EmitBlock(NoCheckBlock);
+
+ llvm::Value *_false = Builder.getFalse();
+ llvm::Value *_true = Builder.getTrue();
+
+ Builder.CreateCall5(CGM.getIntrinsic(llvm::Intrinsic::memory_barrier),
+ /* load-load, load-store */ _true, _true,
+ /* store-load, store-store */ _false, _false,
+ /* device or I/O */ _false);
+ }
+
CGF.EmitBlock(EndBlock);
}
Modified: cfe/trunk/test/CodeGen/Atomics.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/Atomics.c?rev=139648&r1=139647&r2=139648&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/Atomics.c (original)
+++ cfe/trunk/test/CodeGen/Atomics.c Tue Sep 13 17:08:16 2011
@@ -192,12 +192,13 @@
__sync_synchronize (); // CHECK: fence seq_cst
- __sync_lock_release (&sc); // CHECK: store atomic {{.*}} release, align 1
- __sync_lock_release (&uc); // CHECK: store atomic {{.*}} release, align 1
- __sync_lock_release (&ss); // CHECK: store atomic {{.*}} release, align 2
- __sync_lock_release (&us); /// CHECK: store atomic {{.*}} release, align 2
- __sync_lock_release (&si); // CHECK: store atomic {{.*}} release, align 4
- __sync_lock_release (&ui); // CHECK: store atomic {{.*}} release, align 4
- __sync_lock_release (&sll); // CHECK: store atomic {{.*}} release, align 8
- __sync_lock_release (&ull); // CHECK: store atomic {{.*}} release, align 8
+ // FIXME: These are wrong!
+ __sync_lock_release (&sc); // CHECK: store volatile
+ __sync_lock_release (&uc); // CHECK: store volatile
+ __sync_lock_release (&ss); // CHECK: store volatile
+ __sync_lock_release (&us); // CHECK: store volatile
+ __sync_lock_release (&si); // CHECK: store volatile
+ __sync_lock_release (&ui); // CHECK: store volatile
+ __sync_lock_release (&sll); // CHECK: store volatile
+ __sync_lock_release (&ull); // CHECK: store volatile
}
Modified: cfe/trunk/test/CodeGen/atomic.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/atomic.c?rev=139648&r1=139647&r2=139648&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/atomic.c (original)
+++ cfe/trunk/test/CodeGen/atomic.c Tue Sep 13 17:08:16 2011
@@ -75,7 +75,8 @@
// CHECK: cmpxchg i32* null, i32 0, i32 0 seq_cst
__sync_lock_release(&val);
- // CHECK: store atomic {{.*}} release, align 4
+ // FIXME: WRONG!
+ // CHECK: store volatile i32 0, i32*
__sync_synchronize ();
// CHECK: fence seq_cst
@@ -87,7 +88,8 @@
void release_return(int *lock) {
// Ensure this is actually returning void all the way through.
return __sync_lock_release(lock);
- // CHECK: store atomic {{.*}} release, align 4
+ // FIXME: WRONG!
+ // CHECK: store volatile i32 0, i32*
}
Modified: cfe/trunk/test/CodeGenCXX/static-init.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/static-init.cpp?rev=139648&r1=139647&r2=139648&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/static-init.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/static-init.cpp Tue Sep 13 17:08:16 2011
@@ -12,11 +12,13 @@
};
void f() {
- // CHECK: load atomic i8* bitcast (i64* @_ZGVZ1fvE1a to i8*) acquire, align 1
// CHECK: call i32 @__cxa_guard_acquire
// CHECK: call void @_ZN1AC1Ev
// CHECK: call i32 @__cxa_atexit(void (i8*)* bitcast (void (%struct.A*)* @_ZN1AD1Ev to void (i8*)*), i8* getelementptr inbounds (%struct.A* @_ZZ1fvE1a, i32 0, i32 0), i8* bitcast (i8** @__dso_handle to i8*))
// CHECK: call void @__cxa_guard_release
+
+ // rdar://problem/9496726
+ // CHECK: call void @llvm.memory.barrier(i1 true, i1 true, i1 false, i1 false, i1 false)
static A a;
}
More information about the cfe-commits
mailing list