@@ -1107,26 +1107,25 @@ static void simplifyRecipe(VPRecipeBase &R, VPTypeAnalysis &TypeInfo) {
11071107 return Def->replaceAllUsesWith (A);
11081108
11091109 // Try to fold Not into compares by adjusting the predicate in-place.
1110- auto CanFold = [&A](VPUser *U) {
1111- return match (
1112- U, m_CombineOr (m_Not (m_Specific (A)),
1113- m_Select (m_Specific (A), m_VPValue (), m_VPValue ())));
1114- };
1115- if (isa<VPWidenRecipe>(A) && all_of (A->users (), CanFold)) {
1116- auto *WideCmp = cast<VPWidenRecipe>(A);
1117- if (WideCmp->getOpcode () == Instruction::ICmp ||
1118- WideCmp->getOpcode () == Instruction::FCmp) {
1110+ if (auto *WideCmp = dyn_cast<VPWidenRecipe>(A)) {
1111+ if ((WideCmp->getOpcode () == Instruction::ICmp ||
1112+ WideCmp->getOpcode () == Instruction::FCmp) &&
1113+ all_of (WideCmp->users (), [&WideCmp](VPUser *U) {
1114+ return match (U, m_CombineOr (m_Not (m_Specific (WideCmp)),
1115+ m_Select (m_Specific (WideCmp),
1116+ m_VPValue (), m_VPValue ())));
1117+ })) {
11191118 WideCmp->setPredicate (
11201119 CmpInst::getInversePredicate (WideCmp->getPredicate ()));
11211120 for (VPUser *U : to_vector (WideCmp->users ())) {
11221121 auto *R = cast<VPSingleDefRecipe>(U);
11231122 if (match (R, m_Select (m_Specific (WideCmp), m_VPValue (X),
11241123 m_VPValue (Y)))) {
1125- // select (icmp pred), x, y -> select (icmp inv_pred), y, x
1124+ // select (cmp pred), x, y -> select (cmp inv_pred), y, x
11261125 R->setOperand (1 , Y);
11271126 R->setOperand (2 , X);
11281127 } else {
1129- // not (icmp pred) -> icmp inv_pred
1128+ // not (cmp pred) -> cmp inv_pred
11301129 assert (match (R, m_Not (m_Specific (WideCmp))) && " Unexpected user" );
11311130 R->replaceAllUsesWith (WideCmp);
11321131 }
0 commit comments