diff options
| author | Chris Lattner <sabre@nondot.org> | 2010-11-18 06:20:47 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2010-11-18 06:20:47 +0000 | 
| commit | 7aeae25c78197800a931d56a10cad062a7711a46 (patch) | |
| tree | cb2e80ff4e2d2e15d7696b4b8ea0b5ca4fbb64bb /llvm/lib/Transforms | |
| parent | 943418414236999bbacd42f0f042240a271e77c1 (diff) | |
| download | bcm5719-llvm-7aeae25c78197800a931d56a10cad062a7711a46.tar.gz bcm5719-llvm-7aeae25c78197800a931d56a10cad062a7711a46.zip | |
fix a small oversight in the "eliminate memcpy from constant global"
optimization.  If the alloca that is "memcpy'd from constant" also has
a memcpy from *it*, ignore it: it is a load.  We now optimize the testcase to:
define void @test2() {
  %B = alloca %T
  %a = bitcast %T* @G to i8*
  %b = bitcast %T* %B to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %a, i64 124, i32 4, i1 false)
  call void @bar(i8* %b)
  ret void
}
previously we would generate:
define void @test() {
  %B = alloca %T
  %b = bitcast %T* %B to i8*
  %G.0 = getelementptr inbounds %T* @G, i32 0, i32 0
  %tmp3 = load i8* %G.0, align 4
  %G.1 = getelementptr inbounds %T* @G, i32 0, i32 1
  %G.15 = bitcast [123 x i8]* %G.1 to i8*
  %1 = bitcast [123 x i8]* %G.1 to i984*
  %srcval = load i984* %1, align 1
  %B.0 = getelementptr inbounds %T* %B, i32 0, i32 0
  store i8 %tmp3, i8* %B.0, align 4
  %B.1 = getelementptr inbounds %T* %B, i32 0, i32 1
  %B.12 = bitcast [123 x i8]* %B.1 to i8*
  %2 = bitcast [123 x i8]* %B.1 to i984*
  store i984 %srcval, i984* %2, align 1
  call void @bar(i8* %b)
  ret void
}
llvm-svn: 119682
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp | 14 | 
1 files changed, 11 insertions, 3 deletions
| diff --git a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp index 8b4f35570d0..6f4f17e20fb 100644 --- a/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp +++ b/llvm/lib/Transforms/Scalar/ScalarReplAggregates.cpp @@ -1789,10 +1789,11 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,    for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI!=E; ++UI) {      User *U = cast<Instruction>(*UI); -    if (LoadInst *LI = dyn_cast<LoadInst>(U)) +    if (LoadInst *LI = dyn_cast<LoadInst>(U)) {        // Ignore non-volatile loads, they are always ok. -      if (!LI->isVolatile()) -        continue; +      if (LI->isVolatile()) return false; +      continue; +    }      if (BitCastInst *BCI = dyn_cast<BitCastInst>(U)) {        // If uses of the bitcast are ok, we are ok. @@ -1814,6 +1815,13 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,      MemTransferInst *MI = dyn_cast<MemTransferInst>(U);      if (MI == 0)        return false; +     +    // If the transfer is using the alloca as a source of the transfer, then +    // it (unless the transfer is volatile). +    if (UI.getOperandNo() == 1) { +      if (MI->isVolatile()) return false; +      continue; +    }      // If we already have seen a copy, reject the second one.      if (TheCopy) return false; | 

