Slightly generalize transformation of memmove(a,a,n) so that it also applies

to memcpy. (Such a memcpy is technically illegal, but in practice is safe
and is generated by struct self-assignment in C code.)



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91621 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eli Friedman 2009-12-17 21:07:31 +00:00
parent 88cd3582b6
commit 0c826d98b3
2 changed files with 13 additions and 1 deletions

View File

@ -9896,9 +9896,11 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
Intrinsic::getDeclaration(M, MemCpyID, Tys, 1));
Changed = true;
}
}
if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) {
// memmove(x,x,size) -> noop.
if (MMI->getSource() == MMI->getDest())
if (MTI->getSource() == MTI->getDest())
return EraseInstFromFunction(CI);
}

View File

@ -0,0 +1,10 @@
; RUN: opt < %s -instcombine -S | FileCheck %s
declare void @llvm.memcpy.i32(i8*, i8*, i32, i32)
define void @test4(i8* %a) {
tail call void @llvm.memcpy.i32( i8* %a, i8* %a, i32 100, i32 1 )
ret void
}
; CHECK: define void @test4
; CHECK-NEXT: ret void