summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2017-09-11 07:35:01 +0000
committerDaniel Jasper <djasper@google.com>2017-09-11 07:35:01 +0000
commit7af729b3d23399b5573c51d70f2b0f2bf3769050 (patch)
tree13126c2904f8d21a471c169b31b5a2b60123a32f
parentcc477bbceaab693546ee1e8e9ca11e1e3b25e793 (diff)
downloadbcm5719-llvm-7af729b3d23399b5573c51d70f2b0f2bf3769050.tar.gz
bcm5719-llvm-7af729b3d23399b5573c51d70f2b0f2bf3769050.zip
Revert r312830: "Reinstall the patch "Use EmitPointerWithAlignment to get alignment information of the pointer used in atomic expr"."
This triggers llvm.org/PR31620 in several of our internal builds. I'll forward reproduction instructions to the original author. llvm-svn: 312897
-rw-r--r--clang/lib/CodeGen/CGAtomic.cpp16
-rw-r--r--clang/test/CodeGenCXX/atomic-align.cpp30
2 files changed, 8 insertions, 38 deletions
diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp
index d2aa5683ff7..d42740c0662 100644
--- a/clang/lib/CodeGen/CGAtomic.cpp
+++ b/clang/lib/CodeGen/CGAtomic.cpp
@@ -745,20 +745,20 @@ RValue CodeGenFunction::EmitAtomicExpr(AtomicExpr *E) {
QualType MemTy = AtomicTy;
if (const AtomicType *AT = AtomicTy->getAs<AtomicType>())
MemTy = AT->getValueType();
- llvm::Value *IsWeak = nullptr, *OrderFail = nullptr;
-
- Address Val1 = Address::invalid();
- Address Val2 = Address::invalid();
- Address Dest = Address::invalid();
- Address Ptr = EmitPointerWithAlignment(E->getPtr());
-
CharUnits sizeChars, alignChars;
std::tie(sizeChars, alignChars) = getContext().getTypeInfoInChars(AtomicTy);
uint64_t Size = sizeChars.getQuantity();
unsigned MaxInlineWidthInBits = getTarget().getMaxAtomicInlineWidth();
- bool UseLibcall = ((Ptr.getAlignment() % sizeChars) != 0 ||
+ bool UseLibcall = (sizeChars != alignChars ||
getContext().toBits(sizeChars) > MaxInlineWidthInBits);
+ llvm::Value *IsWeak = nullptr, *OrderFail = nullptr;
+
+ Address Val1 = Address::invalid();
+ Address Val2 = Address::invalid();
+ Address Dest = Address::invalid();
+ Address Ptr(EmitScalarExpr(E->getPtr()), alignChars);
+
if (E->getOp() == AtomicExpr::AO__c11_atomic_init ||
E->getOp() == AtomicExpr::AO__opencl_atomic_init) {
LValue lvalue = MakeAddrLValue(Ptr, AtomicTy);
diff --git a/clang/test/CodeGenCXX/atomic-align.cpp b/clang/test/CodeGenCXX/atomic-align.cpp
deleted file mode 100644
index 9852ac38a6c..00000000000
--- a/clang/test/CodeGenCXX/atomic-align.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s
-
-struct AM {
- int f1, f2;
-};
-alignas(8) AM m;
-AM load1() {
- AM am;
- // m is declared to align to 8bytes, so generate load atomic instead
- // of libcall.
- // CHECK-LABEL: @_Z5load1v
- // CHECK: load atomic {{.*}} monotonic
- __atomic_load(&m, &am, 0);
- return am;
-}
-
-struct BM {
- int f1;
- alignas(8) AM f2;
-};
-BM bm;
-AM load2() {
- AM am;
- // BM::f2 is declared to align to 8bytes, so generate load atomic instead
- // of libcall.
- // CHECK-LABEL: @_Z5load2v
- // CHECK: load atomic {{.*}} monotonic
- __atomic_load(&bm.f2, &am, 0);
- return am;
-}
OpenPOWER on IntegriCloud