@@ -3755,9 +3755,9 @@ static Constant *ConstantFoldFixedVectorCall(
37553755 return nullptr ;
37563756 }
37573757 case Intrinsic::vector_extract: {
3758- auto *Vec = dyn_cast<Constant >(Operands[0 ]);
3759- auto *Idx = cast<ConstantInt>( Operands[1 ]) ;
3760- if (!Vec || ! Idx || !isa<FixedVectorType>(Vec->getType ()))
3758+ auto *Idx = dyn_cast<ConstantInt >(Operands[1 ]);
3759+ Constant *Vec = Operands[0 ] ;
3760+ if (!Idx || !isa<FixedVectorType>(Vec->getType ()))
37613761 return nullptr ;
37623762
37633763 unsigned NumElements = FVTy->getNumElements ();
@@ -3786,10 +3786,10 @@ static Constant *ConstantFoldFixedVectorCall(
37863786 return ConstantVector::get (Result);
37873787 }
37883788 case Intrinsic::vector_insert: {
3789- auto *Vec = dyn_cast<Constant>( Operands[0 ]) ;
3790- auto *SubVec = dyn_cast<Constant>( Operands[1 ]) ;
3789+ Constant *Vec = Operands[0 ];
3790+ Constant *SubVec = Operands[1 ];
37913791 auto *Idx = dyn_cast<ConstantInt>(Operands[2 ]);
3792- if (!Vec || !SubVec || ! Idx || !isa<FixedVectorType>(Vec->getType ()))
3792+ if (!Idx || !isa<FixedVectorType>(Vec->getType ()))
37933793 return nullptr ;
37943794
37953795 unsigned SubVecNumElements =
@@ -3804,41 +3804,27 @@ static Constant *ConstantFoldFixedVectorCall(
38043804 // Make sure indices are in the range [0, VecNumElements), otherwise the
38053805 // result is a poison value.
38063806 if (IdxN >= VecNumElements || IdxN + SubVecNumElements > VecNumElements ||
3807- (IdxN && (SubVecNumElements % IdxN ) != 0 ) )
3807+ (IdxN % SubVecNumElements ) != 0 )
38083808 return PoisonValue::get (FVTy);
38093809
3810- unsigned I = 0 ;
3811- for (; I < IdxN; ++I) {
3812- Constant *Elt = Vec->getAggregateElement (I);
3813- if (!Elt)
3814- return nullptr ;
3815- Result[I] = Elt;
3816- }
3817- for (; I < IdxN + SubVecNumElements; ++I) {
3818- Constant *Elt = SubVec->getAggregateElement (I - IdxN);
3819- if (!Elt)
3820- return nullptr ;
3821- Result[I] = Elt;
3822- }
3823- for (; I < VecNumElements; ++I) {
3824- Constant *Elt = Vec->getAggregateElement (I);
3810+ for (unsigned I = 0 ; I < VecNumElements; ++I) {
3811+ Constant *Elt;
3812+ if (I >= IdxN && I < IdxN + SubVecNumElements)
3813+ Elt = SubVec->getAggregateElement (I - IdxN);
3814+ else
3815+ Elt = Vec->getAggregateElement (I);
38253816 if (!Elt)
38263817 return nullptr ;
38273818 Result[I] = Elt;
38283819 }
38293820 return ConstantVector::get (Result);
38303821 }
38313822 case Intrinsic::vector_interleave2: {
3832- auto *Vec0 = dyn_cast<Constant>(Operands[0 ]);
3833- auto *Vec1 = dyn_cast<Constant>(Operands[1 ]);
3834- if (!Vec0 || !Vec1)
3835- return nullptr ;
3836-
38373823 unsigned NumElements =
3838- cast<FixedVectorType>(Vec0 ->getType ())->getNumElements ();
3824+ cast<FixedVectorType>(Operands[ 0 ] ->getType ())->getNumElements ();
38393825 for (unsigned I = 0 ; I < NumElements; ++I) {
3840- Constant *Elt0 = Vec0 ->getAggregateElement (I);
3841- Constant *Elt1 = Vec1 ->getAggregateElement (I);
3826+ Constant *Elt0 = Operands[ 0 ] ->getAggregateElement (I);
3827+ Constant *Elt1 = Operands[ 1 ] ->getAggregateElement (I);
38423828 if (!Elt0 || !Elt1)
38433829 return nullptr ;
38443830 Result[2 * I] = Elt0;
0 commit comments