[llvm-branch-commits] [llvm] 2cf9a07 - Align store conditional address
Hans Wennborg via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Aug 3 06:54:28 PDT 2020
Author: Brendon Cahoon
Date: 2020-08-03T15:52:15+02:00
New Revision: 2cf9a07fdcf683fdb2dfad6eeb79a78d8d3a8e3a
URL: https://github.com/llvm/llvm-project/commit/2cf9a07fdcf683fdb2dfad6eeb79a78d8d3a8e3a
DIFF: https://github.com/llvm/llvm-project/commit/2cf9a07fdcf683fdb2dfad6eeb79a78d8d3a8e3a.diff
LOG: Align store conditional address
In cases where the alignment of the datatype is smaller than
expected by the instruction, the address is aligned. The aligned
address is used for the load, but wasn't used for the store
conditional, which resulted in a run-time alignment exception.
(cherry picked from commit 7b114446c320de542c50c4c02f566e5d18adee33)
Added:
llvm/test/CodeGen/Hexagon/atomic-store-byte.ll
Modified:
llvm/lib/CodeGen/AtomicExpandPass.cpp
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/AtomicExpandPass.cpp b/llvm/lib/CodeGen/AtomicExpandPass.cpp
index a5030305435c..c61531c5141a 100644
--- a/llvm/lib/CodeGen/AtomicExpandPass.cpp
+++ b/llvm/lib/CodeGen/AtomicExpandPass.cpp
@@ -1239,7 +1239,8 @@ bool AtomicExpand::expandAtomicCmpXchg(AtomicCmpXchgInst *CI) {
Value *NewValueInsert =
insertMaskedValue(Builder, LoadedTryStore, CI->getNewValOperand(), PMV);
Value *StoreSuccess =
- TLI->emitStoreConditional(Builder, NewValueInsert, Addr, MemOpOrder);
+ TLI->emitStoreConditional(Builder, NewValueInsert, PMV.AlignedAddr,
+ MemOpOrder);
StoreSuccess = Builder.CreateICmpEQ(
StoreSuccess, ConstantInt::get(Type::getInt32Ty(Ctx), 0), "success");
BasicBlock *RetryBB = HasReleasedLoadBB ? ReleasedLoadBB : StartBB;
diff --git a/llvm/test/CodeGen/Hexagon/atomic-store-byte.ll b/llvm/test/CodeGen/Hexagon/atomic-store-byte.ll
new file mode 100644
index 000000000000..e3febe0264ad
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/atomic-store-byte.ll
@@ -0,0 +1,18 @@
+; RUN: llc -mtriple=hexagon < %s | FileCheck %s
+
+; Test that the address for a store conditional for a byte is aligned
+; correctly to use the memw_locked instruction.
+
+; CHECK: [[REG:(r[0-9]+)]] = and(r{{[0-9]+}},#-4)
+; CHECK: = memw_locked([[REG]])
+; CHECK: memw_locked([[REG]],p{{[0-4]}}) =
+
+ at foo.a00 = internal global i8 0, align 1
+
+; Function Attrs: nofree norecurse nounwind
+define dso_local void @foo() local_unnamed_addr #0 {
+entry:
+ %0 = cmpxchg volatile i8* @foo.a00, i8 0, i8 1 seq_cst seq_cst
+ ret void
+}
+
More information about the llvm-branch-commits
mailing list