@@ -193,52 +193,15 @@ 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
- // For now we only allow homogeneous structs that we can manipulate with
221
- // G_MERGE_VALUES and G_UNMERGE_VALUES
222
- auto StructT = cast<StructType>(T);
223
- for (unsigned i = 1 , e = StructT->getNumElements (); i != e; ++i)
224
- if (StructT->getElementType (i) != StructT->getElementType (0 ))
225
- return false ;
226
- return isSupportedReturnType (StructT->getElementType (0 ), Subtarget);
227
- }
228
-
229
- return false ;
230
- }
231
-
232
196
bool RISCVCallLowering::lowerReturnVal (MachineIRBuilder &MIRBuilder,
233
197
const Value *Val,
234
198
ArrayRef<Register> VRegs,
235
199
MachineInstrBuilder &Ret) const {
236
200
if (!Val)
237
201
return true ;
238
202
239
- const RISCVSubtarget &Subtarget =
240
- MIRBuilder.getMF ().getSubtarget <RISCVSubtarget>();
241
- if (!isSupportedReturnType (Val->getType (), Subtarget))
203
+ // TODO: Only integer, pointer and aggregate types are supported now.
204
+ if (!Val->getType ()->isIntOrPtrTy () && !Val->getType ()->isAggregateType ())
242
205
return false ;
243
206
244
207
MachineFunction &MF = MIRBuilder.getMF ();
@@ -285,11 +248,13 @@ bool RISCVCallLowering::lowerFormalArguments(MachineIRBuilder &MIRBuilder,
285
248
if (F.isVarArg ())
286
249
return false ;
287
250
288
- const RISCVSubtarget &Subtarget =
289
- MIRBuilder.getMF ().getSubtarget <RISCVSubtarget>();
251
+ // TODO: Support all argument types.
290
252
for (auto &Arg : F.args ()) {
291
- if (!isSupportedArgumentType (Arg.getType (), Subtarget))
292
- return false ;
253
+ if (Arg.getType ()->isIntegerTy ())
254
+ continue ;
255
+ if (Arg.getType ()->isPointerTy ())
256
+ continue ;
257
+ return false ;
293
258
}
294
259
295
260
MachineFunction &MF = MIRBuilder.getMF ();
@@ -327,11 +292,15 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
327
292
const Function &F = MF.getFunction ();
328
293
CallingConv::ID CC = F.getCallingConv ();
329
294
330
- const RISCVSubtarget &Subtarget =
331
- MIRBuilder.getMF ().getSubtarget <RISCVSubtarget>();
295
+ // TODO: Support all argument types.
332
296
for (auto &AInfo : Info.OrigArgs ) {
333
- if (!isSupportedArgumentType (AInfo.Ty , Subtarget))
334
- return false ;
297
+ if (AInfo.Ty ->isIntegerTy ())
298
+ continue ;
299
+ if (AInfo.Ty ->isPointerTy ())
300
+ continue ;
301
+ if (AInfo.Ty ->isFloatingPointTy ())
302
+ continue ;
303
+ return false ;
335
304
}
336
305
337
306
SmallVector<ArgInfo, 32 > SplitArgInfos;
@@ -368,7 +337,8 @@ bool RISCVCallLowering::lowerCall(MachineIRBuilder &MIRBuilder,
368
337
if (Info.OrigRet .Ty ->isVoidTy ())
369
338
return true ;
370
339
371
- if (!isSupportedReturnType (Info.OrigRet .Ty , Subtarget))
340
+ // TODO: Only integer, pointer and aggregate types are supported now.
341
+ if (!Info.OrigRet .Ty ->isIntOrPtrTy () && !Info.OrigRet .Ty ->isAggregateType ())
372
342
return false ;
373
343
374
344
SmallVector<ArgInfo, 4 > SplitRetInfos;
0 commit comments