@@ -98,7 +98,7 @@ class AtomicExpandImpl {
98
98
IRBuilderBase &Builder, Type *ResultType, Value *Addr, Align AddrAlign,
99
99
AtomicOrdering MemOpOrder, SyncScope::ID SSID,
100
100
function_ref<Value *(IRBuilderBase &, Value *)> PerformOp,
101
- CreateCmpXchgInstFun CreateCmpXchg);
101
+ CreateCmpXchgInstFun CreateCmpXchg, Instruction *MetadataSrc );
102
102
bool tryExpandAtomicCmpXchg (AtomicCmpXchgInst *CI);
103
103
104
104
bool expandAtomicCmpXchg (AtomicCmpXchgInst *CI);
@@ -600,7 +600,8 @@ void AtomicExpandImpl::expandAtomicStore(StoreInst *SI) {
600
600
static void createCmpXchgInstFun (IRBuilderBase &Builder, Value *Addr,
601
601
Value *Loaded, Value *NewVal, Align AddrAlign,
602
602
AtomicOrdering MemOpOrder, SyncScope::ID SSID,
603
- Value *&Success, Value *&NewLoaded) {
603
+ Value *&Success, Value *&NewLoaded,
604
+ Instruction *MetadataSrc) {
604
605
Type *OrigTy = NewVal->getType ();
605
606
606
607
// This code can go away when cmpxchg supports FP and vector types.
@@ -612,9 +613,12 @@ static void createCmpXchgInstFun(IRBuilderBase &Builder, Value *Addr,
612
613
Loaded = Builder.CreateBitCast (Loaded, IntTy);
613
614
}
614
615
615
- Value *Pair = Builder.CreateAtomicCmpXchg (
616
+ AtomicCmpXchgInst *Pair = Builder.CreateAtomicCmpXchg (
616
617
Addr, Loaded, NewVal, AddrAlign, MemOpOrder,
617
618
AtomicCmpXchgInst::getStrongestFailureOrdering (MemOpOrder), SSID);
619
+ if (MetadataSrc)
620
+ Pair->copyMetadata (*MetadataSrc);
621
+
618
622
Success = Builder.CreateExtractValue (Pair, 1 , " success" );
619
623
NewLoaded = Builder.CreateExtractValue (Pair, 0 , " newloaded" );
620
624
@@ -951,9 +955,9 @@ void AtomicExpandImpl::expandPartwordAtomicRMW(
951
955
952
956
Value *OldResult;
953
957
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 );
957
961
} else {
958
962
assert (ExpansionKind == TargetLoweringBase::AtomicExpansionKind::LLSC);
959
963
OldResult = insertRMWLLSCLoop (Builder, PMV.WordType , PMV.AlignedAddr ,
@@ -981,6 +985,7 @@ static void copyMetadataForAtomic(Instruction &Dest,
981
985
case LLVMContext::MD_tbaa_struct:
982
986
case LLVMContext::MD_alias_scope:
983
987
case LLVMContext::MD_noalias:
988
+ case LLVMContext::MD_noalias_addrspace:
984
989
case LLVMContext::MD_access_group:
985
990
case LLVMContext::MD_mmra:
986
991
Dest.setMetadata (ID, N);
@@ -1591,7 +1596,7 @@ Value *AtomicExpandImpl::insertRMWCmpXchgLoop(
1591
1596
IRBuilderBase &Builder, Type *ResultTy, Value *Addr, Align AddrAlign,
1592
1597
AtomicOrdering MemOpOrder, SyncScope::ID SSID,
1593
1598
function_ref<Value *(IRBuilderBase &, Value *)> PerformOp,
1594
- CreateCmpXchgInstFun CreateCmpXchg) {
1599
+ CreateCmpXchgInstFun CreateCmpXchg, Instruction *MetadataSrc ) {
1595
1600
LLVMContext &Ctx = Builder.getContext ();
1596
1601
BasicBlock *BB = Builder.GetInsertBlock ();
1597
1602
Function *F = BB->getParent ();
@@ -1637,7 +1642,7 @@ Value *AtomicExpandImpl::insertRMWCmpXchgLoop(
1637
1642
MemOpOrder == AtomicOrdering::Unordered
1638
1643
? AtomicOrdering::Monotonic
1639
1644
: MemOpOrder,
1640
- SSID, Success, NewLoaded);
1645
+ SSID, Success, NewLoaded, MetadataSrc );
1641
1646
assert (Success && NewLoaded);
1642
1647
1643
1648
Loaded->addIncoming (NewLoaded, LoopBB);
@@ -1686,7 +1691,7 @@ bool llvm::expandAtomicRMWToCmpXchg(AtomicRMWInst *AI,
1686
1691
return buildAtomicRMWValue (AI->getOperation (), Builder, Loaded,
1687
1692
AI->getValOperand ());
1688
1693
},
1689
- CreateCmpXchg);
1694
+ CreateCmpXchg, /* MetadataSrc= */ AI );
1690
1695
1691
1696
AI->replaceAllUsesWith (Loaded);
1692
1697
AI->eraseFromParent ();
@@ -1838,11 +1843,15 @@ void AtomicExpandImpl::expandAtomicRMWToLibcall(AtomicRMWInst *I) {
1838
1843
expandAtomicRMWToCmpXchg (
1839
1844
I, [this ](IRBuilderBase &Builder, Value *Addr, Value *Loaded,
1840
1845
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) {
1842
1848
// Create the CAS instruction normally...
1843
1849
AtomicCmpXchgInst *Pair = Builder.CreateAtomicCmpXchg (
1844
1850
Addr, Loaded, NewVal, Alignment, MemOpOrder,
1845
1851
AtomicCmpXchgInst::getStrongestFailureOrdering (MemOpOrder), SSID);
1852
+ if (MetadataSrc)
1853
+ Pair->copyMetadata (*MetadataSrc);
1854
+
1846
1855
Success = Builder.CreateExtractValue (Pair, 1 , " success" );
1847
1856
NewLoaded = Builder.CreateExtractValue (Pair, 0 , " newloaded" );
1848
1857
0 commit comments