mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-30 04:35:00 +00:00
allow eliminating an alloca that is just copied from an constant global
if it is passed as a byval argument. The byval argument will just be a read, so it is safe to read from the original global instead. This allows us to promote away the %agg.tmp alloca in PR8582 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119686 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a9be1df6d7
commit
6248065194
@ -1811,11 +1811,18 @@ 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 (CallSite CS = U) {
|
||||
// If this is a readonly/readnone call site, then we know it is just a
|
||||
// load and we can ignore it.
|
||||
if (CS.onlyReadsMemory())
|
||||
continue;
|
||||
|
||||
// If this is being passed as a byval argument, the caller is making a
|
||||
// copy, so it is only a read of the alloca.
|
||||
unsigned ArgNo = CS.getArgumentNo(UI);
|
||||
if (CS.paramHasAttr(ArgNo+1, Attribute::ByVal))
|
||||
continue;
|
||||
}
|
||||
|
||||
// If this is isn't our memcpy/memmove, reject it as something we can't
|
||||
// handle.
|
||||
|
@ -81,3 +81,16 @@ define void @test3() {
|
||||
; CHECK-NEXT: call void @bar(i8* %a)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @test4() {
|
||||
%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 @baz(i8* byval %a)
|
||||
; CHECK: @test4
|
||||
; CHECK-NEXT: %a = bitcast %T* @G to i8*
|
||||
; CHECK-NEXT: call void @baz(i8* byval %a)
|
||||
ret void
|
||||
}
|
||||
|
||||
declare void @baz(i8* byval)
|
||||
|
Loading…
x
Reference in New Issue
Block a user