-
Notifications
You must be signed in to change notification settings - Fork 13.4k
[instcombine] Adjust style of MemIntrinsic code to be more idiomatic [nfc] #138715
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
…[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.)
@llvm/pr-subscribers-llvm-transforms Author: Philip Reames (preames) ChangesUse 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. Full diff: https://github.com/llvm/llvm-project/pull/138715.diff 1 Files Affected:
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
|
You can test this locally with the following command:git-clang-format --diff HEAD~1 HEAD --extensions cpp -- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp View the diff from clang-format here.diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
index 6ea09ed60..89453f588 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1722,9 +1722,9 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
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() };
+ Type *Tys[3] = {CI.getArgOperand(0)->getType(),
+ CI.getArgOperand(1)->getType(),
+ CI.getArgOperand(2)->getType()};
CI.setCalledFunction(
Intrinsic::getOrInsertDeclaration(M, MemCpyID, Tys));
return II;
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
…[nfc] (llvm#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.
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.