ConstantFolding.cpp revision 9ab7fb3ba47442d521a5bed09a27a5e8e7a786ed
1bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//===-- ConstantFolding.cpp - Analyze constant folding possibilities ------===//
2bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
3bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//                     The LLVM Compiler Infrastructure
4bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
5bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell// This file was developed by the LLVM research group and is distributed under
6bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
7bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
8bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//===----------------------------------------------------------------------===//
9bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
10bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell// This family of functions determines the possibility of performing constant
11bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell// folding.
12bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
13bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//===----------------------------------------------------------------------===//
14bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
15bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Analysis/ConstantFolding.h"
16bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Constants.h"
17bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/DerivedTypes.h"
185520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner#include "llvm/Function.h"
19bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Instructions.h"
20bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Intrinsics.h"
215520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner#include "llvm/ADT/SmallVector.h"
22c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner#include "llvm/ADT/StringMap.h"
2303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner#include "llvm/Target/TargetData.h"
24bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Support/GetElementPtrTypeIterator.h"
25bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Support/MathExtras.h"
26bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include <cerrno>
2797af751deb9b26fd42fbcee082da9ccc4ded5b45Jeff Cohen#include <cmath>
28bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellusing namespace llvm;
29bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
3003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
3103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner// Constant Folding internal helper functions
3203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
3303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
3403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// IsConstantOffsetFromGlobal - If this constant is actually a constant offset
3503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// from a global, return the global and the constant.  Because of
3603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// constantexprs, this function is recursive.
3703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattnerstatic bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
3803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                       int64_t &Offset, const TargetData &TD) {
3903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Trivial case, constant is the global.
4003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if ((GV = dyn_cast<GlobalValue>(C))) {
4103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    Offset = 0;
4203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return true;
4303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
4403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
4503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Otherwise, if this isn't a constant expr, bail out.
4603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  ConstantExpr *CE = dyn_cast<ConstantExpr>(C);
4703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (!CE) return false;
4803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
4903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Look through ptr->int and ptr->ptr casts.
5003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (CE->getOpcode() == Instruction::PtrToInt ||
5103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      CE->getOpcode() == Instruction::BitCast)
5203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD);
5303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
5403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // i32* getelementptr ([5 x i32]* @a, i32 0, i32 5)
5503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (CE->getOpcode() == Instruction::GetElementPtr) {
5603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // Cannot compute this if the element type of the pointer is missing size
5703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // info.
5803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (!cast<PointerType>(CE->getOperand(0)->getType())->getElementType()->isSized())
5903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return false;
6003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
6103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // If the base isn't a global+constant, we aren't either.
6203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (!IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD))
6303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return false;
6403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
6503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // Otherwise, add any offset that our operands provide.
6603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    gep_type_iterator GTI = gep_type_begin(CE);
6703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i, ++GTI) {
6803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      ConstantInt *CI = dyn_cast<ConstantInt>(CE->getOperand(i));
6903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (!CI) return false;  // Index isn't a simple constant?
7003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (CI->getZExtValue() == 0) continue;  // Not adding anything.
7103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
7203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (const StructType *ST = dyn_cast<StructType>(*GTI)) {
7303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        // N = N + Offset
74b1919e2f08ecb37140af676fd2916f8d5ed7df3dChris Lattner        Offset += TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue());
7503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      } else {
76ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen        const SequentialType *SQT = cast<SequentialType>(*GTI);
77ca5183d445954a9b2a570d6bbba1bc2b00ad6442Jeff Cohen        Offset += TD.getTypeSize(SQT->getElementType())*CI->getSExtValue();
7803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      }
7903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    }
8003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return true;
8103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
8203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
8303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return false;
8403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner}
8503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
8603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
8703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// SymbolicallyEvaluateBinop - One of Op0/Op1 is a constant expression.
8803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// Attempt to symbolically evaluate the result of  a binary operator merging
8903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// these together.  If target data info is available, it is provided as TD,
9003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// otherwise TD is null.
9103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattnerstatic Constant *SymbolicallyEvaluateBinop(unsigned Opc, Constant *Op0,
9203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                           Constant *Op1, const TargetData *TD){
9303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // SROA
9403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
9503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Fold (and 0xffffffff00000000, (shl x, 32)) -> shl.
9603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Fold (lshr (or X, Y), 32) -> (lshr [X/Y], 32) if one doesn't contribute
9703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // bits.
9803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
9903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
10003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // If the constant expr is something like &A[123] - &A[4].f, fold this into a
10103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // constant.  This happens frequently when iterating over a global array.
10203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (Opc == Instruction::Sub && TD) {
10303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    GlobalValue *GV1, *GV2;
10403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    int64_t Offs1, Offs2;
10503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
10603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (IsConstantOffsetFromGlobal(Op0, GV1, Offs1, *TD))
10703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (IsConstantOffsetFromGlobal(Op1, GV2, Offs2, *TD) &&
10803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner          GV1 == GV2) {
10903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        // (&GV+C1) - (&GV+C2) -> C1-C2, pointer arithmetic cannot overflow.
11003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        return ConstantInt::get(Op0->getType(), Offs1-Offs2);
11103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      }
11203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
11303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
11403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // TODO: Fold icmp setne/seteq as well.
11503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return 0;
11603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner}
11703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
11803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// SymbolicallyEvaluateGEP - If we can symbolically evaluate the specified GEP
11903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// constant expression, do so.
12003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattnerstatic Constant *SymbolicallyEvaluateGEP(Constant** Ops, unsigned NumOps,
12103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                         const Type *ResultTy,
12203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                         const TargetData *TD) {
12303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  Constant *Ptr = Ops[0];
12403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (!cast<PointerType>(Ptr->getType())->getElementType()->isSized())
12503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return 0;
12603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
12703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (TD && Ptr->isNullValue()) {
12803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // If this is a constant expr gep that is effectively computing an
12903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // "offsetof", fold it into 'cast int Size to T*' instead of 'gep 0, 0, 12'
13003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    bool isFoldableGEP = true;
13103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    for (unsigned i = 1; i != NumOps; ++i)
13203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (!isa<ConstantInt>(Ops[i])) {
13303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        isFoldableGEP = false;
13403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        break;
13503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      }
13603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (isFoldableGEP) {
137309f87e34a12e3398932e4c2c9e3c47cad0e8f0fChris Lattner      uint64_t Offset = TD->getIndexedOffset(Ptr->getType(),
138309f87e34a12e3398932e4c2c9e3c47cad0e8f0fChris Lattner                                             (Value**)Ops+1, NumOps-1);
13903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      Constant *C = ConstantInt::get(TD->getIntPtrType(), Offset);
14003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return ConstantExpr::getIntToPtr(C, ResultTy);
14103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    }
14203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
14303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
14403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return 0;
14503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner}
14603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
14703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
14803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
14903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner// Constant Folding public APIs
15003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
15103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
15203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
1535520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldInstruction - Attempt to constant fold the specified
1545520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// instruction.  If successful, the constant result is returned, if not, null
1555520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// is returned.  Note that this function can only fail when attempting to fold
1565520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// instructions like loads and stores, which have no constant expression form.
1575520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner///
1585520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
1595520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  if (PHINode *PN = dyn_cast<PHINode>(I)) {
1605520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (PN->getNumIncomingValues() == 0)
1615520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return Constant::getNullValue(PN->getType());
1625520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1635520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    Constant *Result = dyn_cast<Constant>(PN->getIncomingValue(0));
1645520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (Result == 0) return 0;
1655520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1665520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    // Handle PHI nodes specially here...
1675520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i)
1685520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (PN->getIncomingValue(i) != Result && PN->getIncomingValue(i) != PN)
1695520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;   // Not all the same incoming constants...
1705520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1715520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    // If we reach here, all incoming values are the same constant.
1725520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return Result;
1735520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  }
1745520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1755520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // Scan the operand list, checking to see if they are all constants, if so,
1765520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // hand off to ConstantFoldInstOperands.
1775520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  SmallVector<Constant*, 8> Ops;
1785520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
1795520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (Constant *Op = dyn_cast<Constant>(I->getOperand(i)))
1805520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      Ops.push_back(Op);
1815520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    else
1825520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return 0;  // All operands not constant!
1835520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
18403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return ConstantFoldInstOperands(I, &Ops[0], Ops.size(), TD);
1855520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
1865520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1875520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
1885520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// specified opcode and operands.  If successful, the constant result is
1895520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// returned, if not, null is returned.  Note that this function can fail when
1905520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// attempting to fold instructions like loads and stores, which have no
1915520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// constant expression form.
1925520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner///
1935520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldInstOperands(const Instruction* I,
1945520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                         Constant** Ops, unsigned NumOps,
1955520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                         const TargetData *TD) {
1965520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  unsigned Opc = I->getOpcode();
1975520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  const Type *DestTy = I->getType();
1985520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
19903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Handle easy binops first.
20003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (isa<BinaryOperator>(I)) {
20103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (isa<ConstantExpr>(Ops[0]) || isa<ConstantExpr>(Ops[1]))
20203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (Constant *C = SymbolicallyEvaluateBinop(I->getOpcode(), Ops[0],
20303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                                  Ops[1], TD))
20403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        return C;
20503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
2065520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::get(Opc, Ops[0], Ops[1]);
20703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
2085520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2095520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  switch (Opc) {
2105520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  default: return 0;
2115520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Call:
2125520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (Function *F = dyn_cast<Function>(Ops[0]))
2135520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (canConstantFoldCallTo(F))
214ad58eb34342f70f094008e6d08cb4ed814754e64Chris Lattner        return ConstantFoldCall(F, Ops+1, NumOps-1);
2155520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return 0;
2165520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ICmp:
2175520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FCmp:
2185520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getCompare(cast<CmpInst>(I)->getPredicate(), Ops[0],
2195520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                    Ops[1]);
220001f7534e0311508cc93831a595785bb177f8a18Chris Lattner  case Instruction::PtrToInt:
221001f7534e0311508cc93831a595785bb177f8a18Chris Lattner    // If the input is a inttoptr, eliminate the pair.  This requires knowing
222001f7534e0311508cc93831a595785bb177f8a18Chris Lattner    // the width of a pointer, so it can't be done in ConstantExpr::getCast.
223001f7534e0311508cc93831a595785bb177f8a18Chris Lattner    if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0])) {
224001f7534e0311508cc93831a595785bb177f8a18Chris Lattner      if (TD && CE->getOpcode() == Instruction::IntToPtr) {
225001f7534e0311508cc93831a595785bb177f8a18Chris Lattner        Constant *Input = CE->getOperand(0);
226001f7534e0311508cc93831a595785bb177f8a18Chris Lattner        unsigned InWidth = Input->getType()->getPrimitiveSizeInBits();
227001f7534e0311508cc93831a595785bb177f8a18Chris Lattner        Constant *Mask =
228001f7534e0311508cc93831a595785bb177f8a18Chris Lattner          ConstantInt::get(APInt::getLowBitsSet(InWidth,
229001f7534e0311508cc93831a595785bb177f8a18Chris Lattner                                                TD->getPointerSizeInBits()));
230001f7534e0311508cc93831a595785bb177f8a18Chris Lattner        Input = ConstantExpr::getAnd(Input, Mask);
231001f7534e0311508cc93831a595785bb177f8a18Chris Lattner        // Do a zext or trunc to get to the dest size.
232001f7534e0311508cc93831a595785bb177f8a18Chris Lattner        return ConstantExpr::getIntegerCast(Input, I->getType(), false);
233001f7534e0311508cc93831a595785bb177f8a18Chris Lattner      }
234001f7534e0311508cc93831a595785bb177f8a18Chris Lattner    }
235001f7534e0311508cc93831a595785bb177f8a18Chris Lattner    // FALL THROUGH.
236001f7534e0311508cc93831a595785bb177f8a18Chris Lattner  case Instruction::IntToPtr:
2375520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Trunc:
2385520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ZExt:
2395520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::SExt:
2405520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPTrunc:
2415520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPExt:
2425520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::UIToFP:
2435520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::SIToFP:
2445520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPToUI:
2455520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPToSI:
2465520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::BitCast:
2475520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getCast(Opc, Ops[0], DestTy);
2485520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Select:
2495520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
2505520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ExtractElement:
2515520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getExtractElement(Ops[0], Ops[1]);
2525520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::InsertElement:
2535520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]);
2545520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ShuffleVector:
2555520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
2565520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::GetElementPtr:
25703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (Constant *C = SymbolicallyEvaluateGEP(Ops, NumOps, I->getType(), TD))
25803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return C;
25903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
260d917fe56926f2f80665fd154eb23ca41e9df6f67Chris Lattner    return ConstantExpr::getGetElementPtr(Ops[0], Ops+1, NumOps-1);
2615520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  }
2625520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
2635520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2645520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a
2655520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// getelementptr constantexpr, return the constant value being addressed by the
2665520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// constant expression, or null if something is funny and we can't decide.
2675520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C,
2685520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                                       ConstantExpr *CE) {
2695520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  if (CE->getOperand(1) != Constant::getNullValue(CE->getOperand(1)->getType()))
2705520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return 0;  // Do not allow stepping over the value!
2715520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2725520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // Loop over all of the operands, tracking down which value we are
2735520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // addressing...
2745520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  gep_type_iterator I = gep_type_begin(CE), E = gep_type_end(CE);
2755520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  for (++I; I != E; ++I)
2765520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (const StructType *STy = dyn_cast<StructType>(*I)) {
2775520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      ConstantInt *CU = cast<ConstantInt>(I.getOperand());
2785520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      assert(CU->getZExtValue() < STy->getNumElements() &&
2795520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner             "Struct index out of range!");
2805520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      unsigned El = (unsigned)CU->getZExtValue();
2815520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) {
2825520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = CS->getOperand(El);
2835520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (isa<ConstantAggregateZero>(C)) {
2845520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = Constant::getNullValue(STy->getElementType(El));
2855520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (isa<UndefValue>(C)) {
2865520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = UndefValue::get(STy->getElementType(El));
2875520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else {
2885520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;
2895520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      }
2905520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) {
2915520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) {
2925520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (CI->getZExtValue() >= ATy->getNumElements())
2935520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner         return 0;
2945520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
2955520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = CA->getOperand(CI->getZExtValue());
2965520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<ConstantAggregateZero>(C))
2975520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = Constant::getNullValue(ATy->getElementType());
2985520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<UndefValue>(C))
2995520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = UndefValue::get(ATy->getElementType());
3005520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else
3015520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
3029d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer      } else if (const VectorType *PTy = dyn_cast<VectorType>(*I)) {
3035520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (CI->getZExtValue() >= PTy->getNumElements())
3045520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
3059d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer        if (ConstantVector *CP = dyn_cast<ConstantVector>(C))
3065520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = CP->getOperand(CI->getZExtValue());
3075520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<ConstantAggregateZero>(C))
3085520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = Constant::getNullValue(PTy->getElementType());
3095520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<UndefValue>(C))
3105520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = UndefValue::get(PTy->getElementType());
3115520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else
3125520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
3135520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else {
3145520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;
3155520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      }
3165520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    } else {
3175520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return 0;
3185520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    }
3195520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  return C;
3205520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
3215520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
3225520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
323bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//===----------------------------------------------------------------------===//
3245520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner//  Constant Folding for Calls
325bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
326bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
327bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// canConstantFoldCallTo - Return true if its even possible to fold a call to
328bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// the specified function.
329bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellbool
330bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellllvm::canConstantFoldCallTo(Function *F) {
331bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  switch (F->getIntrinsicID()) {
3329ab7fb3ba47442d521a5bed09a27a5e8e7a786edDale Johannesen  case Intrinsic::sqrt:
3339ab7fb3ba47442d521a5bed09a27a5e8e7a786edDale Johannesen  case Intrinsic::powi:
334e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::bswap:
335e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::ctpop:
336e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::ctlz:
337e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::cttz:
338bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    return true;
339bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  default: break;
340bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
341bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
342c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const ValueName *NameVal = F->getValueName();
343a099b6c7bb574f22bc002e0b3c65c25abccca1d5Chris Lattner  if (NameVal == 0) return false;
344c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const char *Str = NameVal->getKeyData();
345c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  unsigned Len = NameVal->getKeyLength();
346c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner
347c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  // In these cases, the check of the length is required.  We don't want to
348c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  // return true for a name like "cos\0blah" which strcmp would return equal to
349c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  // "cos", but has length 8.
350c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  switch (Str[0]) {
351c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  default: return false;
352c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'a':
353c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 4)
354c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "acos") || !strcmp(Str, "asin") ||
355c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner             !strcmp(Str, "atan");
356c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 5)
357c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "atan2");
358c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
359c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'c':
360c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3)
361c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "cos");
362c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 4)
363c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "ceil") || !strcmp(Str, "cosf") ||
364c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner             !strcmp(Str, "cosh");
365c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
366c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'e':
367c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3)
368c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "exp");
369c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
370c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'f':
371c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 4)
372c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "fabs") || !strcmp(Str, "fmod");
373c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 5)
374c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "floor");
375c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
376c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    break;
377c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'l':
378c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3 && !strcmp(Str, "log"))
379c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
380c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 5 && !strcmp(Str, "log10"))
381c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
382c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
383c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'p':
384c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3 && !strcmp(Str, "pow"))
385c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
386c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
387c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 's':
388c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3)
389c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "sin");
390c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 4)
391c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "sinh") || !strcmp(Str, "sqrt");
392c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 5)
393c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "sqrtf");
394c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
395c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 't':
396c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3 && !strcmp(Str, "tan"))
397c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
398c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 4 && !strcmp(Str, "tanh"))
399c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
400c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
401bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
402bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
403bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
40472d88ae5447a3929c97e88f4c806213847b5d988Chris Lattnerstatic Constant *ConstantFoldFP(double (*NativeFP)(double), double V,
40572d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner                                const Type *Ty) {
406bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  errno = 0;
407bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  V = NativeFP(V);
40843421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen  if (errno == 0) {
40943421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen    if (Ty==Type::FloatTy)
41043421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      return ConstantFP::get(Ty, APFloat((float)V));
41143421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen    else if (Ty==Type::DoubleTy)
41243421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      return ConstantFP::get(Ty, APFloat(V));
41343421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen    else
41443421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      assert(0);
41543421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen  }
41672d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  errno = 0;
417bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  return 0;
418bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
419bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
420384152444d22d356f7b4090a158da4cbc1f79464Dan Gohmanstatic Constant *ConstantFoldBinaryFP(double (*NativeFP)(double, double),
421384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman                                      double V, double W,
422384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman                                      const Type *Ty) {
423384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  errno = 0;
424384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  V = NativeFP(V, W);
42543421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen  if (errno == 0) {
42643421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen    if (Ty==Type::FloatTy)
42743421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      return ConstantFP::get(Ty, APFloat((float)V));
42843421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen    else if (Ty==Type::DoubleTy)
42943421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      return ConstantFP::get(Ty, APFloat(V));
43043421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen    else
43143421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      assert(0);
43243421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen  }
433384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  errno = 0;
434384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  return 0;
435384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman}
436384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman
437bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// ConstantFoldCall - Attempt to constant fold a call to the specified function
438bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// with the specified arguments, returning null if unsuccessful.
43943421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen
440bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John CriswellConstant *
44172d88ae5447a3929c97e88f4c806213847b5d988Chris Lattnerllvm::ConstantFoldCall(Function *F, Constant** Operands, unsigned NumOperands) {
442c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const ValueName *NameVal = F->getValueName();
443a099b6c7bb574f22bc002e0b3c65c25abccca1d5Chris Lattner  if (NameVal == 0) return 0;
444c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const char *Str = NameVal->getKeyData();
445c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  unsigned Len = NameVal->getKeyLength();
446c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner
447bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  const Type *Ty = F->getReturnType();
44872d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  if (NumOperands == 1) {
449bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    if (ConstantFP *Op = dyn_cast<ConstantFP>(Operands[0])) {
45043421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      if (Ty!=Type::FloatTy && Ty!=Type::DoubleTy)
45143421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen        return 0;
45243421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      /// Currently APFloat versions of these functions do not exist, so we use
45343421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      /// the host native double versions.  Float versions are not called
45443421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      /// directly but for all these it is true (float)(f((double)arg)) ==
45543421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      /// f(arg).  Long double not supported yet.
45643421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      double V = Ty==Type::FloatTy ? (double)Op->getValueAPF().convertToFloat():
45743421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                                     Op->getValueAPF().convertToDouble();
458c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      switch (Str[0]) {
459c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'a':
460c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 4 && !strcmp(Str, "acos"))
461c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(acos, V, Ty);
462c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "asin"))
463c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(asin, V, Ty);
464c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "atan"))
465c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(atan, V, Ty);
466c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
467c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'c':
468c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 4 && !strcmp(Str, "ceil"))
469c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(ceil, V, Ty);
470c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 3 && !strcmp(Str, "cos"))
471c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(cos, V, Ty);
472c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "cosh"))
473c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(cosh, V, Ty);
474c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
475c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'e':
476c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "exp"))
477c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(exp, V, Ty);
478c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
479c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'f':
480c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 4 && !strcmp(Str, "fabs"))
48143421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen          return ConstantFoldFP(fabs, V, Ty);
482c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 5 && !strcmp(Str, "floor"))
483c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(floor, V, Ty);
484c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
485c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'l':
486c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "log") && V > 0)
487c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(log, V, Ty);
488c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 5 && !strcmp(Str, "log10") && V > 0)
489c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(log10, V, Ty);
490c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (!strcmp(Str, "llvm.sqrt.f32") ||
491c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner                 !strcmp(Str, "llvm.sqrt.f64")) {
492c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          if (V >= -0.0)
49343421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen            return ConstantFoldFP(sqrt, V, Ty);
494c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          else // Undefined
49543421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen            return ConstantFP::get(Ty, Ty==Type::FloatTy ? APFloat(0.0f) :
49643421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                                       APFloat(0.0));
497c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        }
498c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
499c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 's':
500c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "sin"))
501c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sin, V, Ty);
502c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "sinh"))
503c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sinh, V, Ty);
504c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "sqrt") && V >= 0)
505c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sqrt, V, Ty);
506c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 5 && !strcmp(Str, "sqrtf") && V >= 0)
507c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sqrt, V, Ty);
508c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
509c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 't':
510c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "tan"))
511c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(tan, V, Ty);
512c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "tanh"))
513c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(tanh, V, Ty);
514c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
515c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      default:
516c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
517bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      }
518b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer    } else if (ConstantInt *Op = dyn_cast<ConstantInt>(Operands[0])) {
519c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      if (Len > 11 && !memcmp(Str, "llvm.bswap", 10)) {
520e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        return ConstantInt::get(Op->getValue().byteSwap());
521c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      } else if (Len > 11 && !memcmp(Str, "llvm.ctpop", 10)) {
522e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        uint64_t ctpop = Op->getValue().countPopulation();
5236994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        return ConstantInt::get(Ty, ctpop);
524c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      } else if (Len > 10 && !memcmp(Str, "llvm.cttz", 9)) {
525e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        uint64_t cttz = Op->getValue().countTrailingZeros();
5266994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        return ConstantInt::get(Ty, cttz);
527c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      } else if (Len > 10 && !memcmp(Str, "llvm.ctlz", 9)) {
528e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        uint64_t ctlz = Op->getValue().countLeadingZeros();
5296994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        return ConstantInt::get(Ty, ctlz);
530e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer      }
531bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    }
53272d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  } else if (NumOperands == 2) {
533bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    if (ConstantFP *Op1 = dyn_cast<ConstantFP>(Operands[0])) {
5349ab7fb3ba47442d521a5bed09a27a5e8e7a786edDale Johannesen      if (Ty!=Type::FloatTy && Ty!=Type::DoubleTy)
5359ab7fb3ba47442d521a5bed09a27a5e8e7a786edDale Johannesen        return 0;
53643421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen      double Op1V = Ty==Type::FloatTy ?
53743421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                      (double)Op1->getValueAPF().convertToFloat():
53843421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                      Op1->getValueAPF().convertToDouble();
539bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      if (ConstantFP *Op2 = dyn_cast<ConstantFP>(Operands[1])) {
54043421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen        double Op2V = Ty==Type::FloatTy ?
54143421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                      (double)Op2->getValueAPF().convertToFloat():
54243421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                      Op2->getValueAPF().convertToDouble();
543bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
544c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "pow")) {
545384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman          return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
546c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        } else if (Len == 4 && !strcmp(Str, "fmod")) {
547384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman          return ConstantFoldBinaryFP(fmod, Op1V, Op2V, Ty);
548c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        } else if (Len == 5 && !strcmp(Str, "atan2")) {
549384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman          return ConstantFoldBinaryFP(atan2, Op1V, Op2V, Ty);
550b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        }
551b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner      } else if (ConstantInt *Op2C = dyn_cast<ConstantInt>(Operands[1])) {
552c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (!strcmp(Str, "llvm.powi.f32")) {
55343421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen          return ConstantFP::get(Ty, APFloat((float)std::pow((float)Op1V,
55443421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                                              (int)Op2C->getZExtValue())));
555c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        } else if (!strcmp(Str, "llvm.powi.f64")) {
55643421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen          return ConstantFP::get(Ty, APFloat((double)std::pow((double)Op1V,
55743421b3dd70af5b70e71816521f37502c397cc65Dale Johannesen                                              (int)Op2C->getZExtValue())));
558b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        }
559bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      }
560bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    }
561bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
562bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  return 0;
563bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
564bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
565