@@ -852,6 +852,18 @@ bool VPlanTransforms::adjustFixedOrderRecurrences(VPlan &Plan,
852
852
return true ;
853
853
}
854
854
855
+ static SmallVector<VPUser *> collectUsersRecursively (VPValue *V) {
856
+ SetVector<VPUser *> Users (V->user_begin (), V->user_end ());
857
+ for (unsigned I = 0 ; I != Users.size (); ++I) {
858
+ VPRecipeBase *Cur = dyn_cast<VPRecipeBase>(Users[I]);
859
+ if (!Cur || isa<VPHeaderPHIRecipe>(Cur))
860
+ continue ;
861
+ for (VPValue *V : Cur->definedValues ())
862
+ Users.insert (V->user_begin (), V->user_end ());
863
+ }
864
+ return Users.takeVector ();
865
+ }
866
+
855
867
void VPlanTransforms::clearReductionWrapFlags (VPlan &Plan) {
856
868
for (VPRecipeBase &R :
857
869
Plan.getVectorLoopRegion ()->getEntryBasicBlock ()->phis ()) {
@@ -863,24 +875,10 @@ void VPlanTransforms::clearReductionWrapFlags(VPlan &Plan) {
863
875
if (RK != RecurKind::Add && RK != RecurKind::Mul)
864
876
continue ;
865
877
866
- SmallSetVector<VPValue *, 8 > Worklist;
867
- Worklist.insert (PhiR);
868
-
869
- for (unsigned I = 0 ; I != Worklist.size (); ++I) {
870
- VPValue *Cur = Worklist[I];
871
- if (auto *RecWithFlags =
872
- dyn_cast<VPRecipeWithIRFlags>(Cur->getDefiningRecipe ())) {
878
+ for (VPUser *U : collectUsersRecursively (PhiR))
879
+ if (auto *RecWithFlags = dyn_cast<VPRecipeWithIRFlags>(U)) {
873
880
RecWithFlags->dropPoisonGeneratingFlags ();
874
881
}
875
-
876
- for (VPUser *U : Cur->users ()) {
877
- auto *UserRecipe = dyn_cast<VPRecipeBase>(U);
878
- if (!UserRecipe)
879
- continue ;
880
- for (VPValue *V : UserRecipe->definedValues ())
881
- Worklist.insert (V);
882
- }
883
- }
884
882
}
885
883
}
886
884
0 commit comments