fix PR8267 - Instcombine shouldn't optimizer away volatile memcpy's.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115296 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-10-01 05:51:02 +00:00
parent e94aa76d2a
commit 6eff75104e
2 changed files with 18 additions and 4 deletions

View File

@ -280,7 +280,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
// memmove/cpy/set of zero bytes is a noop. // memmove/cpy/set of zero bytes is a noop.
if (Constant *NumBytes = dyn_cast<Constant>(MI->getLength())) { if (Constant *NumBytes = dyn_cast<Constant>(MI->getLength())) {
if (NumBytes->isNullValue()) return EraseInstFromFunction(CI); if (NumBytes->isNullValue())
return EraseInstFromFunction(CI);
if (ConstantInt *CI = dyn_cast<ConstantInt>(NumBytes)) if (ConstantInt *CI = dyn_cast<ConstantInt>(NumBytes))
if (CI->getZExtValue() == 1) { if (CI->getZExtValue() == 1) {
@ -290,6 +291,10 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
} }
} }
// No other transformations apply to volatile transfers.
if (MI->isVolatile())
return 0;
// If we have a memmove and the source operation is a constant global, // If we have a memmove and the source operation is a constant global,
// then the source and dest pointers can't alias, so we can change this // then the source and dest pointers can't alias, so we can change this
// into a call to memcpy. // into a call to memcpy.

View File

@ -2,9 +2,18 @@
declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
define void @test4(i8* %a) { define void @test1(i8* %a) {
tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a, i8* %a, i32 100, i32 1, i1 false) tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a, i8* %a, i32 100, i32 1, i1 false)
ret void ret void
} ; CHECK: define void @test1
; CHECK: define void @test4
; CHECK-NEXT: ret void ; CHECK-NEXT: ret void
}
; PR8267
define void @test2(i8* %a) {
tail call void @llvm.memcpy.p0i8.p0i8.i32(i8* %a, i8* %a, i32 100, i32 1, i1 true)
ret void
; CHECK: define void @test2
; CHECK-NEXT: call void @llvm.memcpy
}