LLVM 17.0.0git
ObjCARCAliasAnalysis.cpp
Go to the documentation of this file.
1//===- ObjCARCAliasAnalysis.cpp - ObjC ARC Optimization -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This file defines a simple ARC-aware AliasAnalysis using special knowledge
10/// of Objective C to enhance other optimization passes which rely on the Alias
11/// Analysis infrastructure.
12///
13/// WARNING: This file knows about certain library functions. It recognizes them
14/// by name, and hardwires knowledge of their semantics.
15///
16/// WARNING: This file knows about how certain Objective-C library functions are
17/// used. Naive LLVM IR transformations which would otherwise be
18/// behavior-preserving may break these assumptions.
19///
20/// TODO: Theoretically we could check for dependencies between objc_* calls
21/// and FMRB_OnlyAccessesArgumentPointees calls or other well-behaved calls.
22///
23//===----------------------------------------------------------------------===//
24
28#include "llvm/IR/Function.h"
30#include "llvm/Pass.h"
31
32#define DEBUG_TYPE "objc-arc-aa"
33
34using namespace llvm;
35using namespace llvm::objcarc;
36
38 const MemoryLocation &LocB,
39 AAQueryInfo &AAQI, const Instruction *) {
40 if (!EnableARCOpts)
41 return AAResultBase::alias(LocA, LocB, AAQI, nullptr);
42
43 // First, strip off no-ops, including ObjC-specific no-ops, and try making a
44 // precise alias query.
45 const Value *SA = GetRCIdentityRoot(LocA.Ptr);
46 const Value *SB = GetRCIdentityRoot(LocB.Ptr);
48 MemoryLocation(SA, LocA.Size, LocA.AATags),
49 MemoryLocation(SB, LocB.Size, LocB.AATags), AAQI, nullptr);
50 if (Result != AliasResult::MayAlias)
51 return Result;
52
53 // If that failed, climb to the underlying object, including climbing through
54 // ObjC-specific no-ops, and try making an imprecise alias query.
55 const Value *UA = GetUnderlyingObjCPtr(SA);
56 const Value *UB = GetUnderlyingObjCPtr(SB);
57 if (UA != SA || UB != SB) {
60 nullptr);
61 // We can't use MustAlias or PartialAlias results here because
62 // GetUnderlyingObjCPtr may return an offsetted pointer value.
63 if (Result == AliasResult::NoAlias)
65 }
66
67 // If that failed, fail. We don't need to chain here, since that's covered
68 // by the earlier precise query.
70}
71
73 AAQueryInfo &AAQI,
74 bool IgnoreLocals) {
75 if (!EnableARCOpts)
76 return AAResultBase::getModRefInfoMask(Loc, AAQI, IgnoreLocals);
77
78 // First, strip off no-ops, including ObjC-specific no-ops, and try making
79 // a precise alias query.
80 const Value *S = GetRCIdentityRoot(Loc.Ptr);
82 MemoryLocation(S, Loc.Size, Loc.AATags), AAQI, IgnoreLocals)))
84
85 // If that failed, climb to the underlying object, including climbing through
86 // ObjC-specific no-ops, and try making an imprecise alias query.
87 const Value *U = GetUnderlyingObjCPtr(S);
88 if (U != S)
90 AAQI, IgnoreLocals);
91
92 // If that failed, fail. We don't need to chain here, since that's covered
93 // by the earlier precise query.
94 return ModRefInfo::ModRef;
95}
96
98 if (!EnableARCOpts)
100
101 switch (GetFunctionClass(F)) {
103 return MemoryEffects::none();
104 default:
105 break;
106 }
107
109}
110
112 const MemoryLocation &Loc,
113 AAQueryInfo &AAQI) {
114 if (!EnableARCOpts)
115 return AAResultBase::getModRefInfo(Call, Loc, AAQI);
116
117 switch (GetBasicARCInstKind(Call)) {
126 // These functions don't access any memory visible to the compiler.
127 // Note that this doesn't include objc_retainBlock, because it updates
128 // pointers when it copies block data.
130 default:
131 break;
132 }
133
134 return AAResultBase::getModRefInfo(Call, Loc, AAQI);
135}
136
137AnalysisKey ObjCARCAA::Key;
138
140 return ObjCARCAAResult(F.getParent()->getDataLayout());
141}
#define F(x, y, z)
Definition: MD5.cpp:55
This file declares a simple ARC-aware AliasAnalysis using special knowledge of Objective C to enhance...
This file defines common analysis utilities used by the ObjC ARC Optimizer.
This class stores info we want to provide to or retain within an alias query.
MemoryEffects getMemoryEffects(const CallBase *Call, AAQueryInfo &AAQI)
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool IgnoreLocals)
ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *I)
The possible results of an alias query.
Definition: AliasAnalysis.h:83
@ MayAlias
The two locations may or may not alias.
@ NoAlias
The two locations do not alias at all.
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:620
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1190
Summary of how a function affects memory in the program.
Definition: ModRef.h:63
static MemoryEffects none()
Create MemoryEffects that cannot read or write any memory.
Definition: ModRef.h:118
Representation for a specific memory location.
LocationSize Size
The maximum size of the location, in address-units, or UnknownSize if the size is not known.
static MemoryLocation getBeforeOrAfter(const Value *Ptr, const AAMDNodes &AATags=AAMDNodes())
Return a location that may access any location before or after Ptr, while remaining within the underl...
AAMDNodes AATags
The metadata nodes which describes the aliasing of the location (each member is null if that kind of ...
const Value * Ptr
The address of the start of the location.
LLVM Value Representation.
Definition: Value.h:74
This is a simple alias analysis implementation that uses knowledge of ARC constructs to answer querie...
MemoryEffects getMemoryEffects(const Function *F)
ModRefInfo getModRefInfoMask(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool IgnoreLocals)
ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, AAQueryInfo &AAQI)
AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB, AAQueryInfo &AAQI, const Instruction *CtxI)
ObjCARCAAResult run(Function &F, FunctionAnalysisManager &AM)
@ FusedRetainAutorelease
objc_retainAutorelease
@ AutoreleasepoolPush
objc_autoreleasePoolPush
@ Autorelease
objc_autorelease
@ RetainRV
objc_retainAutoreleasedReturnValue
@ FusedRetainAutoreleaseRV
objc_retainAutoreleaseReturnValue
@ AutoreleaseRV
objc_autoreleaseReturnValue
@ Call
could call objc_release
@ NoopCast
objc_retainedObject, etc.
ARCInstKind GetFunctionClass(const Function *F)
Determine if F is one of the special known Functions.
bool EnableARCOpts
A handy option to enable/disable all ARC Optimizations.
ARCInstKind GetBasicARCInstKind(const Value *V)
Determine which objc runtime call instruction class V belongs to.
const Value * GetUnderlyingObjCPtr(const Value *V)
This is a wrapper around getUnderlyingObject which also knows how to look through objc_retain and obj...
const Value * GetRCIdentityRoot(const Value *V)
The RCIdentity root of a value V is a dominating value U for which retaining or releasing U is equiva...
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
Definition: ModRef.h:27
@ ModRef
The access may reference and may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
bool isNoModRef(const ModRefInfo MRI)
Definition: ModRef.h:39
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition: PassManager.h:69