Print this page
11972 resync smatch
        
*** 29,38 ****
--- 29,40 ----
  static int get_absolute_rl_internal(struct expression *expr, struct range_list **rl, int *recurse_cnt);
  
  static sval_t zero  = {.type = &int_ctype, {.value = 0} };
  static sval_t one   = {.type = &int_ctype, {.value = 1} };
  
+ static int fast_math_only;
+ 
  struct range_list *rl_zero(void)
  {
          static struct range_list *zero_perm;
  
          if (!zero_perm)
*** 854,864 ****
                  return get_rl_sval(cond_true, implied, recurse_cnt, res, res_sval);
          if (implied_condition_false(expr->conditional))
                  return get_rl_sval(expr->cond_false, implied, recurse_cnt, res, res_sval);
  
          /* this becomes a problem with deeply nested conditional statements */
!         if (low_on_memory())
                  return false;
  
          type = get_type(expr);
  
          __push_fake_cur_stree();
--- 856,866 ----
                  return get_rl_sval(cond_true, implied, recurse_cnt, res, res_sval);
          if (implied_condition_false(expr->conditional))
                  return get_rl_sval(expr->cond_false, implied, recurse_cnt, res, res_sval);
  
          /* this becomes a problem with deeply nested conditional statements */
!         if (fast_math_only || low_on_memory())
                  return false;
  
          type = get_type(expr);
  
          __push_fake_cur_stree();
*** 945,956 ****
          state = get_extra_state(expr);
          if (!state || is_whole_rl(estate_rl(state))) {
                  state = get_real_absolute_state(expr);
                  if (state && state->data && !estate_is_whole(state))
                          return clone_rl(estate_rl(state));
-                 if (get_local_rl(expr, &rl) && !is_whole_rl(rl))
-                         return rl;
                  if (get_mtag_rl(expr, &rl))
                          return rl;
                  if (get_db_type_rl(expr, &rl) && !is_whole_rl(rl))
                          return rl;
                  return alloc_whole_rl(get_type(expr));
--- 947,956 ----
*** 1006,1017 ****
          case RL_ABSOLUTE:
                  state = get_extra_state(expr);
                  if (!state) {
                          if (implied == RL_HARD)
                                  return false;
-                         if (get_local_rl(expr, res))
-                                 return true;
                          if (get_mtag_rl(expr, res))
                                  return true;
                          if (get_db_type_rl(expr, res))
                                  return true;
                          if (is_array(expr) && get_array_rl(expr, res))
--- 1006,1015 ----
*** 1058,1069 ****
                  } else if (estate_rl(abs_state)) {
                          *res = clone_rl(estate_rl(abs_state));
                          return true;
                  }
  
-                 if (get_local_rl(expr, res))
-                         return true;
                  if (get_mtag_rl(expr, res))
                          return true;
                  if (get_db_type_rl(expr, res))
                          return true;
                  if (is_array(expr) && get_array_rl(expr, res))
--- 1056,1065 ----
*** 1514,1523 ****
--- 1510,1529 ----
  void clear_math_cache(void)
  {
          memset(cached_results, 0, sizeof(cached_results));
  }
  
+ void set_fast_math_only(void)
+ {
+         fast_math_only++;
+ }
+ 
+ void clear_fast_math_only(void)
+ {
+         fast_math_only--;
+ }
+ 
  /*
   * Don't cache EXPR_VALUE because values are fast already.
   *
   */
  static bool get_value_literal(struct expression *expr, sval_t *res_sval)
*** 1758,1781 ****
          sval_t tmp;
  
          if (!expr)
                  return 0;
  
          if (get_value(expr, &tmp) && tmp.value)
                  return 1;
  
          return 0;
  }
  
  int known_condition_false(struct expression *expr)
  {
          if (!expr)
                  return 0;
  
!         if (is_zero(expr))
                  return 1;
  
          return 0;
  }
  
  int implied_condition_true(struct expression *expr)
  {
--- 1764,1801 ----
          sval_t tmp;
  
          if (!expr)
                  return 0;
  
+         if (__inline_fn && get_param_num(expr) >= 0) {
+                 if (get_implied_value(expr, &tmp) && tmp.value)
+                         return 1;
+                 return 0;
+         }
+ 
          if (get_value(expr, &tmp) && tmp.value)
                  return 1;
  
          return 0;
  }
  
  int known_condition_false(struct expression *expr)
  {
+         sval_t tmp;
+ 
          if (!expr)
                  return 0;
  
!         if (__inline_fn && get_param_num(expr) >= 0) {
!                 if (get_implied_value(expr, &tmp) && tmp.value == 0)
                          return 1;
+                 return 0;
+         }
  
+         if (expr_is_zero(expr))
+                 return 1;
+ 
          return 0;
  }
  
  int implied_condition_true(struct expression *expr)
  {