1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

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.
This commit is contained in:
Brendon Cahoon 2020-07-30 09:50:59 -05:00 committed by Krzysztof Parzyszek
parent 4649a23e60
commit 4b5fd94277
2 changed files with 20 additions and 1 deletions

View File

@ -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;

View File

@ -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]}}) =
@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
}