@@ -377,8 +377,8 @@ class IROptimizer {
377377 let resultType = 0 ;
378378
379379 const canBeNaN = function ( ) {
380- // REAL / 0 = NaN
381- if ( ( leftType & InputType . NUMBER_REAL ) && ( rightType & InputType . NUMBER_ZERO ) ) return true ;
380+ // (-)0 / (-) 0 = NaN
381+ if ( ( leftType & InputType . NUMBER_ANY_ZERO ) && ( rightType & InputType . NUMBER_ANY_ZERO ) ) return true ;
382382 // (-)Infinity / (-)Infinity = NaN
383383 if ( ( leftType & InputType . NUMBER_INF ) && ( rightType & InputType . NUMBER_INF ) ) return true ;
384384 // (-)0 / NaN = NaN
@@ -395,24 +395,26 @@ class IROptimizer {
395395 if ( canBePos ( ) ) resultType |= InputType . NUMBER_POS ;
396396
397397 const canBeNegInfinity = function ( ) {
398- // -Infinity / 0 = -Infinity
399- if ( ( leftType & InputType . NUMBER_NEG_INF ) && ( rightType & InputType . NUMBER_ZERO ) ) return true ;
400- // Infinity / -0 = -Infinity
401- if ( ( leftType & InputType . NUMBER_POS_INF ) && ( rightType & InputType . NUMBER_NEG_ZERO ) ) return true ;
402- // NEG_REAL / NaN = -Infinity
403- if ( ( leftType & InputType . NUMBER_NEG_REAL ) && ( rightType & InputType . NUMBER_NAN ) ) return true ;
404- // NEG_REAL / NUMBER_OR_NAN ~= -Infinity
405- if ( ( leftType & InputType . NUMBER_NEG_REAL ) && ( rightType & InputType . NUMBER_OR_NAN ) ) return true ;
398+ // NEG / 0 = -Infinity
399+ if ( ( leftType & InputType . NUMBER_NEG ) && ( rightType & InputType . NUMBER_ZERO ) ) return true ;
400+ // POS / -0 = -Infinity
401+ if ( ( leftType & InputType . NUMBER_POS ) && ( rightType & InputType . NUMBER_NEG_ZERO ) ) return true ;
402+ // NEG_REAL / POS_REAL ~ = -Infinity
403+ if ( ( leftType & InputType . NUMBER_NEG_REAL ) && ( rightType & InputType . NUMBER_POS_REAL ) ) return true ;
404+ // POS_REAL / NEG_REAL ~= -Infinity
405+ if ( ( leftType & InputType . NUMBER_POS_REAL ) && ( rightType & InputType . NUMBER_NEG_REAL ) ) return true ;
406406 } ;
407407 if ( canBeNegInfinity ( ) ) resultType |= InputType . NUMBER_NEG_INF ;
408408
409409 const canBeInfinity = function ( ) {
410- // Infinity / 0 = Infinity
411- if ( ( leftType & InputType . NUMBER_POS_INF ) && ( rightType & InputType . NUMBER_ZERO ) ) return true ;
412- // -Infinity / -0 = Infinity
413- if ( ( leftType & InputType . NUMBER_NEG_INF ) && ( rightType & InputType . NUMBER_NEG_ZERO ) ) return true ;
414- // POS_REAL / NUMBER_OR_NAN ~= Infinity
415- if ( ( leftType & InputType . NUMBER_POS_REAL ) && ( rightType & InputType . NUMBER_OR_NAN ) ) return true ;
410+ // POS / 0 = Infinity
411+ if ( ( leftType & InputType . NUMBER_POS ) && ( rightType & InputType . NUMBER_ZERO ) ) return true ;
412+ // NEG / -0 = Infinity
413+ if ( ( leftType & InputType . NUMBER_NEG ) && ( rightType & InputType . NUMBER_NEG_ZERO ) ) return true ;
414+ // POS_REAL / POS_REAL ~= Infinity
415+ if ( ( leftType & InputType . NUMBER_POS_REAL ) && ( rightType & InputType . NUMBER_POS_REAL ) ) return true ;
416+ // NEG_REAL / NEG_REAL ~= Infinity
417+ if ( ( leftType & InputType . NUMBER_NEG_REAL ) && ( rightType & InputType . NUMBER_NEG_REAL ) ) return true ;
416418 } ;
417419 if ( canBeInfinity ( ) ) resultType |= InputType . NUMBER_POS_INF ;
418420
@@ -644,8 +646,8 @@ class IROptimizer {
644646
645647 const newState = state . clone ( ) ;
646648 modified = this . analyzeStack ( stack , newState ) || modified ;
649+ modified = this . analyzeInputs ( block . inputs , newState ) || modified ;
647650 modified = ( keepLooping = state . or ( newState ) ) || modified ;
648- modified = this . analyzeInputs ( block . inputs , state ) || modified ;
649651 } while ( keepLooping ) ;
650652 block . entryState = state . clone ( ) ;
651653 return modified ;
0 commit comments