@@ -98,7 +98,7 @@ class AtomicExpandImpl {
9898 IRBuilderBase &Builder, Type *ResultType, Value *Addr, Align AddrAlign,
9999 AtomicOrdering MemOpOrder, SyncScope::ID SSID,
100100 function_ref<Value *(IRBuilderBase &, Value *)> PerformOp,
101- CreateCmpXchgInstFun CreateCmpXchg);
101+ CreateCmpXchgInstFun CreateCmpXchg, Instruction *MetadataSrc );
102102 bool tryExpandAtomicCmpXchg (AtomicCmpXchgInst *CI);
103103
104104 bool expandAtomicCmpXchg (AtomicCmpXchgInst *CI);
@@ -600,7 +600,8 @@ void AtomicExpandImpl::expandAtomicStore(StoreInst *SI) {
600600static void createCmpXchgInstFun (IRBuilderBase &Builder, Value *Addr,
601601 Value *Loaded, Value *NewVal, Align AddrAlign,
602602 AtomicOrdering MemOpOrder, SyncScope::ID SSID,
603- Value *&Success, Value *&NewLoaded) {
603+ Value *&Success, Value *&NewLoaded,
604+ Instruction *MetadataSrc) {
604605 Type *OrigTy = NewVal->getType ();
605606
606607 // This code can go away when cmpxchg supports FP and vector types.
@@ -612,9 +613,12 @@ static void createCmpXchgInstFun(IRBuilderBase &Builder, Value *Addr,
612613 Loaded = Builder.CreateBitCast (Loaded, IntTy);
613614 }
614615
615- Value *Pair = Builder.CreateAtomicCmpXchg (
616+ AtomicCmpXchgInst *Pair = Builder.CreateAtomicCmpXchg (
616617 Addr, Loaded, NewVal, AddrAlign, MemOpOrder,
617618 AtomicCmpXchgInst::getStrongestFailureOrdering (MemOpOrder), SSID);
619+ if (MetadataSrc)
620+ Pair->copyMetadata (*MetadataSrc);
621+
618622 Success = Builder.CreateExtractValue (Pair, 1 , " success" );
619623 NewLoaded = Builder.CreateExtractValue (Pair, 0 , " newloaded" );
620624
@@ -951,9 +955,9 @@ void AtomicExpandImpl::expandPartwordAtomicRMW(
951955
952956 Value *OldResult;
953957 if (ExpansionKind == TargetLoweringBase::AtomicExpansionKind::CmpXChg) {
954- OldResult = insertRMWCmpXchgLoop (Builder, PMV. WordType , PMV. AlignedAddr ,
955- PMV.AlignedAddrAlignment , MemOpOrder, SSID ,
956- PerformPartwordOp, createCmpXchgInstFun);
958+ OldResult = insertRMWCmpXchgLoop (
959+ Builder, PMV.WordType , PMV. AlignedAddr , PMV. AlignedAddrAlignment ,
960+ MemOpOrder, SSID, PerformPartwordOp, createCmpXchgInstFun, AI );
957961 } else {
958962 assert (ExpansionKind == TargetLoweringBase::AtomicExpansionKind::LLSC);
959963 OldResult = insertRMWLLSCLoop (Builder, PMV.WordType , PMV.AlignedAddr ,
@@ -981,6 +985,7 @@ static void copyMetadataForAtomic(Instruction &Dest,
981985 case LLVMContext::MD_tbaa_struct:
982986 case LLVMContext::MD_alias_scope:
983987 case LLVMContext::MD_noalias:
988+ case LLVMContext::MD_noalias_addrspace:
984989 case LLVMContext::MD_access_group:
985990 case LLVMContext::MD_mmra:
986991 Dest.setMetadata (ID, N);
@@ -1591,7 +1596,7 @@ Value *AtomicExpandImpl::insertRMWCmpXchgLoop(
15911596 IRBuilderBase &Builder, Type *ResultTy, Value *Addr, Align AddrAlign,
15921597 AtomicOrdering MemOpOrder, SyncScope::ID SSID,
15931598 function_ref<Value *(IRBuilderBase &, Value *)> PerformOp,
1594- CreateCmpXchgInstFun CreateCmpXchg) {
1599+ CreateCmpXchgInstFun CreateCmpXchg, Instruction *MetadataSrc ) {
15951600 LLVMContext &Ctx = Builder.getContext ();
15961601 BasicBlock *BB = Builder.GetInsertBlock ();
15971602 Function *F = BB->getParent ();
@@ -1637,7 +1642,7 @@ Value *AtomicExpandImpl::insertRMWCmpXchgLoop(
16371642 MemOpOrder == AtomicOrdering::Unordered
16381643 ? AtomicOrdering::Monotonic
16391644 : MemOpOrder,
1640- SSID, Success, NewLoaded);
1645+ SSID, Success, NewLoaded, MetadataSrc );
16411646 assert (Success && NewLoaded);
16421647
16431648 Loaded->addIncoming (NewLoaded, LoopBB);
@@ -1686,7 +1691,7 @@ bool llvm::expandAtomicRMWToCmpXchg(AtomicRMWInst *AI,
16861691 return buildAtomicRMWValue (AI->getOperation (), Builder, Loaded,
16871692 AI->getValOperand ());
16881693 },
1689- CreateCmpXchg);
1694+ CreateCmpXchg, /* MetadataSrc= */ AI );
16901695
16911696 AI->replaceAllUsesWith (Loaded);
16921697 AI->eraseFromParent ();
@@ -1838,11 +1843,15 @@ void AtomicExpandImpl::expandAtomicRMWToLibcall(AtomicRMWInst *I) {
18381843 expandAtomicRMWToCmpXchg (
18391844 I, [this ](IRBuilderBase &Builder, Value *Addr, Value *Loaded,
18401845 Value *NewVal, Align Alignment, AtomicOrdering MemOpOrder,
1841- SyncScope::ID SSID, Value *&Success, Value *&NewLoaded) {
1846+ SyncScope::ID SSID, Value *&Success, Value *&NewLoaded,
1847+ Instruction *MetadataSrc) {
18421848 // Create the CAS instruction normally...
18431849 AtomicCmpXchgInst *Pair = Builder.CreateAtomicCmpXchg (
18441850 Addr, Loaded, NewVal, Alignment, MemOpOrder,
18451851 AtomicCmpXchgInst::getStrongestFailureOrdering (MemOpOrder), SSID);
1852+ if (MetadataSrc)
1853+ Pair->copyMetadata (*MetadataSrc);
1854+
18461855 Success = Builder.CreateExtractValue (Pair, 1 , " success" );
18471856 NewLoaded = Builder.CreateExtractValue (Pair, 0 , " newloaded" );
18481857
0 commit comments