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