@@ -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 ,
@@ -1591,7 +1595,7 @@ Value *AtomicExpandImpl::insertRMWCmpXchgLoop(
1591
1595
IRBuilderBase &Builder, Type *ResultTy, Value *Addr, Align AddrAlign,
1592
1596
AtomicOrdering MemOpOrder, SyncScope::ID SSID,
1593
1597
function_ref<Value *(IRBuilderBase &, Value *)> PerformOp,
1594
- CreateCmpXchgInstFun CreateCmpXchg) {
1598
+ CreateCmpXchgInstFun CreateCmpXchg, Instruction *MetadataSrc ) {
1595
1599
LLVMContext &Ctx = Builder.getContext ();
1596
1600
BasicBlock *BB = Builder.GetInsertBlock ();
1597
1601
Function *F = BB->getParent ();
@@ -1637,7 +1641,7 @@ Value *AtomicExpandImpl::insertRMWCmpXchgLoop(
1637
1641
MemOpOrder == AtomicOrdering::Unordered
1638
1642
? AtomicOrdering::Monotonic
1639
1643
: MemOpOrder,
1640
- SSID, Success, NewLoaded);
1644
+ SSID, Success, NewLoaded, MetadataSrc );
1641
1645
assert (Success && NewLoaded);
1642
1646
1643
1647
Loaded->addIncoming (NewLoaded, LoopBB);
@@ -1686,7 +1690,7 @@ bool llvm::expandAtomicRMWToCmpXchg(AtomicRMWInst *AI,
1686
1690
return buildAtomicRMWValue (AI->getOperation (), Builder, Loaded,
1687
1691
AI->getValOperand ());
1688
1692
},
1689
- CreateCmpXchg);
1693
+ CreateCmpXchg, /* MetadataSrc= */ AI );
1690
1694
1691
1695
AI->replaceAllUsesWith (Loaded);
1692
1696
AI->eraseFromParent ();
@@ -1838,11 +1842,15 @@ void AtomicExpandImpl::expandAtomicRMWToLibcall(AtomicRMWInst *I) {
1838
1842
expandAtomicRMWToCmpXchg (
1839
1843
I, [this ](IRBuilderBase &Builder, Value *Addr, Value *Loaded,
1840
1844
Value *NewVal, Align Alignment, AtomicOrdering MemOpOrder,
1841
- SyncScope::ID SSID, Value *&Success, Value *&NewLoaded) {
1845
+ SyncScope::ID SSID, Value *&Success, Value *&NewLoaded,
1846
+ Instruction *MetadataSrc) {
1842
1847
// Create the CAS instruction normally...
1843
1848
AtomicCmpXchgInst *Pair = Builder.CreateAtomicCmpXchg (
1844
1849
Addr, Loaded, NewVal, Alignment, MemOpOrder,
1845
1850
AtomicCmpXchgInst::getStrongestFailureOrdering (MemOpOrder), SSID);
1851
+ if (MetadataSrc)
1852
+ Pair->copyMetadata (*MetadataSrc);
1853
+
1846
1854
Success = Builder.CreateExtractValue (Pair, 1 , " success" );
1847
1855
NewLoaded = Builder.CreateExtractValue (Pair, 0 , " newloaded" );
1848
1856
0 commit comments