@@ -175,8 +175,7 @@ struct CachingVPExpander {
175
175
VPIntrinsic &PI);
176
176
177
177
// / Lower this VP int call to a unpredicated int call.
178
- Value *expandPredicationToIntCall (IRBuilder<> &Builder, VPIntrinsic &PI,
179
- unsigned UnpredicatedIntrinsicID);
178
+ Value *expandPredicationToIntCall (IRBuilder<> &Builder, VPIntrinsic &PI);
180
179
181
180
// / Lower this VP fp call to a unpredicated fp call.
182
181
Value *expandPredicationToFPCall (IRBuilder<> &Builder, VPIntrinsic &PI,
@@ -287,33 +286,19 @@ CachingVPExpander::expandPredicationInBinaryOperator(IRBuilder<> &Builder,
287
286
return NewBinOp;
288
287
}
289
288
290
- Value *CachingVPExpander::expandPredicationToIntCall (
291
- IRBuilder<> &Builder, VPIntrinsic &VPI, unsigned UnpredicatedIntrinsicID) {
292
- switch (UnpredicatedIntrinsicID) {
293
- case Intrinsic::abs:
294
- case Intrinsic::smax:
295
- case Intrinsic::smin:
296
- case Intrinsic::umax:
297
- case Intrinsic::umin: {
298
- Value *Op0 = VPI.getOperand (0 );
299
- Value *Op1 = VPI.getOperand (1 );
300
- Value *NewOp = Builder.CreateIntrinsic (
301
- UnpredicatedIntrinsicID, {VPI.getType ()}, {Op0, Op1},
302
- /* FMFSource=*/ nullptr , VPI.getName ());
303
- replaceOperation (*NewOp, VPI);
304
- return NewOp;
305
- }
306
- case Intrinsic::bswap:
307
- case Intrinsic::bitreverse: {
308
- Value *Op = VPI.getOperand (0 );
309
- Value *NewOp =
310
- Builder.CreateIntrinsic (UnpredicatedIntrinsicID, {VPI.getType ()}, {Op},
311
- /* FMFSource=*/ nullptr , VPI.getName ());
312
- replaceOperation (*NewOp, VPI);
313
- return NewOp;
314
- }
289
+ Value *CachingVPExpander::expandPredicationToIntCall (IRBuilder<> &Builder,
290
+ VPIntrinsic &VPI) {
291
+ std::optional<unsigned > FID = VPI.getFunctionalIntrinsicID ();
292
+ if (!FID)
293
+ return nullptr ;
294
+ SmallVector<Value *, 2 > Argument;
295
+ for (unsigned i = 0 ; i < VPI.getNumOperands () - 3 ; i++) {
296
+ Argument.push_back (VPI.getOperand (i));
315
297
}
316
- return nullptr ;
298
+ Value *NewOp = Builder.CreateIntrinsic (FID.value (), {VPI.getType ()}, Argument,
299
+ /* FMFSource=*/ nullptr , VPI.getName ());
300
+ replaceOperation (*NewOp, VPI);
301
+ return NewOp;
317
302
}
318
303
319
304
Value *CachingVPExpander::expandPredicationToFPCall (
@@ -323,20 +308,15 @@ Value *CachingVPExpander::expandPredicationToFPCall(
323
308
324
309
switch (UnpredicatedIntrinsicID) {
325
310
case Intrinsic::fabs:
326
- case Intrinsic::sqrt: {
327
- Value *Op0 = VPI.getOperand (0 );
328
- Value *NewOp =
329
- Builder.CreateIntrinsic (UnpredicatedIntrinsicID, {VPI.getType ()}, {Op0},
330
- /* FMFSource=*/ nullptr , VPI.getName ());
331
- replaceOperation (*NewOp, VPI);
332
- return NewOp;
333
- }
311
+ case Intrinsic::sqrt:
334
312
case Intrinsic::maxnum:
335
313
case Intrinsic::minnum: {
336
- Value *Op0 = VPI.getOperand (0 );
337
- Value *Op1 = VPI.getOperand (1 );
314
+ SmallVector<Value *, 2 > Argument;
315
+ for (unsigned i = 0 ; i < VPI.getNumOperands () - 3 ; i++) {
316
+ Argument.push_back (VPI.getOperand (i));
317
+ }
338
318
Value *NewOp = Builder.CreateIntrinsic (
339
- UnpredicatedIntrinsicID, {VPI.getType ()}, {Op0, Op1} ,
319
+ UnpredicatedIntrinsicID, {VPI.getType ()}, Argument ,
340
320
/* FMFSource=*/ nullptr , VPI.getName ());
341
321
replaceOperation (*NewOp, VPI);
342
322
return NewOp;
@@ -438,56 +418,13 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder,
438
418
439
419
Value *CachingVPExpander::expandPredicationToCastIntrinsic (IRBuilder<> &Builder,
440
420
VPIntrinsic &VPI) {
441
- Value *CastOp = nullptr ;
442
- switch (VPI.getIntrinsicID ()) {
443
- default :
444
- llvm_unreachable (" Not a VP cast intrinsic" );
445
- case Intrinsic::vp_sext:
446
- CastOp =
447
- Builder.CreateSExt (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
448
- break ;
449
- case Intrinsic::vp_zext:
450
- CastOp =
451
- Builder.CreateZExt (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
452
- break ;
453
- case Intrinsic::vp_trunc:
454
- CastOp =
455
- Builder.CreateTrunc (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
456
- break ;
457
- case Intrinsic::vp_inttoptr:
458
- CastOp =
459
- Builder.CreateIntToPtr (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
460
- break ;
461
- case Intrinsic::vp_ptrtoint:
462
- CastOp =
463
- Builder.CreatePtrToInt (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
464
- break ;
465
- case Intrinsic::vp_fptosi:
466
- CastOp =
467
- Builder.CreateFPToSI (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
468
- break ;
421
+ Intrinsic::ID VPID = VPI.getIntrinsicID ();
422
+ unsigned CastOpcode = VPIntrinsic::getFunctionalOpcodeForVP (VPID).value ();
423
+ assert (Instruction::isCast (CastOpcode));
424
+ Value *CastOp =
425
+ Builder.CreateCast (Instruction::CastOps (CastOpcode), VPI.getOperand (0 ),
426
+ VPI.getType (), VPI.getName ());
469
427
470
- case Intrinsic::vp_fptoui:
471
- CastOp =
472
- Builder.CreateFPToUI (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
473
- break ;
474
- case Intrinsic::vp_sitofp:
475
- CastOp =
476
- Builder.CreateSIToFP (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
477
- break ;
478
- case Intrinsic::vp_uitofp:
479
- CastOp =
480
- Builder.CreateUIToFP (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
481
- break ;
482
- case Intrinsic::vp_fptrunc:
483
- CastOp =
484
- Builder.CreateFPTrunc (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
485
- break ;
486
- case Intrinsic::vp_fpext:
487
- CastOp =
488
- Builder.CreateFPExt (VPI.getOperand (0 ), VPI.getType (), VPI.getName ());
489
- break ;
490
- }
491
428
replaceOperation (*CastOp, VPI);
492
429
return CastOp;
493
430
}
@@ -672,8 +609,7 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) {
672
609
case Intrinsic::vp_umin:
673
610
case Intrinsic::vp_bswap:
674
611
case Intrinsic::vp_bitreverse:
675
- return expandPredicationToIntCall (Builder, VPI,
676
- VPI.getFunctionalIntrinsicID ().value ());
612
+ return expandPredicationToIntCall (Builder, VPI);
677
613
case Intrinsic::vp_fabs:
678
614
case Intrinsic::vp_sqrt:
679
615
case Intrinsic::vp_maxnum:
0 commit comments