@@ -435,6 +435,8 @@ bool matchExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
435435 Register ExtSrcReg = ExtMI->getOperand (1 ).getReg ();
436436 LLT ExtSrcTy = MRI.getType (ExtSrcReg);
437437 LLT DstTy = MRI.getType (MI.getOperand (0 ).getReg ());
438+ if (ExtSrcTy.getScalarSizeInBits () * 2 > DstTy.getScalarSizeInBits ())
439+ return false ;
438440 if ((DstTy.getScalarSizeInBits () == 16 &&
439441 ExtSrcTy.getNumElements () % 8 == 0 && ExtSrcTy.getNumElements () < 256 ) ||
440442 (DstTy.getScalarSizeInBits () == 32 &&
@@ -492,7 +494,7 @@ void applyExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
492494
493495 unsigned MidScalarSize = MainTy.getScalarSizeInBits () * 2 ;
494496 LLT MidScalarLLT = LLT::scalar (MidScalarSize);
495- Register zeroReg = B.buildConstant (LLT::scalar (64 ), 0 ).getReg (0 );
497+ Register ZeroReg = B.buildConstant (LLT::scalar (64 ), 0 ).getReg (0 );
496498 for (unsigned I = 0 ; I < WorkingRegisters.size (); I++) {
497499 // If the number of elements is too small to build an instruction, extend
498500 // its size before applying addlv
@@ -508,10 +510,10 @@ void applyExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
508510
509511 // Generate the {U/S}ADDLV instruction, whose output is always double of the
510512 // Src's Scalar size
511- LLT addlvTy = MidScalarSize <= 32 ? LLT::fixed_vector (4 , 32 )
513+ LLT AddlvTy = MidScalarSize <= 32 ? LLT::fixed_vector (4 , 32 )
512514 : LLT::fixed_vector (2 , 64 );
513- Register addlvReg =
514- B.buildInstr (Opc, {addlvTy }, {WorkingRegisters[I]}).getReg (0 );
515+ Register AddlvReg =
516+ B.buildInstr (Opc, {AddlvTy }, {WorkingRegisters[I]}).getReg (0 );
515517
516518 // The output from {U/S}ADDLV gets placed in the lowest lane of a v4i32 or
517519 // v2i64 register.
@@ -520,36 +522,36 @@ void applyExtUaddvToUaddlv(MachineInstr &MI, MachineRegisterInfo &MRI,
520522 // Therefore we have to extract/truncate the the value to the right type
521523 if (MidScalarSize == 32 || MidScalarSize == 64 ) {
522524 WorkingRegisters[I] = B.buildInstr (AArch64::G_EXTRACT_VECTOR_ELT,
523- {MidScalarLLT}, {addlvReg, zeroReg })
525+ {MidScalarLLT}, {AddlvReg, ZeroReg })
524526 .getReg (0 );
525527 } else {
526- Register extractReg = B.buildInstr (AArch64::G_EXTRACT_VECTOR_ELT,
527- {LLT::scalar (32 )}, {addlvReg, zeroReg })
528+ Register ExtractReg = B.buildInstr (AArch64::G_EXTRACT_VECTOR_ELT,
529+ {LLT::scalar (32 )}, {AddlvReg, ZeroReg })
528530 .getReg (0 );
529531 WorkingRegisters[I] =
530- B.buildTrunc ({MidScalarLLT}, {extractReg }).getReg (0 );
532+ B.buildTrunc ({MidScalarLLT}, {ExtractReg }).getReg (0 );
531533 }
532534 }
533535
534- Register outReg ;
536+ Register OutReg ;
535537 if (WorkingRegisters.size () > 1 ) {
536- outReg = B.buildAdd (MidScalarLLT, WorkingRegisters[0 ], WorkingRegisters[1 ])
538+ OutReg = B.buildAdd (MidScalarLLT, WorkingRegisters[0 ], WorkingRegisters[1 ])
537539 .getReg (0 );
538540 for (unsigned I = 2 ; I < WorkingRegisters.size (); I++) {
539- outReg = B.buildAdd (MidScalarLLT, outReg , WorkingRegisters[I]).getReg (0 );
541+ OutReg = B.buildAdd (MidScalarLLT, OutReg , WorkingRegisters[I]).getReg (0 );
540542 }
541543 } else {
542- outReg = WorkingRegisters[0 ];
544+ OutReg = WorkingRegisters[0 ];
543545 }
544546
545547 if (DstTy.getScalarSizeInBits () > MidScalarSize) {
546548 // Handle the scalar value if the DstTy's Scalar Size is more than double
547549 // Src's ScalarType
548550 B.buildInstr (std::get<1 >(MatchInfo) ? TargetOpcode::G_SEXT
549551 : TargetOpcode::G_ZEXT,
550- {DstReg}, {outReg });
552+ {DstReg}, {OutReg });
551553 } else {
552- B.buildCopy (DstReg, outReg );
554+ B.buildCopy (DstReg, OutReg );
553555 }
554556
555557 MI.eraseFromParent ();
0 commit comments