class AdLint::Cc1::ValueComparison

Public Class Methods

new(manip, node, lhs_manip, rhs_manip) click to toggle source
Calls superclass method AdLint::Cc1::ValueDomainNarrowing::new
# File lib/adlint/cc1/ctrlexpr.rb, line 700
def initialize(manip, node, lhs_manip, rhs_manip)
  super
  @operator  = ComparisonOperator.new(node.operator)
  @lhs_manip = lhs_manip
  @rhs_manip = rhs_manip
end

Private Instance Methods

do_narrowing() click to toggle source
# File lib/adlint/cc1/ctrlexpr.rb, line 708
def do_narrowing
  @lhs_manip.execute!
  lhs_var = object_to_variable(@lhs_manip.result, @node.lhs_operand)

  @rhs_manip.execute!
  rhs_var = object_to_variable(@rhs_manip.result, @node.rhs_operand)

  unless lhs_var.type.scalar? && rhs_var.type.scalar?
    return create_tmpvar(int_t)
  end

  unless lhs_var.value.scalar? && rhs_var.value.scalar?
    return create_tmpvar(int_t)
  end

  lhs_conved, rhs_conved =
    do_logical_arithmetic_conversion(@node, lhs_var, rhs_var)

  lhs_val = lhs_conved.value
  rhs_val = rhs_conved.value

  case @operator
  when Operator::EQ
    rslt_var = create_tmpvar(int_t, lhs_val == rhs_val)
  when Operator::NE
    rslt_var = create_tmpvar(int_t, lhs_val != rhs_val)
  when Operator::LT
    rslt_var = create_tmpvar(int_t, lhs_val <  rhs_val)
  when Operator::GT
    rslt_var = create_tmpvar(int_t, lhs_val >  rhs_val)
  when Operator::LE
    rslt_var = create_tmpvar(int_t, lhs_val <= rhs_val)
  when Operator::GE
    rslt_var = create_tmpvar(int_t, lhs_val >= rhs_val)
  else
    __NOTREACHED__
  end

  notify_variable_value_referred(@node, lhs_var)
  notify_variable_value_referred(@node, rhs_var)

  case @operator
  when Operator::EQ, Operator::NE
    notify_equality_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var)
  when Operator::LT, Operator::GT, Operator::LE, Operator::GE
    notify_relational_expr_evaled(@node, lhs_conved, rhs_conved, rslt_var)
  else
    __NOTREACHED__
  end

  case
  when lhs_conved.designated_by_lvalue?
    ensure_relation(lhs_conved, @operator, rhs_val)
  when rhs_conved.designated_by_lvalue?
    ensure_relation(rhs_conved, @operator.for_commutation, lhs_val)
  else
    # NOTE: Domain of the rvalue should not be narrowed.
  end

  rslt_var
end