@@ -6593,6 +6593,13 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val
65936593 src2Var = this->GetConstantVar(instr->GetSrc2(), src2Val);
65946594 }
65956595
6596+ auto AreSourcesEqual = [&](Value * val1, Value * val2) -> bool
6597+ {
6598+ // NaN !== NaN, and objects can have valueOf/toString
6599+ return val1->IsEqualTo(val2) &&
6600+ val1->GetValueInfo()->IsPrimitive() && !val1->GetValueInfo()->IsFloat();
6601+ };
6602+
65966603 // Make sure GetConstantVar only returns primitives.
65976604 // TODO: OOP JIT, enabled these asserts
65986605 //Assert(!src1Var || !Js::JavascriptOperators::IsObject(src1Var));
@@ -6609,6 +6616,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val
66096616 { \
66106617 result = (TYPE)left64 CMP (TYPE)right64; \
66116618 } \
6619+ else if (AreSourcesEqual(src1Val, src2Val)) \
6620+ { \
6621+ result = 0 CMP 0; \
6622+ } \
66126623 else \
66136624 { \
66146625 return false; \
@@ -6631,7 +6642,11 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val
66316642 {
66326643 if (BoolAndIntStaticAndTypeMismatch(src1Val, src2Val, src1Var, src2Var))
66336644 {
6634- result = false;
6645+ result = false;
6646+ }
6647+ else if (AreSourcesEqual(src1Val, src2Val))
6648+ {
6649+ result = true;
66356650 }
66366651 else
66376652 {
@@ -6656,6 +6671,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val
66566671 {
66576672 result = true;
66586673 }
6674+ else if (AreSourcesEqual(src1Val, src2Val))
6675+ {
6676+ result = false;
6677+ }
66596678 else
66606679 {
66616680 return false;
@@ -6693,6 +6712,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val
66936712 {
66946713 result = false;
66956714 }
6715+ else if (AreSourcesEqual(src1Val, src2Val))
6716+ {
6717+ result = true;
6718+ }
66966719 else
66976720 {
66986721 return false;
@@ -6731,6 +6754,10 @@ GlobOpt::OptConstFoldBranch(IR::Instr *instr, Value *src1Val, Value*src2Val, Val
67316754 {
67326755 result = true;
67336756 }
6757+ else if (AreSourcesEqual(src1Val, src2Val))
6758+ {
6759+ result = false;
6760+ }
67346761 else
67356762 {
67366763 return false;
0 commit comments