-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[mlir][bufferization] Simplify helper potentiallyAliasesMemref
#78690
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -77,18 +77,12 @@ static bool distinctAllocAndBlockArgument(Value v1, Value v2) { | |
return areDistinct(v1Base, v2Base) || areDistinct(v2Base, v1Base); | ||
} | ||
|
||
/// Checks if `memref` may or must alias a MemRef in `otherList`. It is often a | ||
/// requirement of optimization patterns that there cannot be any aliasing | ||
/// memref in order to perform the desired simplification. The `allowSelfAlias` | ||
/// argument indicates whether `memref` may be present in `otherList` which | ||
/// makes this helper function applicable to situations where we already know | ||
/// that `memref` is in the list but also when we don't want it in the list. | ||
/// Checks if `memref` may potentially alias a MemRef in `otherList`. It is | ||
/// often a requirement of optimization patterns that there cannot be any | ||
/// aliasing memref in order to perform the desired simplification. | ||
static bool potentiallyAliasesMemref(AliasAnalysis &analysis, | ||
ValueRange otherList, Value memref, | ||
bool allowSelfAlias) { | ||
ValueRange otherList, Value memref) { | ||
for (auto other : otherList) { | ||
if (allowSelfAlias && other == memref) | ||
continue; | ||
if (distinctAllocAndBlockArgument(other, memref)) | ||
continue; | ||
if (!analysis.alias(other, memref).isNo()) | ||
|
@@ -243,7 +237,7 @@ struct RemoveRetainedMemrefsGuaranteedToNotAlias | |
|
||
for (auto retainedMemref : deallocOp.getRetained()) { | ||
if (potentiallyAliasesMemref(aliasAnalysis, deallocOp.getMemrefs(), | ||
retainedMemref, false)) { | ||
retainedMemref)) { | ||
newRetainedMemrefs.push_back(retainedMemref); | ||
replacements.push_back({}); | ||
continue; | ||
|
@@ -314,11 +308,13 @@ struct SplitDeallocWhenNotAliasingAnyOther | |
|
||
SmallVector<Value> remainingMemrefs, remainingConditions; | ||
SmallVector<SmallVector<Value>> updatedConditions; | ||
for (auto [memref, cond] : | ||
llvm::zip(deallocOp.getMemrefs(), deallocOp.getConditions())) { | ||
for (int64_t i = 0, e = deallocOp.getMemrefs().size(); i < e; ++i) { | ||
Value memref = deallocOp.getMemrefs()[i]; | ||
Value cond = deallocOp.getConditions()[i]; | ||
SmallVector<Value> otherMemrefs(deallocOp.getMemrefs()); | ||
otherMemrefs.erase(otherMemrefs.begin() + i); | ||
Comment on lines
+314
to
+315
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This probably even fixes a bug when the same memref is contained in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried to write a test for that. We have another pattern that removes duplicate memrefs ( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Makes sense. It's a bit annoying that MLIR doesn't have the utility to easily test individual patterns :/ |
||
// Check if `memref` can split off into a separate bufferization.dealloc. | ||
if (potentiallyAliasesMemref(aliasAnalysis, deallocOp.getMemrefs(), | ||
memref, true)) { | ||
if (potentiallyAliasesMemref(aliasAnalysis, otherMemrefs, memref)) { | ||
// `memref` alias with other memrefs, do not split off. | ||
remainingMemrefs.push_back(memref); | ||
remainingConditions.push_back(cond); | ||
|
Uh oh!
There was an error while loading. Please reload this page.