mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-14 07:31:39 +00:00
Add some comments, and fix a few places that missed setting Changed.
llvm-svn: 154687
This commit is contained in:
parent
84e97c7df2
commit
0387e6b701
@ -898,7 +898,7 @@ bool ObjCARCExpand::runOnFunction(Function &F) {
|
||||
// These calls return their argument verbatim, as a low-level
|
||||
// optimization. However, this makes high-level optimizations
|
||||
// harder. Undo any uses of this optimization that the front-end
|
||||
// emitted here. We'll redo them in a later pass.
|
||||
// emitted here. We'll redo them in the contract pass.
|
||||
Changed = true;
|
||||
Inst->replaceAllUsesWith(cast<CallInst>(Inst)->getArgOperand(0));
|
||||
break;
|
||||
@ -1012,7 +1012,11 @@ bool ObjCARCAPElim::runOnModule(Module &M) {
|
||||
return false;
|
||||
|
||||
// Find the llvm.global_ctors variable, as the first step in
|
||||
// identifying the global constructors.
|
||||
// identifying the global constructors. In theory, unnecessary autorelease
|
||||
// pools could occur anywhere, but in practice it's pretty rare. Global
|
||||
// ctors are a place where autorelease pools get inserted automatically,
|
||||
// so it's pretty common for them to be unnecessary, and it's pretty
|
||||
// profitable to eliminate them.
|
||||
GlobalVariable *GV = M.getGlobalVariable("llvm.global_ctors");
|
||||
if (!GV)
|
||||
return false;
|
||||
@ -2278,6 +2282,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
|
||||
case IC_DestroyWeak: {
|
||||
CallInst *CI = cast<CallInst>(Inst);
|
||||
if (isNullOrUndef(CI->getArgOperand(0))) {
|
||||
Changed = true;
|
||||
Type *Ty = CI->getArgOperand(0)->getType();
|
||||
new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()),
|
||||
Constant::getNullValue(Ty),
|
||||
@ -2293,6 +2298,7 @@ void ObjCARCOpt::OptimizeIndividualCalls(Function &F) {
|
||||
CallInst *CI = cast<CallInst>(Inst);
|
||||
if (isNullOrUndef(CI->getArgOperand(0)) ||
|
||||
isNullOrUndef(CI->getArgOperand(1))) {
|
||||
Changed = true;
|
||||
Type *Ty = CI->getArgOperand(0)->getType();
|
||||
new StoreInst(UndefValue::get(cast<PointerType>(Ty)->getElementType()),
|
||||
Constant::getNullValue(Ty),
|
||||
@ -3180,6 +3186,8 @@ void ObjCARCOpt::MoveCalls(Value *Arg,
|
||||
}
|
||||
}
|
||||
|
||||
/// PerformCodePlacement - Identify pairings between the retains and releases,
|
||||
/// and delete and/or move them.
|
||||
bool
|
||||
ObjCARCOpt::PerformCodePlacement(DenseMap<const BasicBlock *, BBState>
|
||||
&BBStates,
|
||||
@ -3193,6 +3201,7 @@ ObjCARCOpt::PerformCodePlacement(DenseMap<const BasicBlock *, BBState>
|
||||
SmallVector<Instruction *, 4> NewReleases;
|
||||
SmallVector<Instruction *, 8> DeadInsts;
|
||||
|
||||
// Visit each retain.
|
||||
for (MapVector<Value *, RRInfo>::const_iterator I = Retains.begin(),
|
||||
E = Retains.end(); I != E; ++I) {
|
||||
Value *V = I->first;
|
||||
@ -3666,6 +3675,7 @@ bool ObjCARCOpt::doInitialization(Module &M) {
|
||||
if (!EnableARCOpts)
|
||||
return false;
|
||||
|
||||
// If nothing in the Module uses ARC, don't do anything.
|
||||
Run = ModuleHasARC(M);
|
||||
if (!Run)
|
||||
return false;
|
||||
@ -4000,6 +4010,7 @@ void ObjCARCContract::ContractRelease(Instruction *Release,
|
||||
}
|
||||
|
||||
bool ObjCARCContract::doInitialization(Module &M) {
|
||||
// If nothing in the Module uses ARC, don't do anything.
|
||||
Run = ModuleHasARC(M);
|
||||
if (!Run)
|
||||
return false;
|
||||
@ -4075,6 +4086,7 @@ bool ObjCARCContract::runOnFunction(Function &F) {
|
||||
--BBI;
|
||||
while (isNoopInstruction(BBI)) --BBI;
|
||||
if (&*BBI == GetObjCArg(Inst)) {
|
||||
Changed = true;
|
||||
InlineAsm *IA =
|
||||
InlineAsm::get(FunctionType::get(Type::getVoidTy(Inst->getContext()),
|
||||
/*isVarArg=*/false),
|
||||
@ -4124,6 +4136,13 @@ bool ObjCARCContract::runOnFunction(Function &F) {
|
||||
Use &U = UI.getUse();
|
||||
unsigned OperandNo = UI.getOperandNo();
|
||||
++UI; // Increment UI now, because we may unlink its element.
|
||||
|
||||
// If the call's return value dominates a use of the call's argument
|
||||
// value, rewrite the use to use the return value. We check for
|
||||
// reachability here because an unreachable call is considered to
|
||||
// trivially dominate itself, which would lead us to rewriting its
|
||||
// argument in terms of its return value, which would lead to
|
||||
// infinite loops in GetObjCArg.
|
||||
if (DT->isReachableFromEntry(U) &&
|
||||
DT->dominates(Inst, U)) {
|
||||
Changed = true;
|
||||
@ -4138,6 +4157,9 @@ bool ObjCARCContract::runOnFunction(Function &F) {
|
||||
if (Replacement->getType() != UseTy)
|
||||
Replacement = new BitCastInst(Replacement, UseTy, "",
|
||||
&BB->back());
|
||||
// While we're here, rewrite all edges for this PHI, rather
|
||||
// than just one use at a time, to minimize the number of
|
||||
// bitcasts we emit.
|
||||
for (unsigned i = 0, e = PHI->getNumIncomingValues();
|
||||
i != e; ++i)
|
||||
if (PHI->getIncomingBlock(i) == BB) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user