[MemCpyOpt] Use the raw i8* dest when optimizing memset+memcpy.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 21 Apr 2015 21:28:33 +0000 (21:28 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 21 Apr 2015 21:28:33 +0000 (21:28 +0000)
commit0f32a037ef13c6b0f0a9509a294e6607776f65f0
tree55b83dd01df4141ec6a7a3e96562e14dea82d9b1
parenta42f6b9a5850034b032615bfec29f10d3bc6708c
[MemCpyOpt] Use the raw i8* dest when optimizing memset+memcpy.

MemIntrinsic::getDest() looks through pointer casts, and using it
directly when building the new GEP+memset results in stuff like:

  %0 = getelementptr i64* %p, i32 16
  %1 = bitcast i64* %0 to i8*
  call ..memset(i8* %1, ...)

instead of the correct:

  %0 = bitcast i64* %p to i8*
  %1 = getelementptr i8* %0, i32 16
  call ..memset(i8* %1, ...)

Instead, use getRawDest, which just gives you the i8* value.
While there, use the memcpy's dest, as it's live anyway.

In most cases, when the optimization triggers, the memset and memcpy
sizes are the same, so the built memset is 0-sized and eliminated.
The problem occurs when they're different.

Fixes a regression caused by r235232: PR23300.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@235419 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/MemCpyOptimizer.cpp
test/Transforms/MemCpyOpt/memset-memcpy-redundant-memset.ll