[llvm-branch-commits] [flang] [flang][OpenMP] lower simple array reductions (PR #84958)
Kiran Chandramohan via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Mar 17 15:41:24 PDT 2024
================
@@ -92,10 +93,42 @@ std::string ReductionProcessor::getReductionName(llvm::StringRef name,
if (isByRef)
byrefAddition = "_byref";
- return (llvm::Twine(name) +
- (ty.isIntOrIndex() ? llvm::Twine("_i_") : llvm::Twine("_f_")) +
- llvm::Twine(ty.getIntOrFloatBitWidth()) + byrefAddition)
- .str();
+ if (fir::isa_trivial(ty))
+ return (llvm::Twine(name) +
+ (ty.isIntOrIndex() ? llvm::Twine("_i_") : llvm::Twine("_f_")) +
+ llvm::Twine(ty.getIntOrFloatBitWidth()) + byrefAddition)
+ .str();
+
+ // creates a name like reduction_i_64_box_ux4x3
+ if (auto boxTy = mlir::dyn_cast_or_null<fir::BaseBoxType>(ty)) {
+ // TODO: support for allocatable boxes:
+ // !fir.box<!fir.heap<!fir.array<...>>>
+ fir::SequenceType seqTy = fir::unwrapRefType(boxTy.getEleTy())
+ .dyn_cast_or_null<fir::SequenceType>();
+ if (!seqTy)
+ return {};
+
+ std::string prefix = getReductionName(
+ name, fir::unwrapSeqOrBoxedSeqType(ty), /*isByRef=*/false);
+ if (prefix.empty())
+ return {};
+ std::stringstream tyStr;
+ tyStr << prefix << "_box_";
+ bool first = true;
+ for (std::int64_t extent : seqTy.getShape()) {
+ if (first)
+ first = false;
+ else
+ tyStr << "x";
+ if (extent == seqTy.getUnknownExtent())
+ tyStr << 'u'; // I'm not sure that '?' is safe in symbol names
+ else
+ tyStr << extent;
+ }
+ return (tyStr.str() + byrefAddition).str();
+ }
+
+ return {};
----------------
kiranchandramohan wrote:
There is a getTypeAsString (https://github.com/llvm/llvm-project/blob/07b18c5e1b7a8ac9347f945da5ffaecc4515f391/flang/lib/Optimizer/Dialect/FIRType.cpp#L520). Can that be used? If it changes existing reduction names then we can move to this in a separate patch.
https://github.com/llvm/llvm-project/pull/84958
More information about the llvm-branch-commits
mailing list