mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-14 23:29:51 +00:00
fix PR8267 - Instcombine shouldn't optimizer away volatile memcpy's.
llvm-svn: 115296
This commit is contained in:
parent
c131f7d23b
commit
bf0f375aba
@ -280,7 +280,8 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
|
||||
// memmove/cpy/set of zero bytes is a noop.
|
||||
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 (CI->getZExtValue() == 1) {
|
||||
@ -289,6 +290,10 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
// alignment is sufficient.
|
||||
}
|
||||
}
|
||||
|
||||
// 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,
|
||||
// then the source and dest pointers can't alias, so we can change this
|
||||
|
@ -2,9 +2,18 @@
|
||||
|
||||
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)
|
||||
ret void
|
||||
}
|
||||
; CHECK: define void @test4
|
||||
; CHECK: define void @test1
|
||||
; 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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user