mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
Don't convert objc_autoreleaseReturnValue to objc_autorelease if the result
is returned through a bitcast. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137402 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2fc75d5d60
commit
126a54f1fa
@ -1925,12 +1925,19 @@ void
|
||||
ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F, Instruction *AutoreleaseRV) {
|
||||
// Check for a return of the pointer value.
|
||||
const Value *Ptr = GetObjCArg(AutoreleaseRV);
|
||||
for (Value::const_use_iterator UI = Ptr->use_begin(), UE = Ptr->use_end();
|
||||
UI != UE; ++UI) {
|
||||
const User *I = *UI;
|
||||
if (isa<ReturnInst>(I) || GetBasicInstructionClass(I) == IC_RetainRV)
|
||||
return;
|
||||
}
|
||||
SmallVector<const Value *, 2> Users;
|
||||
Users.push_back(Ptr);
|
||||
do {
|
||||
Ptr = Users.pop_back_val();
|
||||
for (Value::const_use_iterator UI = Ptr->use_begin(), UE = Ptr->use_end();
|
||||
UI != UE; ++UI) {
|
||||
const User *I = *UI;
|
||||
if (isa<ReturnInst>(I) || GetBasicInstructionClass(I) == IC_RetainRV)
|
||||
return;
|
||||
if (isa<BitCastInst>(I))
|
||||
Users.push_back(I);
|
||||
}
|
||||
} while (!Users.empty());
|
||||
|
||||
Changed = true;
|
||||
++NumPeeps;
|
||||
|
@ -329,3 +329,14 @@ define void @test23(i8* %p) {
|
||||
call i8* @objc_autoreleaseReturnValue(i8* %p)
|
||||
ret void
|
||||
}
|
||||
|
||||
; Don't convert autoreleaseRV to autorelease if the result is returned,
|
||||
; even through a bitcast.
|
||||
|
||||
; CHECK: define {}* @test24(
|
||||
; CHECK: tail call i8* @objc_autoreleaseReturnValue(i8* %p)
|
||||
define {}* @test24(i8* %p) {
|
||||
%t = call i8* @objc_autoreleaseReturnValue(i8* %p)
|
||||
%s = bitcast i8* %p to {}*
|
||||
ret {}* %s
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user