diff options
author | Duncan Sands <baldrick@free.fr> | 2012-10-05 07:29:46 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2012-10-05 07:29:46 +0000 |
commit | 3372c5a50fba4e4d277ba627a6b711e3df5f493d (patch) | |
tree | 8614dbdb7bd86aa234b07a44a5ed7a40f0d0f72b /lib/Transforms/Scalar | |
parent | e66f3d3ba0ea9f82f65a29c47fc37e997cbf0ace (diff) | |
download | external_llvm-3372c5a50fba4e4d277ba627a6b711e3df5f493d.zip external_llvm-3372c5a50fba4e4d277ba627a6b711e3df5f493d.tar.gz external_llvm-3372c5a50fba4e4d277ba627a6b711e3df5f493d.tar.bz2 |
Move this test a bit later, after the point at which we know that we either
have an alloca or a parameter, since then the alloca test should make sense
to readers, while before it probably appears too specific. No functionality
change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165306 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar')
-rw-r--r-- | lib/Transforms/Scalar/MemCpyOptimizer.cpp | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp index c02d4ce..fba4aae 100644 --- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp +++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp @@ -605,16 +605,6 @@ bool MemCpyOpt::performCallSlotOptzn(Instruction *cpy, if (cpyLen < srcSize) return false; - // Check that dest points to memory that is at least as aligned as src. - unsigned srcAlign = srcAlloca->getAlignment(); - if (!srcAlign) - srcAlign = TD->getABITypeAlignment(srcAlloca->getAllocatedType()); - bool isDestSufficientlyAligned = srcAlign <= cpyAlign; - // If dest is not aligned enough and we can't increase its alignment then - // bail out. - if (!isDestSufficientlyAligned && !isa<AllocaInst>(cpyDest)) - return false; - // Check that accessing the first srcSize bytes of dest will not cause a // trap. Otherwise the transform is invalid since it might cause a trap // to occur earlier than it otherwise would. @@ -644,6 +634,16 @@ bool MemCpyOpt::performCallSlotOptzn(Instruction *cpy, return false; } + // Check that dest points to memory that is at least as aligned as src. + unsigned srcAlign = srcAlloca->getAlignment(); + if (!srcAlign) + srcAlign = TD->getABITypeAlignment(srcAlloca->getAllocatedType()); + bool isDestSufficientlyAligned = srcAlign <= cpyAlign; + // If dest is not aligned enough and we can't increase its alignment then + // bail out. + if (!isDestSufficientlyAligned && !isa<AllocaInst>(cpyDest)) + return false; + // Check that src is not accessed except via the call and the memcpy. This // guarantees that it holds only undefined values when passed in (so the final // memcpy can be dropped), that it is not read or written between the call and |