@@ -193,15 +193,50 @@ struct RISCVCallReturnHandler : public RISCVIncomingValueHandler {
193
193
RISCVCallLowering::RISCVCallLowering (const RISCVTargetLowering &TLI)
194
194
: CallLowering(&TLI) {}
195
195
196
+ // TODO: Support all argument types.
197
+ static bool isSupportedArgumentType (Type *T, const RISCVSubtarget &Subtarget) {
198
+ // TODO: Integers larger than 2*XLen are passed indirectly which is not
199
+ // supported yet.
200
+ if (T->isIntegerTy ())
201
+ return T->getIntegerBitWidth () <= Subtarget.getXLen () * 2 ;
202
+ if (T->isPointerTy ())
203
+ return true ;
204
+ return false ;
205
+ }
206
+
207
+ // TODO: Only integer, pointer and aggregate types are supported now.
208
+ static bool isSupportedReturnType (Type *T, const RISCVSubtarget &Subtarget) {
209
+ // TODO: Integers larger than 2*XLen are passed indirectly which is not
210
+ // supported yet.
211
+ if (T->isIntegerTy ())
212
+ return T->getIntegerBitWidth () <= Subtarget.getXLen () * 2 ;
213
+ if (T->isPointerTy ())
214
+ return true ;
215
+
216
+ if (T->isArrayTy ())
217
+ return isSupportedReturnType (T->getArrayElementType (), Subtarget);
218
+
219
+ if (T->isStructTy ()) {
220
+ auto StructT = cast<StructType>(T);
221
+ for (unsigned i = 0 , e = StructT->getNumElements (); i != e; ++i)
222
+ if (!isSupportedReturnType (StructT->getElementType (i), Subtarget))
223
+ return false ;
224
+ return true ;
225
+ }
226
+
227
+ return false ;
228
+ }
229
+
196
230
bool RISCVCallLowering::lowerReturnVal (MachineIRBuilder &MIRBuilder,
197
231
const Value *Val,
198
232
ArrayRef<Register> VRegs,
199
233
MachineInstrBuilder &Ret) const {
200
234
if (!Val)
201
235
return true ;
202
236
203
- // TODO: Only integer, pointer and aggregate types are supported now.
204
- if (!Val->getType ()->isIntOrPtrTy () && !Val->getType ()->isAggregateType ())
237
+ const RISCVSubtarget &Subtarget =
238
+ MIRBuilder.getMF ().getSubtarget <RISCVSubtarget>();
239
+ if (!isSupportedReturnType (Val->getType (), Subtarget))
205
240
return false ;
206
241
207
242
MachineFunction &MF = MIRBuilder.getMF ();
@@ -248,13 +283,11 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
248
283
if (F.isVarArg ())
249
284
return false ;
250
285
251
- // TODO: Support all argument types.
286
+ const RISCVSubtarget &Subtarget =
287
+ MIRBuilder.getMF ().getSubtarget <RISCVSubtarget>();
252
288
for (auto &Arg : F.args ()) {
253
- if (Arg.getType ()->isIntegerTy ())
254
- continue ;
255
- if (Arg.getType ()->isPointerTy ())
256
- continue ;
257
- return false ;
289
+ if (!isSupportedArgumentType (Arg.getType (), Subtarget))
290
+ return false ;
258
291
}
259
292
260
293
MachineFunction &MF = MIRBuilder.getMF ();
@@ -292,15 +325,11 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
292
325
const Function &F = MF.getFunction ();
293
326
CallingConv::ID CC = F.getCallingConv ();
294
327
295
- // TODO: Support all argument types.
328
+ const RISCVSubtarget &Subtarget =
329
+ MIRBuilder.getMF ().getSubtarget <RISCVSubtarget>();
296
330
for (auto &AInfo : Info.OrigArgs ) {
297
- if (AInfo.Ty ->isIntegerTy ())
298
- continue ;
299
- if (AInfo.Ty ->isPointerTy ())
300
- continue ;
301
- if (AInfo.Ty ->isFloatingPointTy ())
302
- continue ;
303
- return false ;
331
+ if (!isSupportedArgumentType (AInfo.Ty , Subtarget))
332
+ return false ;
304
333
}
305
334
306
335
SmallVector<ArgInfo, 32 > SplitArgInfos;
@@ -337,8 +366,7 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
337
366
if (Info.OrigRet .Ty ->isVoidTy ())
338
367
return true ;
339
368
340
- // TODO: Only integer, pointer and aggregate types are supported now.
341
- if (!Info.OrigRet .Ty ->isIntOrPtrTy () && !Info.OrigRet .Ty ->isAggregateType ())
369
+ if (!isSupportedReturnType (Info.OrigRet .Ty , Subtarget))
342
370
return false ;
343
371
344
372
SmallVector<ArgInfo, 4 > SplitRetInfos;
0 commit comments