mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-18 13:34:04 +00:00
enhance the "alloca is just a memcpy from constant global"
to ignore calls that obviously can't modify the alloca because they are readonly/readnone. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119683 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2e61849f45
commit
a9be1df6d7
@ -34,6 +34,7 @@
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Transforms/Utils/PromoteMemToReg.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Support/CallSite.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/GetElementPtrTypeIterator.h"
|
||||
@ -1810,6 +1811,12 @@ static bool isOnlyCopiedFromConstantGlobal(Value *V, MemTransferInst *&TheCopy,
|
||||
continue;
|
||||
}
|
||||
|
||||
// If this is a readonly/readnone call site, then we know it is just a load
|
||||
// and we can ignore it.
|
||||
if (CallSite CS = U)
|
||||
if (CS.onlyReadsMemory())
|
||||
continue;
|
||||
|
||||
// If this is isn't our memcpy/memmove, reject it as something we can't
|
||||
// handle.
|
||||
MemTransferInst *MI = dyn_cast<MemTransferInst>(U);
|
||||
|
@ -68,3 +68,16 @@ define void @test2() {
|
||||
}
|
||||
|
||||
declare void @bar(i8*)
|
||||
|
||||
|
||||
;; Should be able to eliminate the alloca.
|
||||
define void @test3() {
|
||||
%A = alloca %T
|
||||
%a = bitcast %T* %A to i8*
|
||||
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* bitcast (%T* @G to i8*), i64 124, i32 4, i1 false)
|
||||
call void @bar(i8* %a) readonly
|
||||
; CHECK: @test3
|
||||
; CHECK-NEXT: %a = bitcast %T* @G to i8*
|
||||
; CHECK-NEXT: call void @bar(i8* %a)
|
||||
ret void
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user