[llvm] [instcombine] Adjust style of MemIntrinsic code to be more idiomatic [nfc] (PR #138715)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Tue May 6 09:15:14 PDT 2025
https://github.com/preames created https://github.com/llvm/llvm-project/pull/138715
Use an existing helper function. Remove the use of a local Changed variable which doesn't seem to interact with surrounding transforms in any meaningful way. (Both memcpy and memmove are MemTransfer instructions, so switching from one to the other doesn't change results.)
Posted for review mostly for a sanity check that I'm not missing something with the logic around the Change flag.
>From 301003ac252a6ca818a213104a0ee6b461196f9f Mon Sep 17 00:00:00 2001
From: Philip Reames <preames at rivosinc.com>
Date: Tue, 6 May 2025 09:02:10 -0700
Subject: [PATCH] [instcombine] Adjust style of MemIntrinsic code to be more
idiomatic [nfc]
Use an existing helper function. Remove the use of a local Changed variable
which doesn't seem to interact with surrounding transforms in any meaningful
way. (Both memcpy and memmove are MemTransfer instructions, so switching
from one to the other doesn't change results.)
---
.../InstCombine/InstCombineCalls.cpp | 47 +++++++++----------
1 file changed, 21 insertions(+), 26 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 844e18dd7d8c5..6ea09ed60c2f8 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1671,8 +1671,6 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
// Intrinsics cannot occur in an invoke or a callbr, so handle them here
// instead of in visitCallBase.
if (auto *MI = dyn_cast<AnyMemIntrinsic>(II)) {
- bool Changed = false;
-
// memmove/cpy/set of zero bytes is a noop.
if (Constant *NumBytes = dyn_cast<Constant>(MI->getLength())) {
if (NumBytes->isNullValue())
@@ -1680,29 +1678,8 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
}
// No other transformations apply to volatile transfers.
- if (auto *M = dyn_cast<MemIntrinsic>(MI))
- if (M->isVolatile())
- return nullptr;
-
- // If we have a memmove and the source operation is a constant global,
- // then the source and dest pointers can't alias, so we can change this
- // into a call to memcpy.
- if (auto *MMI = dyn_cast<AnyMemMoveInst>(MI)) {
- if (GlobalVariable *GVSrc = dyn_cast<GlobalVariable>(MMI->getSource()))
- if (GVSrc->isConstant()) {
- Module *M = CI.getModule();
- Intrinsic::ID MemCpyID =
- isa<AtomicMemMoveInst>(MMI)
- ? Intrinsic::memcpy_element_unordered_atomic
- : Intrinsic::memcpy;
- Type *Tys[3] = { CI.getArgOperand(0)->getType(),
- CI.getArgOperand(1)->getType(),
- CI.getArgOperand(2)->getType() };
- CI.setCalledFunction(
- Intrinsic::getOrInsertDeclaration(M, MemCpyID, Tys));
- Changed = true;
- }
- }
+ if (MI->isVolatile())
+ return nullptr;
if (AnyMemTransferInst *MTI = dyn_cast<AnyMemTransferInst>(MI)) {
// memmove(x,x,size) -> noop.
@@ -1734,7 +1711,25 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
return eraseInstFromFunction(CI);
}
- if (Changed) return II;
+ // If we have a memmove and the source operation is a constant global,
+ // then the source and dest pointers can't alias, so we can change this
+ // into a call to memcpy.
+ if (auto *MMI = dyn_cast<AnyMemMoveInst>(MI)) {
+ if (GlobalVariable *GVSrc = dyn_cast<GlobalVariable>(MMI->getSource()))
+ if (GVSrc->isConstant()) {
+ Module *M = CI.getModule();
+ Intrinsic::ID MemCpyID =
+ isa<AtomicMemMoveInst>(MMI)
+ ? Intrinsic::memcpy_element_unordered_atomic
+ : Intrinsic::memcpy;
+ Type *Tys[3] = { CI.getArgOperand(0)->getType(),
+ CI.getArgOperand(1)->getType(),
+ CI.getArgOperand(2)->getType() };
+ CI.setCalledFunction(
+ Intrinsic::getOrInsertDeclaration(M, MemCpyID, Tys));
+ return II;
+ }
+ }
}
// For fixed width vector result intrinsics, use the generic demanded vector
More information about the llvm-commits
mailing list