[llvm] [BPF] Handle certain mem intrinsic functions with addr-space arguments (PR #160025)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 6 11:00:49 PDT 2025
================
@@ -493,21 +559,69 @@ bool BPFCheckAndAdjustIR::insertASpaceCasts(Module &M) {
for (Function &F : M) {
DenseMap<Value *, Value *> CastsCache;
for (BasicBlock &BB : F) {
- for (Instruction &I : BB) {
+ for (Instruction &I : llvm::make_early_inc_range(BB)) {
unsigned PtrOpNum;
- if (auto *LD = dyn_cast<LoadInst>(&I))
+ if (auto *LD = dyn_cast<LoadInst>(&I)) {
PtrOpNum = LD->getPointerOperandIndex();
- else if (auto *ST = dyn_cast<StoreInst>(&I))
+ aspaceWrapOperand(CastsCache, &I, PtrOpNum);
+ continue;
+ }
+ if (auto *ST = dyn_cast<StoreInst>(&I)) {
PtrOpNum = ST->getPointerOperandIndex();
- else if (auto *CmpXchg = dyn_cast<AtomicCmpXchgInst>(&I))
+ aspaceWrapOperand(CastsCache, &I, PtrOpNum);
+ continue;
+ }
+ if (auto *CmpXchg = dyn_cast<AtomicCmpXchgInst>(&I)) {
PtrOpNum = CmpXchg->getPointerOperandIndex();
- else if (auto *RMW = dyn_cast<AtomicRMWInst>(&I))
+ aspaceWrapOperand(CastsCache, &I, PtrOpNum);
+ continue;
+ }
+ if (auto *RMW = dyn_cast<AtomicRMWInst>(&I)) {
PtrOpNum = RMW->getPointerOperandIndex();
- else
+ aspaceWrapOperand(CastsCache, &I, PtrOpNum);
continue;
+ }
+
+ auto *CI = dyn_cast<CallInst>(&I);
+ if (!CI)
+ continue;
+
+ Function *Callee = CI->getCalledFunction();
+ if (!Callee || !Callee->isIntrinsic())
+ continue;
+
+ // Check memset/memcpy/memmove
+ Intrinsic::ID ID = Callee->getIntrinsicID();
+ bool IsSet = ID == Intrinsic::memset;
+ bool IsCpy = ID == Intrinsic::memcpy;
+ bool IsMove = ID == Intrinsic::memmove;
----------------
eddyz87 wrote:
I've checked if there are some other intrinsics we need to care about and found these:
- `Intrinsic::memcpy_inline`, available as a builtin function ([link](https://clang.llvm.org/docs/LanguageExtensions.html#guaranteed-inlined-memset))
- `Intrinsic::memset_inline`, same
- `Intrinsic::memcpy_element_unordered_atomic`, `Intrinsic::memmove_element_unordered_atomic`, `Intrinsic::memset_element_unordered_atomic` -- see the code to handle these, but don't see any code that introduces them.
- `Intrinsic::experimental_memset_pattern` -- `LoopIdiomRecognize::processLoopStridedStore` can introduce these.
- there are also a some vector related intrinsics, but I assume these are irrelevant.
https://github.com/llvm/llvm-project/pull/160025
More information about the llvm-commits
mailing list