@@ -486,7 +486,9 @@ static std::pair<Value*,int> FindBaseValue(const State &S, Value *V, bool UseCac
486
486
isa<Argument>(CurrentV) || isa<SelectInst>(CurrentV) ||
487
487
isa<PHINode>(CurrentV) || isa<AddrSpaceCastInst>(CurrentV) ||
488
488
isa<Constant>(CurrentV) || isa<AllocaInst>(CurrentV) ||
489
- isa<ExtractValueInst>(CurrentV));
489
+ isa<ExtractValueInst>(CurrentV) ||
490
+ isa<InsertElementInst>(CurrentV) ||
491
+ isa<ShuffleVectorInst>(CurrentV));
490
492
return std::make_pair (CurrentV, fld_idx);
491
493
}
492
494
@@ -602,22 +604,37 @@ std::vector<int> LateLowerGCFrame::NumberVectorBase(State &S, Value *CurrentV) {
602
604
((isa<Argument>(CurrentV) || isa<AllocaInst>(CurrentV) ||
603
605
isa<AddrSpaceCastInst>(CurrentV)) &&
604
606
getValueAddrSpace (CurrentV) != AddressSpace::Tracked)) {
607
+ Numbers.resize (cast<VectorType>(CurrentV->getType ())->getNumElements (), -1 );
605
608
}
606
609
/* We (the frontend) don't insert either of these, but it would be legal -
607
610
though a bit strange, considering they're pointers - for the optimizer to
608
611
do so. All that's needed here is to NumberVector the previous vector/value
609
612
and lift the operation */
610
- else if (isa<ShuffleVectorInst>(CurrentV)) {
611
- assert (false && " TODO Shuffle" );
612
- } else if (isa<InsertElementInst>(CurrentV)) {
613
- assert (false && " TODO Insert" );
614
- } else if (isa<LoadInst>(CurrentV)) {
613
+ else if (auto *SVI = dyn_cast<ShuffleVectorInst>(CurrentV)) {
614
+ std::vector<int > Numbers1 = NumberVectorBase (S, SVI->getOperand (0 ));
615
+ std::vector<int > Numbers2 = NumberVectorBase (S, SVI->getOperand (1 ));
616
+ auto Mask = SVI->getShuffleMask ();
617
+ for (unsigned idx : Mask) {
618
+ if (idx < Numbers1.size ()) {
619
+ Numbers.push_back (Numbers1[idx]);
620
+ } else {
621
+ Numbers.push_back (Numbers2[idx - Numbers1.size ()]);
622
+ }
623
+ }
624
+ } else if (auto *IEI = dyn_cast<InsertElementInst>(CurrentV)) {
625
+ unsigned idx = cast<ConstantInt>(IEI->getOperand (2 ))->getZExtValue ();
626
+ Numbers = NumberVectorBase (S, IEI->getOperand (0 ));
627
+ int ElNumber = Number (S, IEI->getOperand (1 ));
628
+ Numbers[idx] = ElNumber;
629
+ } else if (isa<LoadInst>(CurrentV) || isa<CallInst>(CurrentV) || isa<PHINode>(CurrentV)) {
615
630
// This is simple, we can just number them sequentially
616
631
for (unsigned i = 0 ; i < cast<VectorType>(CurrentV->getType ())->getNumElements (); ++i) {
617
632
int Num = ++S.MaxPtrNumber ;
618
633
Numbers.push_back (Num);
619
634
S.ReversePtrNumbering [Num] = CurrentV;
620
635
}
636
+ } else {
637
+ assert (false && " Unexpected vector generating operating" );
621
638
}
622
639
S.AllVectorNumbering [CurrentV] = Numbers;
623
640
return Numbers;
@@ -629,9 +646,17 @@ std::vector<int> LateLowerGCFrame::NumberVector(State &S, Value *V) {
629
646
return it->second ;
630
647
auto CurrentV = FindBaseValue (S, V);
631
648
assert (CurrentV.second == -1 );
632
- auto Numbers = NumberVectorBase (S, CurrentV.first );
633
- S.AllVectorNumbering [V] = Numbers;
634
- return Numbers;
649
+ // E.g. if this is a gep, it's possible for the base to be a single ptr
650
+ if (isSpecialPtrVec (CurrentV.first ->getType ())) {
651
+ auto Numbers = NumberVectorBase (S, CurrentV.first );
652
+ S.AllVectorNumbering [V] = Numbers;
653
+ return Numbers;
654
+ } else {
655
+ std::vector<int > Numbers{};
656
+ Numbers.resize (cast<VectorType>(V->getType ())->getNumElements (),
657
+ NumberBase (S, V, CurrentV.first ));
658
+ return Numbers;
659
+ }
635
660
}
636
661
637
662
static void MaybeResize (BBState &BBS, unsigned Idx) {
@@ -714,6 +739,8 @@ void LateLowerGCFrame::NoteUse(State &S, BBState &BBS, Value *V, BitVector &Uses
714
739
std::vector<int > Nums = NumberVector (S, V);
715
740
for (int Num : Nums) {
716
741
MaybeResize (BBS, Num);
742
+ if (Num < 0 )
743
+ continue ;
717
744
Uses[Num] = 1 ;
718
745
}
719
746
}
@@ -729,7 +756,7 @@ void LateLowerGCFrame::NoteUse(State &S, BBState &BBS, Value *V, BitVector &Uses
729
756
void LateLowerGCFrame::NoteOperandUses (State &S, BBState &BBS, User &UI, BitVector &Uses) {
730
757
for (Use &U : UI.operands ()) {
731
758
Value *V = U;
732
- if (!isSpecialPtr (V->getType ()))
759
+ if (!isSpecialPtr (V->getType ()) && ! isSpecialPtrVec (V-> getType ()) )
733
760
continue ;
734
761
NoteUse (S, BBS, V, Uses);
735
762
}
0 commit comments