//===- llvm/Analysis/Expressions.h - Expression Analysis Utils --*- C++ -*-===//
// 
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
// 
//===----------------------------------------------------------------------===//
//
// This file defines a package of expression analysis utilties:
//
// ClassifyExpression: Analyze an expression to determine the complexity of the
//   expression, and which other variables it depends on.  
// 
//===----------------------------------------------------------------------===//

#ifndef LLVM_ANALYSIS_EXPRESSIONS_H
#define LLVM_ANALYSIS_EXPRESSIONS_H

class Type;
class Value;
class ConstantInt;

struct ExprType;

// ClassifyExpression: Analyze an expression to determine the complexity of the
// expression, and which other values it depends on.  
//
ExprType ClassifyExpression(Value *Expr);

// ExprType - Represent an expression of the form CONST*VAR+CONST
// or simpler.  The expression form that yields the least information about the
// expression is just the Linear form with no offset.
//
struct ExprType {
  enum ExpressionType {
    Constant,            // Expr is a simple constant, Offset is value
    Linear,              // Expr is linear expr, Value is Var+Offset
    ScaledLinear,        // Expr is scaled linear exp, Value is Scale*Var+Offset
  } ExprTy;

  const ConstantInt *Offset;  // Offset of expr, or null if 0
  Value             *Var;     // Var referenced, if Linear or above (null if 0)
  const ConstantInt *Scale;   // Scale of var if ScaledLinear expr (null if 1)

  inline ExprType(const ConstantInt *CPV = 0) {
    Offset = CPV; Var = 0; Scale = 0;
    ExprTy = Constant;
  }
  ExprType(Value *Val);        // Create a linear or constant expression
  ExprType(const ConstantInt *scale, Value *var, const ConstantInt *offset);

  // If this expression has an intrinsic type, return it.  If it is zero, return
  // the specified type.
  //
  const Type *getExprType(const Type *Default) const;
};

#endif
