[OpenACC][NFC] Simplify Reduction Recipe Storage (#163393)

The inheritence link between the Reduction Recipe and the version with
storage made it overly complicated of an implementation for near zero
gain. This patch removes that link, and uses the private constructor of
the non-storage version to ensure only the 'right' ones get created in
the right place.
This commit is contained in:
Erich Keane 2025-10-14 07:05:15 -07:00 committed by GitHub
parent 45495b5b5d
commit cc6d4d5572
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 32 deletions

View File

@ -1301,46 +1301,25 @@ struct OpenACCReductionRecipe {
// AST), or in a separate collection when being semantically analyzed.
llvm::ArrayRef<CombinerRecipe> CombinerRecipes;
bool isSet() const { return AllocaDecl; }
private:
friend class OpenACCReductionClause;
OpenACCReductionRecipe(VarDecl *A, llvm::ArrayRef<CombinerRecipe> Combiners)
: AllocaDecl(A), CombinerRecipes(Combiners) {}
bool isSet() const { return AllocaDecl; }
};
// A version of the above that is used for semantic analysis, at a time before
// the OpenACCReductionClause node has been created. This one has storage for
// the CombinerRecipe, since Trailing storage for it doesn't exist yet.
struct OpenACCReductionRecipeWithStorage : OpenACCReductionRecipe {
private:
llvm::SmallVector<CombinerRecipe, 1> CombinerRecipeStorage;
public:
OpenACCReductionRecipeWithStorage(VarDecl *A,
llvm::ArrayRef<CombinerRecipe> Combiners)
: OpenACCReductionRecipe(A, {}), CombinerRecipeStorage(Combiners) {
CombinerRecipes = CombinerRecipeStorage;
}
struct OpenACCReductionRecipeWithStorage {
VarDecl *AllocaDecl;
llvm::SmallVector<OpenACCReductionRecipe::CombinerRecipe, 1> CombinerRecipes;
OpenACCReductionRecipeWithStorage(
const OpenACCReductionRecipeWithStorage &Other)
: OpenACCReductionRecipe(Other),
CombinerRecipeStorage(Other.CombinerRecipeStorage) {
CombinerRecipes = CombinerRecipeStorage;
}
OpenACCReductionRecipeWithStorage(OpenACCReductionRecipeWithStorage &&Other)
: OpenACCReductionRecipe(std::move(Other)),
CombinerRecipeStorage(std::move(Other.CombinerRecipeStorage)) {
CombinerRecipes = CombinerRecipeStorage;
}
// There is no real problem implementing these, we just have to make sure the
// array-ref this inherits from stays in sync. But as we don't need it at the
// moment, make sure we don't accidentially call these.
OpenACCReductionRecipeWithStorage &
operator=(OpenACCReductionRecipeWithStorage &&) = delete;
OpenACCReductionRecipeWithStorage &
operator=(const OpenACCReductionRecipeWithStorage &) = delete;
VarDecl *A,
llvm::ArrayRef<OpenACCReductionRecipe::CombinerRecipe> Combiners)
: AllocaDecl(A), CombinerRecipes(Combiners) {}
static OpenACCReductionRecipeWithStorage Empty() {
return OpenACCReductionRecipeWithStorage(/*AllocaDecl=*/nullptr, {});

View File

@ -509,7 +509,7 @@ OpenACCReductionClause *OpenACCReductionClause::Create(
ArrayRef<OpenACCReductionRecipeWithStorage> Recipes,
SourceLocation EndLoc) {
size_t NumCombiners = llvm::accumulate(
Recipes, 0, [](size_t Num, const OpenACCReductionRecipe &R) {
Recipes, 0, [](size_t Num, const OpenACCReductionRecipeWithStorage &R) {
return Num + R.CombinerRecipes.size();
});