aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2008-02-19 07:07:51 +0000
committerOwen Anderson <resistor@mac.com>2008-02-19 07:07:51 +0000
commit967552e7ec48007b3bb22608134a24f2de490a6e (patch)
treedf6032d9f2ec581135f3ad67a3c6e3e9cb6e8512
parente42ce73c3737a8e49339c74a8c4c76ab8394947f (diff)
Refactor this method a bit, and correct a test that was completely wrong but happened to work out anyways. :-)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47321 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Scalar/GVN.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/Transforms/Scalar/GVN.cpp b/lib/Transforms/Scalar/GVN.cpp
index 738c4ea1d1..2ecc0e5d1f 100644
--- a/lib/Transforms/Scalar/GVN.cpp
+++ b/lib/Transforms/Scalar/GVN.cpp
@@ -1083,6 +1083,8 @@ static bool isReturnSlotOptznProfitable(Value* dest, MemCpyInst* cpy) {
/// rather than using memcpy
bool GVN::performReturnSlotOptzn(MemCpyInst* cpy, CallInst* C,
SmallVector<Instruction*, 4>& toErase) {
+ // Deliberately get the source and destination with bitcasts stripped away,
+ // because we'll need to do type comparisons based on the underlying type.
Value* cpyDest = cpy->getDest();
Value* cpySrc = cpy->getSource();
CallSite CS = CallSite::get(C);
@@ -1097,23 +1099,25 @@ bool GVN::performReturnSlotOptzn(MemCpyInst* cpy, CallInst* C,
!CS.paramHasAttr(1, ParamAttr::NoAlias | ParamAttr::StructRet))
return false;
- // We only perform the transformation if it will be profitable.
- if (!isReturnSlotOptznProfitable(cpyDest, cpy))
- return false;
-
// Check that something sneaky is not happening involving casting
// return slot types around.
if (CS.getArgument(0)->getType() != cpyDest->getType())
return false;
+ // sret --> pointer
+ const PointerType* PT = cast<PointerType>(cpyDest->getType());
// We can only perform the transformation if the size of the memcpy
// is constant and equal to the size of the structure.
- if (!isa<ConstantInt>(cpy->getLength()))
+ ConstantInt* cpyLength = dyn_cast<ConstantInt>(cpy->getLength());
+ if (!cpyLength)
return false;
- ConstantInt* cpyLength = cast<ConstantInt>(cpy->getLength());
TargetData& TD = getAnalysis<TargetData>();
- if (TD.getTypeStoreSize(cpyDest->getType()) == cpyLength->getZExtValue())
+ if (TD.getTypeStoreSize(PT->getElementType()) != cpyLength->getZExtValue())
+ return false;
+
+ // We only perform the transformation if it will be profitable.
+ if (!isReturnSlotOptznProfitable(cpyDest, cpy))
return false;
// In addition to knowing that the call does not access the return slot