@@ -176,8 +176,7 @@ struct CachingVPExpander {
176176 VPIntrinsic &PI);
177177
178178 // / 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);
181180
182181 // / Lower this VP fp call to a unpredicated fp call.
183182 Value *expandPredicationToFPCall (IRBuilder<> &Builder, VPIntrinsic &PI,
@@ -288,33 +287,19 @@ CachingVPExpander::expandPredicationInBinaryOperator(IRBuilder<> &Builder,
288287 return NewBinOp;
289288}
290289
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 () - 3 ; i++) {
297+ Argument.push_back (VPI.getOperand (i));
316298 }
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;
318303}
319304
320305Value *CachingVPExpander::expandPredicationToFPCall (
@@ -324,20 +309,15 @@ Value *CachingVPExpander::expandPredicationToFPCall(
324309
325310 switch (UnpredicatedIntrinsicID) {
326311 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:
335313 case Intrinsic::maxnum:
336314 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 () - 3 ; i++) {
317+ Argument.push_back (VPI.getOperand (i));
318+ }
339319 Value *NewOp = Builder.CreateIntrinsic (
340- UnpredicatedIntrinsicID, {VPI.getType ()}, {Op0, Op1} ,
320+ UnpredicatedIntrinsicID, {VPI.getType ()}, Argument ,
341321 /* FMFSource=*/ nullptr , VPI.getName ());
342322 replaceOperation (*NewOp, VPI);
343323 return NewOp;
@@ -439,56 +419,13 @@ CachingVPExpander::expandPredicationInReduction(IRBuilder<> &Builder,
439419
440420Value *CachingVPExpander::expandPredicationToCastIntrinsic (IRBuilder<> &Builder,
441421 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 ());
470428
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- }
492429 replaceOperation (*CastOp, VPI);
493430 return CastOp;
494431}
@@ -673,8 +610,7 @@ Value *CachingVPExpander::expandPredication(VPIntrinsic &VPI) {
673610 case Intrinsic::vp_umin:
674611 case Intrinsic::vp_bswap:
675612 case Intrinsic::vp_bitreverse:
676- return expandPredicationToIntCall (Builder, VPI,
677- VPI.getFunctionalIntrinsicID ().value ());
613+ return expandPredicationToIntCall (Builder, VPI);
678614 case Intrinsic::vp_fabs:
679615 case Intrinsic::vp_sqrt:
680616 case Intrinsic::vp_maxnum:
0 commit comments