mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-04 03:17:51 +00:00
Use the new Use-aware dominates method to apply the objc runtime
library return value optimization for phi uses. Even when the phi itself is not dominated, the specific use may be dominated. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154647 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
aab3c0cb07
commit
6c189ecbe6
@ -4109,16 +4109,12 @@ bool ObjCARCContract::runOnFunction(Function &F) {
|
||||
Use &U = UI.getUse();
|
||||
unsigned OperandNo = UI.getOperandNo();
|
||||
++UI; // Increment UI now, because we may unlink its element.
|
||||
Instruction *UserInst = dyn_cast<Instruction>(U.getUser());
|
||||
if (!UserInst)
|
||||
continue;
|
||||
// FIXME: dominates should return true for unreachable UserInst.
|
||||
if (DT->isReachableFromEntry(UserInst->getParent()) &&
|
||||
DT->dominates(Inst, UserInst)) {
|
||||
if (DT->isReachableFromEntry(U) &&
|
||||
DT->dominates(Inst, U)) {
|
||||
Changed = true;
|
||||
Instruction *Replacement = Inst;
|
||||
Type *UseTy = U.get()->getType();
|
||||
if (PHINode *PHI = dyn_cast<PHINode>(UserInst)) {
|
||||
if (PHINode *PHI = dyn_cast<PHINode>(U.getUser())) {
|
||||
// For PHI nodes, insert the bitcast in the predecessor block.
|
||||
unsigned ValNo =
|
||||
PHINode::getIncomingValueNumForOperand(OperandNo);
|
||||
@ -4139,7 +4135,8 @@ bool ObjCARCContract::runOnFunction(Function &F) {
|
||||
}
|
||||
} else {
|
||||
if (Replacement->getType() != UseTy)
|
||||
Replacement = new BitCastInst(Replacement, UseTy, "", UserInst);
|
||||
Replacement = new BitCastInst(Replacement, UseTy, "",
|
||||
cast<Instruction>(U.getUser()));
|
||||
U.set(Replacement);
|
||||
}
|
||||
}
|
||||
|
@ -143,3 +143,21 @@ define i8* @test7(i8* %p) {
|
||||
%2 = tail call i8* @objc_autoreleaseReturnValue(i8* %p)
|
||||
ret i8* %p
|
||||
}
|
||||
|
||||
; Do the return value substitution for PHI nodes too.
|
||||
|
||||
; CHECK: define i8* @test8(
|
||||
; CHECK: %retval = phi i8* [ %p, %if.then ], [ null, %entry ]
|
||||
; CHECK: }
|
||||
define i8* @test8(i1 %x, i8* %c) {
|
||||
entry:
|
||||
br i1 %x, label %return, label %if.then
|
||||
|
||||
if.then: ; preds = %entry
|
||||
%p = call i8* @objc_retain(i8* %c) nounwind
|
||||
br label %return
|
||||
|
||||
return: ; preds = %if.then, %entry
|
||||
%retval = phi i8* [ %c, %if.then ], [ null, %entry ]
|
||||
ret i8* %retval
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user