diff options
author | David Green <david.green@arm.com> | 2025-04-08 10:05:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-08 10:05:58 +0100 |
commit | c23e1cb9362067d3565a78590db8c5e68b74cf17 (patch) | |
tree | 0bd06fc9a2c120dc92d94a440c5271ec0e39f2ba /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 9d82ab8a8222f22048074488d5036ae5228088c5 (diff) | |
download | llvm-c23e1cb9362067d3565a78590db8c5e68b74cf17.zip llvm-c23e1cb9362067d3565a78590db8c5e68b74cf17.tar.gz llvm-c23e1cb9362067d3565a78590db8c5e68b74cf17.tar.bz2 |
[BasicAA] Treat ExtractValue(Argument) similar to Argument in relation to function-local objects. (#134716)
This is a much smaller, technically orthogonal patch similar to #134505. It
states that a extractvalue(Argument) can be treated like an Argument for alias
analysis, where the extractelement acts like a phi / copy. No inttoptr here.
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 4d1a95a..12d9c87 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1533,6 +1533,16 @@ AliasResult BasicAAResult::aliasPHI(const PHINode *PN, LocationSize PNSize, return Alias; } +// Return true for an Argument or extractvalue(Argument). These are all known +// to not alias with FunctionLocal objects and can come up from coerced function +// arguments. +static bool isArgumentOrArgumentLike(const Value *V) { + if (isa<Argument>(V)) + return true; + auto *E = dyn_cast<ExtractValueInst>(V); + return E && isa<Argument>(E->getOperand(0)); +} + /// Provides a bunch of ad-hoc rules to disambiguate in common cases, such as /// array references. AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, @@ -1585,8 +1595,8 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, // Function arguments can't alias with things that are known to be // unambigously identified at the function level. - if ((isa<Argument>(O1) && isIdentifiedFunctionLocal(O2)) || - (isa<Argument>(O2) && isIdentifiedFunctionLocal(O1))) + if ((isArgumentOrArgumentLike(O1) && isIdentifiedFunctionLocal(O2)) || + (isArgumentOrArgumentLike(O2) && isIdentifiedFunctionLocal(O1))) return AliasResult::NoAlias; // If one pointer is the result of a call/invoke or load and the other is a |