@@ -4428,73 +4428,22 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorShuffle(
4428
4428
return Legalized;
4429
4429
}
4430
4430
4431
- static unsigned getScalarOpcForReduction (unsigned Opc) {
4432
- unsigned ScalarOpc;
4433
- switch (Opc) {
4434
- case TargetOpcode::G_VECREDUCE_FADD:
4435
- ScalarOpc = TargetOpcode::G_FADD;
4436
- break ;
4437
- case TargetOpcode::G_VECREDUCE_FMUL:
4438
- ScalarOpc = TargetOpcode::G_FMUL;
4439
- break ;
4440
- case TargetOpcode::G_VECREDUCE_FMAX:
4441
- ScalarOpc = TargetOpcode::G_FMAXNUM;
4442
- break ;
4443
- case TargetOpcode::G_VECREDUCE_FMIN:
4444
- ScalarOpc = TargetOpcode::G_FMINNUM;
4445
- break ;
4446
- case TargetOpcode::G_VECREDUCE_ADD:
4447
- ScalarOpc = TargetOpcode::G_ADD;
4448
- break ;
4449
- case TargetOpcode::G_VECREDUCE_MUL:
4450
- ScalarOpc = TargetOpcode::G_MUL;
4451
- break ;
4452
- case TargetOpcode::G_VECREDUCE_AND:
4453
- ScalarOpc = TargetOpcode::G_AND;
4454
- break ;
4455
- case TargetOpcode::G_VECREDUCE_OR:
4456
- ScalarOpc = TargetOpcode::G_OR;
4457
- break ;
4458
- case TargetOpcode::G_VECREDUCE_XOR:
4459
- ScalarOpc = TargetOpcode::G_XOR;
4460
- break ;
4461
- case TargetOpcode::G_VECREDUCE_SMAX:
4462
- ScalarOpc = TargetOpcode::G_SMAX;
4463
- break ;
4464
- case TargetOpcode::G_VECREDUCE_SMIN:
4465
- ScalarOpc = TargetOpcode::G_SMIN;
4466
- break ;
4467
- case TargetOpcode::G_VECREDUCE_UMAX:
4468
- ScalarOpc = TargetOpcode::G_UMAX;
4469
- break ;
4470
- case TargetOpcode::G_VECREDUCE_UMIN:
4471
- ScalarOpc = TargetOpcode::G_UMIN;
4472
- break ;
4473
- default :
4474
- llvm_unreachable (" Unhandled reduction" );
4475
- }
4476
- return ScalarOpc;
4477
- }
4478
-
4479
4431
LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorReductions (
4480
4432
MachineInstr &MI, unsigned int TypeIdx, LLT NarrowTy) {
4481
- unsigned Opc = MI.getOpcode ();
4482
- assert (Opc != TargetOpcode::G_VECREDUCE_SEQ_FADD &&
4483
- Opc != TargetOpcode::G_VECREDUCE_SEQ_FMUL &&
4484
- " Sequential reductions not expected" );
4433
+ auto &RdxMI = cast<GVecReduce>(MI);
4485
4434
4486
4435
if (TypeIdx != 1 )
4487
4436
return UnableToLegalize;
4488
4437
4489
4438
// The semantics of the normal non-sequential reductions allow us to freely
4490
4439
// re-associate the operation.
4491
- auto [DstReg, DstTy, SrcReg, SrcTy] = MI .getFirst2RegLLTs ();
4440
+ auto [DstReg, DstTy, SrcReg, SrcTy] = RdxMI .getFirst2RegLLTs ();
4492
4441
4493
4442
if (NarrowTy.isVector () &&
4494
4443
(SrcTy.getNumElements () % NarrowTy.getNumElements () != 0 ))
4495
4444
return UnableToLegalize;
4496
4445
4497
- unsigned ScalarOpc = getScalarOpcForReduction (Opc );
4446
+ unsigned ScalarOpc = RdxMI. getScalarOpcForReduction ();
4498
4447
SmallVector<Register> SplitSrcs;
4499
4448
// If NarrowTy is a scalar then we're being asked to scalarize.
4500
4449
const unsigned NumParts =
@@ -4539,10 +4488,10 @@ LegalizerHelper::LegalizeResult LegalizerHelper::fewerElementsVectorReductions(
4539
4488
SmallVector<Register> PartialReductions;
4540
4489
for (unsigned Part = 0 ; Part < NumParts; ++Part) {
4541
4490
PartialReductions.push_back (
4542
- MIRBuilder.buildInstr (Opc, {DstTy}, {SplitSrcs[Part]}).getReg (0 ));
4491
+ MIRBuilder.buildInstr (RdxMI.getOpcode (), {DstTy}, {SplitSrcs[Part]})
4492
+ .getReg (0 ));
4543
4493
}
4544
4494
4545
-
4546
4495
// If the types involved are powers of 2, we can generate intermediate vector
4547
4496
// ops, before generating a final reduction operation.
4548
4497
if (isPowerOf2_32 (SrcTy.getNumElements ()) &&
0 commit comments