@@ -188,8 +188,7 @@ GenTree* Lowering::LowerNode(GenTree* node)
188188 case GT_TEST_EQ:
189189 case GT_TEST_NE:
190190 case GT_CMP:
191- LowerCompare (node);
192- break ;
191+ return LowerCompare (node);
193192
194193 case GT_JTRUE:
195194 ContainCheckJTrue (node->AsOp ());
@@ -2138,7 +2137,7 @@ GenTree* Lowering::LowerTailCallViaHelper(GenTreeCall* call, GenTree* callTarget
21382137// be used for ARM as well if support for GT_TEST_EQ/GT_TEST_NE is added).
21392138// - Transform TEST(x, LSH(1, y)) into BT(x, y) (XARCH specific)
21402139
2141- void Lowering::LowerCompare (GenTree* cmp)
2140+ GenTree* Lowering::LowerCompare (GenTree* cmp)
21422141{
21432142#ifndef _TARGET_64BIT_
21442143 if (cmp->gtGetOp1 ()->TypeGet () == TYP_LONG)
@@ -2344,7 +2343,7 @@ void Lowering::LowerCompare(GenTree* cmp)
23442343 cmp->AsCC ()->gtCondition = condition;
23452344 }
23462345
2347- return ;
2346+ return cmp-> gtNext ;
23482347 }
23492348#endif
23502349
@@ -2578,7 +2577,42 @@ void Lowering::LowerCompare(GenTree* cmp)
25782577
25792578 cc->gtFlags |= GTF_USE_FLAGS | GTF_UNSIGNED;
25802579
2581- return ;
2580+ return cmp->gtNext ;
2581+ }
2582+ }
2583+ else if (cmp->OperIs (GT_EQ, GT_NE))
2584+ {
2585+ GenTree* op1 = cmp->gtGetOp1 ();
2586+ GenTree* op2 = cmp->gtGetOp2 ();
2587+ LIR::Use cmpUse;
2588+
2589+ if (op1->gtSetZSFlags () && op2->IsIntegralConst (0 ) && (op1->gtNext == op2) && (op2->gtNext == cmp) &&
2590+ BlockRange ().TryGetUse (cmp, &cmpUse))
2591+ {
2592+ genTreeOps condition = cmp->OperGet ();
2593+ GenTree* next = cmp->gtNext ;
2594+ GenTreeCC* cc;
2595+
2596+ if (cmpUse.User ()->OperIs (GT_JTRUE))
2597+ {
2598+ cmpUse.User ()->ChangeOper (GT_JCC);
2599+ cc = cmpUse.User ()->AsCC ();
2600+ BlockRange ().Remove (cmp);
2601+ }
2602+ else
2603+ {
2604+ cmp->ChangeOper (GT_SETCC);
2605+ cc = cmp->AsCC ();
2606+ }
2607+
2608+ cc->gtCondition = condition;
2609+ cc->gtFlags |= GTF_USE_FLAGS;
2610+ op1->gtFlags |= GTF_SET_FLAGS;
2611+ op1->SetUnusedValue ();
2612+
2613+ BlockRange ().Remove (op2);
2614+
2615+ return next;
25822616 }
25832617 }
25842618
@@ -2599,6 +2633,7 @@ void Lowering::LowerCompare(GenTree* cmp)
25992633 }
26002634#endif // _TARGET_XARCH_
26012635 ContainCheckCompare (cmp->AsOp ());
2636+ return cmp->gtNext ;
26022637}
26032638
26042639// Lower "jmp <method>" tail call to insert PInvoke method epilog if required.
0 commit comments