@@ -142,16 +142,20 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
142
142
143
143
mlir::ModuleOp getModule () { return getOperation (); }
144
144
145
- template <typename Ty , typename Callback >
145
+ template <typename A , typename B, typename C >
146
146
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" );
155
159
auto resTy = std::get<mlir::Type>(m[0 ]);
156
160
auto attr = std::get<fir::CodeGenSpecifics::Attributes>(m[0 ]);
157
161
if (attr.isSRet ()) {
@@ -166,7 +170,7 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
166
170
newInTyAndAttrs.push_back (m[0 ]);
167
171
newOpers.push_back (stack);
168
172
return [=](mlir::Operation *) -> mlir::Value {
169
- auto memTy = fir::ReferenceType::get (originalResTy );
173
+ auto memTy = fir::ReferenceType::get (ty );
170
174
auto cast = rewriter->create <fir::ConvertOp>(loc, memTy, stack);
171
175
return rewriter->create <fir::LoadOp>(loc, cast);
172
176
};
@@ -176,41 +180,11 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
176
180
// We are going to generate an alloca, so save the stack pointer.
177
181
if (!savedStackPtr)
178
182
savedStackPtr = genStackSave (loc);
179
- return this ->convertValueInMemory (loc, call->getResult (0 ), originalResTy ,
183
+ return this ->convertValueInMemory (loc, call->getResult (0 ), ty ,
180
184
/* inputMayBeBigger=*/ true );
181
185
};
182
186
}
183
187
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
-
214
188
void passArgumentOnStackOrWithNewType (
215
189
mlir::Location loc, fir::CodeGenSpecifics::TypeAndAttr newTypeAndAttr,
216
190
mlir::Type oldType, mlir::Value oper,
@@ -382,11 +356,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
382
356
newInTyAndAttrs, newOpers,
383
357
savedStackPtr);
384
358
})
385
- .template Case <fir::RecordType>([&](fir::RecordType recTy) {
386
- wrap = rewriteCallStructResultType (loc, recTy, newResTys,
387
- newInTyAndAttrs, newOpers,
388
- savedStackPtr);
389
- })
390
359
.Default ([&](mlir::Type ty) { newResTys.push_back (ty); });
391
360
} else if (fnTy.getResults ().size () > 1 ) {
392
361
TODO (loc, " multiple results not supported yet" );
@@ -593,24 +562,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
593
562
}
594
563
}
595
564
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
-
614
565
void
615
566
lowerStructSignatureArg (mlir::Location loc, fir::RecordType recTy,
616
567
fir::CodeGenSpecifics::Marshalling &newInTyAndAttrs) {
@@ -644,9 +595,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
644
595
.Case <mlir::ComplexType>([&](mlir::ComplexType ty) {
645
596
lowerComplexSignatureRes (loc, ty, newResTys, newInTyAndAttrs);
646
597
})
647
- .Case <fir::RecordType>([&](fir::RecordType ty) {
648
- lowerStructSignatureRes (loc, ty, newResTys, newInTyAndAttrs);
649
- })
650
598
.Default ([&](mlir::Type ty) { newResTys.push_back (ty); });
651
599
}
652
600
llvm::SmallVector<mlir::Type> trailingInTys;
@@ -748,8 +696,7 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
748
696
for (auto ty : func.getResults ())
749
697
if ((mlir::isa<fir::BoxCharType>(ty) && !noCharacterConversion) ||
750
698
(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)) {
753
700
LLVM_DEBUG (llvm::dbgs () << " rewrite " << signature << " for target\n " );
754
701
return false ;
755
702
}
@@ -823,9 +770,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
823
770
rewriter->getUnitAttr ()));
824
771
newResTys.push_back (retTy);
825
772
})
826
- .Case <fir::RecordType>([&](fir::RecordType recTy) {
827
- doStructReturn (func, recTy, newResTys, newInTyAndAttrs, fixups);
828
- })
829
773
.Default ([&](mlir::Type ty) { newResTys.push_back (ty); });
830
774
831
775
// Saved potential shift in argument. Handling of result can add arguments
@@ -1118,12 +1062,21 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
1118
1062
return false ;
1119
1063
}
1120
1064
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.
1121
1068
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 );
1127
1080
auto &tup = m[0 ];
1128
1081
auto attr = std::get<fir::CodeGenSpecifics::Attributes>(tup);
1129
1082
auto argTy = std::get<mlir::Type>(tup);
@@ -1164,36 +1117,6 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase<TargetRewrite> {
1164
1117
newResTys.push_back (argTy);
1165
1118
}
1166
1119
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
-
1197
1120
template <typename FIXUPS>
1198
1121
void
1199
1122
createFuncOpArgFixups (mlir::func::FuncOp func,
0 commit comments