@@ -142,16 +142,20 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
142142
143143 mlir::ModuleOp getModule () { return getOperation (); }
144144
145- template <typename Ty , typename Callback >
145+ template <typename A , typename B, typename C >
146146 std::optional<std::function<mlir::Value(mlir::Operation *)>>
147- rewriteCallResultType (mlir::Location loc, mlir::Type originalResTy,
148- Ty &newResTys,
149- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs,
150- Callback &newOpers, mlir::Value &savedStackPtr,
151- fir::CodeGenSpecifics::Marshalling &m) {
152- // Currently, targets mandate COMPLEX or STRUCT is a single aggregate or
153- // packed scalar, including the sret case.
154- assert (m.size () == 1 && " return type not supported on this target" );
147+ rewriteCallComplexResultType (
148+ mlir::Location loc, A ty, B &newResTys,
149+ fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs, C &newOpers,
150+ mlir::Value &savedStackPtr) {
151+ if (noComplexConversion) {
152+ newResTys.push_back (ty);
153+ return std::nullopt ;
154+ }
155+ auto m = specifics->complexReturnType (loc, ty.getElementType ());
156+ // Currently targets mandate COMPLEX is a single aggregate or packed
157+ // scalar, including the sret case.
158+ assert (m.size () == 1 && " target of complex return not supported" );
155159 auto resTy = std::get<mlir::Type>(m[0 ]);
156160 auto attr = std::get<fir::CodeGenSpecifics::Attributes>(m[0 ]);
157161 if (attr.isSRet ()) {
@@ -166,7 +170,7 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
166170 newInTyAndAttrs.push_back (m[0 ]);
167171 newOpers.push_back (stack);
168172 return [=](mlir::Operation *) -> mlir::Value {
169- auto memTy = fir::ReferenceType::get (originalResTy );
173+ auto memTy = fir::ReferenceType::get (ty );
170174 auto cast = rewriter->create <fir::ConvertOp>(loc, memTy, stack);
171175 return rewriter->create <fir::LoadOp>(loc, cast);
172176 };
@@ -176,41 +180,11 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
176180 // We are going to generate an alloca, so save the stack pointer.
177181 if (!savedStackPtr)
178182 savedStackPtr = genStackSave (loc);
179- return this ->convertValueInMemory (loc, call->getResult (0 ), originalResTy ,
183+ return this ->convertValueInMemory (loc, call->getResult (0 ), ty ,
180184 /* inputMayBeBigger=*/ true );
181185 };
182186 }
183187
184- template <typename Ty, typename Callback>
185- std::optional<std::function<mlir::Value(mlir::Operation *)>>
186- rewriteCallComplexResultType (
187- mlir::Location loc, mlir::ComplexType ty, Ty &newResTys,
188- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs, Callback &newOpers,
189- mlir::Value &savedStackPtr) {
190- if (noComplexConversion) {
191- newResTys.push_back (ty);
192- return std::nullopt ;
193- }
194- auto m = specifics->complexReturnType (loc, ty.getElementType ());
195- return rewriteCallResultType (loc, ty, newResTys, newInTyAndAttrs, newOpers,
196- savedStackPtr, m);
197- }
198-
199- template <typename Ty, typename Callback>
200- std::optional<std::function<mlir::Value(mlir::Operation *)>>
201- rewriteCallStructResultType (
202- mlir::Location loc, fir::RecordType recTy, Ty &newResTys,
203- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs, Callback &newOpers,
204- mlir::Value &savedStackPtr) {
205- if (noStructConversion) {
206- newResTys.push_back (recTy);
207- return std::nullopt ;
208- }
209- auto m = specifics->structReturnType (loc, recTy);
210- return rewriteCallResultType (loc, recTy, newResTys, newInTyAndAttrs,
211- newOpers, savedStackPtr, m);
212- }
213-
214188 void passArgumentOnStackOrWithNewType (
215189 mlir::Location loc, fir::CodeGenSpecifics::TypeAndAttr newTypeAndAttr,
216190 mlir::Type oldType, mlir::Value oper,
@@ -382,11 +356,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
382356 newInTyAndAttrs, newOpers,
383357 savedStackPtr);
384358 })
385- .template Case <fir::RecordType>([&](fir::RecordType recTy) {
386- wrap = rewriteCallStructResultType (loc, recTy, newResTys,
387- newInTyAndAttrs, newOpers,
388- savedStackPtr);
389- })
390359 .Default ([&](mlir::Type ty) { newResTys.push_back (ty); });
391360 } else if (fnTy.getResults ().size () > 1 ) {
392361 TODO (loc, " multiple results not supported yet" );
@@ -593,24 +562,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
593562 }
594563 }
595564
596- template <typename Ty>
597- void
598- lowerStructSignatureRes (mlir::Location loc, fir::RecordType recTy,
599- Ty &newResTys,
600- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs) {
601- if (noComplexConversion) {
602- newResTys.push_back (recTy);
603- return ;
604- } else {
605- for (auto &tup : specifics->structReturnType (loc, recTy)) {
606- if (std::get<fir::CodeGenSpecifics::Attributes>(tup).isSRet ())
607- newInTyAndAttrs.push_back (tup);
608- else
609- newResTys.push_back (std::get<mlir::Type>(tup));
610- }
611- }
612- }
613-
614565 void
615566 lowerStructSignatureArg (mlir::Location loc, fir::RecordType recTy,
616567 fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs) {
@@ -644,9 +595,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
644595 .Case <mlir::ComplexType>([&](mlir::ComplexType ty) {
645596 lowerComplexSignatureRes (loc, ty, newResTys, newInTyAndAttrs);
646597 })
647- .Case <fir::RecordType>([&](fir::RecordType ty) {
648- lowerStructSignatureRes (loc, ty, newResTys, newInTyAndAttrs);
649- })
650598 .Default ([&](mlir::Type ty) { newResTys.push_back (ty); });
651599 }
652600 llvm::SmallVector<mlir::Type> trailingInTys;
@@ -748,8 +696,7 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
748696 for (auto ty : func.getResults ())
749697 if ((mlir::isa<fir::BoxCharType>(ty) && !noCharacterConversion) ||
750698 (fir::isa_complex (ty) && !noComplexConversion) ||
751- (mlir::isa<mlir::IntegerType>(ty) && hasCCallingConv) ||
752- (mlir::isa<fir::RecordType>(ty) && !noStructConversion)) {
699+ (mlir::isa<mlir::IntegerType>(ty) && hasCCallingConv)) {
753700 LLVM_DEBUG (llvm::dbgs () << " rewrite " << signature << " for target\n " );
754701 return false ;
755702 }
@@ -823,9 +770,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
823770 rewriter->getUnitAttr ()));
824771 newResTys.push_back (retTy);
825772 })
826- .Case <fir::RecordType>([&](fir::RecordType recTy) {
827- doStructReturn (func, recTy, newResTys, newInTyAndAttrs, fixups);
828- })
829773 .Default ([&](mlir::Type ty) { newResTys.push_back (ty); });
830774
831775 // Saved potential shift in argument. Handling of result can add arguments
@@ -1118,12 +1062,21 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
11181062 return false ;
11191063 }
11201064
1065+ // / Convert a complex return value. This can involve converting the return
1066+ // / value to a "hidden" first argument or packing the complex into a wide
1067+ // / GPR.
11211068 template <typename Ty, typename FIXUPS>
1122- void doReturn (mlir::func::FuncOp func, Ty &newResTys,
1123- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs,
1124- FIXUPS &fixups, fir::CodeGenSpecifics::Marshalling &m) {
1125- assert (m.size () == 1 &&
1126- " expect result to be turned into single argument or result so far" );
1069+ void doComplexReturn (mlir::func::FuncOp func, mlir::ComplexType cmplx,
1070+ Ty &newResTys,
1071+ fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs,
1072+ FIXUPS &fixups) {
1073+ if (noComplexConversion) {
1074+ newResTys.push_back (cmplx);
1075+ return ;
1076+ }
1077+ auto m =
1078+ specifics->complexReturnType (func.getLoc (), cmplx.getElementType ());
1079+ assert (m.size () == 1 );
11271080 auto &tup = m[0 ];
11281081 auto attr = std::get<fir::CodeGenSpecifics::Attributes>(tup);
11291082 auto argTy = std::get<mlir::Type>(tup);
@@ -1164,36 +1117,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
11641117 newResTys.push_back (argTy);
11651118 }
11661119
1167- // / Convert a complex return value. This can involve converting the return
1168- // / value to a "hidden" first argument or packing the complex into a wide
1169- // / GPR.
1170- template <typename Ty, typename FIXUPS>
1171- void doComplexReturn (mlir::func::FuncOp func, mlir::ComplexType cmplx,
1172- Ty &newResTys,
1173- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs,
1174- FIXUPS &fixups) {
1175- if (noComplexConversion) {
1176- newResTys.push_back (cmplx);
1177- return ;
1178- }
1179- auto m =
1180- specifics->complexReturnType (func.getLoc (), cmplx.getElementType ());
1181- doReturn (func, newResTys, newInTyAndAttrs, fixups, m);
1182- }
1183-
1184- template <typename Ty, typename FIXUPS>
1185- void doStructReturn (mlir::func::FuncOp func, fir::RecordType recTy,
1186- Ty &newResTys,
1187- fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs,
1188- FIXUPS &fixups) {
1189- if (noStructConversion) {
1190- newResTys.push_back (recTy);
1191- return ;
1192- }
1193- auto m = specifics->structReturnType (func.getLoc (), recTy);
1194- doReturn (func, newResTys, newInTyAndAttrs, fixups, m);
1195- }
1196-
11971120 template <typename FIXUPS>
11981121 void
11991122 createFuncOpArgFixups (mlir::func::FuncOp func,
0 commit comments