diff options
author | Alex MacLean <amaclean@nvidia.com> | 2025-04-08 13:44:11 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-08 13:44:11 -0700 |
commit | a6853cd9af40eb330b9aec9762093be077e02f6c (patch) | |
tree | 75f63fdd1742ecb43fc8da4b48d80fd639ff60a8 /llvm/lib/IR/AutoUpgrade.cpp | |
parent | c13436e516ed51bcc6f39b7b5c93d987e5fd7884 (diff) | |
download | llvm-a6853cd9af40eb330b9aec9762093be077e02f6c.zip llvm-a6853cd9af40eb330b9aec9762093be077e02f6c.tar.gz llvm-a6853cd9af40eb330b9aec9762093be077e02f6c.tar.bz2 |
[NVPTX] Auto-Upgrade llvm.nvvm.atomic.load.{inc,dec}.32 (#134111)
These intrinsics can be upgrade to an atomicrmw instruction.
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 963fb1b..0b329d9 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -1302,6 +1302,9 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, else if (Name.consume_front("atomic.load.add.")) // nvvm.atomic.load.add.{f32.p,f64.p} Expand = Name.starts_with("f32.p") || Name.starts_with("f64.p"); + else if (Name.consume_front("atomic.load.") && Name.consume_back(".32")) + // nvvm.atomic.load.{inc,dec}.32 + Expand = Name == "inc" || Name == "dec"; else if (Name.consume_front("bitcast.")) // nvvm.bitcast.{f2i,i2f,ll2d,d2ll} Expand = @@ -2314,6 +2317,12 @@ static Value *upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI, Value *Val = CI->getArgOperand(1); Rep = Builder.CreateAtomicRMW(AtomicRMWInst::FAdd, Ptr, Val, MaybeAlign(), AtomicOrdering::SequentiallyConsistent); + } else if (Name.consume_front("atomic.load.") && Name.consume_back(".32")) { + Value *Ptr = CI->getArgOperand(0); + Value *Val = CI->getArgOperand(1); + auto Op = Name == "inc" ? AtomicRMWInst::UIncWrap : AtomicRMWInst::UDecWrap; + Rep = Builder.CreateAtomicRMW(Op, Ptr, Val, MaybeAlign(), + AtomicOrdering::SequentiallyConsistent); } else if (Name.consume_front("max.") && (Name == "s" || Name == "i" || Name == "ll" || Name == "us" || Name == "ui" || Name == "ull")) { |