ConstantFolding.cpp revision 309f87e34a12e3398932e4c2c9e3c47cad0e8f0f
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"
2203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner#include "llvm/Target/TargetData.h"
23bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Support/GetElementPtrTypeIterator.h"
24bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include "llvm/Support/MathExtras.h"
25bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell#include <cerrno>
2697af751deb9b26fd42fbcee082da9ccc4ded5b45Jeff Cohen#include <cmath>
27bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellusing namespace llvm;
28bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
2903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
3003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner// Constant Folding internal helper functions
3103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
3203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
3303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// IsConstantOffsetFromGlobal - If this constant is actually a constant offset
3403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// from a global, return the global and the constant.  Because of
3503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// constantexprs, this function is recursive.
3603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattnerstatic bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV,
3703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                       int64_t &Offset, const TargetData &TD) {
3803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Trivial case, constant is the global.
3903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if ((GV = dyn_cast<GlobalValue>(C))) {
4003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    Offset = 0;
4103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return true;
4203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
4303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
4403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Otherwise, if this isn't a constant expr, bail out.
4503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  ConstantExpr *CE = dyn_cast<ConstantExpr>(C);
4603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (!CE) return false;
4703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
4803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Look through ptr->int and ptr->ptr casts.
4903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (CE->getOpcode() == Instruction::PtrToInt ||
5003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      CE->getOpcode() == Instruction::BitCast)
5103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD);
5203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
5303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // i32* getelementptr ([5 x i32]* @a, i32 0, i32 5)
5403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (CE->getOpcode() == Instruction::GetElementPtr) {
5503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // Cannot compute this if the element type of the pointer is missing size
5603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // info.
5703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (!cast<PointerType>(CE->getOperand(0)->getType())->getElementType()->isSized())
5803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return false;
5903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
6003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // If the base isn't a global+constant, we aren't either.
6103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (!IsConstantOffsetFromGlobal(CE->getOperand(0), GV, Offset, TD))
6203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return false;
6303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
6403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // Otherwise, add any offset that our operands provide.
6503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    gep_type_iterator GTI = gep_type_begin(CE);
6603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i, ++GTI) {
6703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      ConstantInt *CI = dyn_cast<ConstantInt>(CE->getOperand(i));
6803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (!CI) return false;  // Index isn't a simple constant?
6903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (CI->getZExtValue() == 0) continue;  // Not adding anything.
7003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
7103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (const StructType *ST = dyn_cast<StructType>(*GTI)) {
7203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        // N = N + Offset
73b1919e2f08ecb37140af676fd2916f8d5ed7df3dChris Lattner        Offset += TD.getStructLayout(ST)->getElementOffset(CI->getZExtValue());
7403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      } else {
7503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        const SequentialType *ST = cast<SequentialType>(*GTI);
7603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        Offset += TD.getTypeSize(ST->getElementType())*CI->getSExtValue();
7703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      }
7803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    }
7903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return true;
8003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
8103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
8203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return false;
8303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner}
8403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
8503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
8603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// SymbolicallyEvaluateBinop - One of Op0/Op1 is a constant expression.
8703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// Attempt to symbolically evaluate the result of  a binary operator merging
8803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// these together.  If target data info is available, it is provided as TD,
8903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// otherwise TD is null.
9003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattnerstatic Constant *SymbolicallyEvaluateBinop(unsigned Opc, Constant *Op0,
9103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                           Constant *Op1, const TargetData *TD){
9203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // SROA
9303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
9403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Fold (and 0xffffffff00000000, (shl x, 32)) -> shl.
9503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Fold (lshr (or X, Y), 32) -> (lshr [X/Y], 32) if one doesn't contribute
9603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // bits.
9703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
9803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
9903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // If the constant expr is something like &A[123] - &A[4].f, fold this into a
10003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // constant.  This happens frequently when iterating over a global array.
10103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (Opc == Instruction::Sub && TD) {
10203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    GlobalValue *GV1, *GV2;
10303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    int64_t Offs1, Offs2;
10403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
10503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (IsConstantOffsetFromGlobal(Op0, GV1, Offs1, *TD))
10603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (IsConstantOffsetFromGlobal(Op1, GV2, Offs2, *TD) &&
10703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner          GV1 == GV2) {
10803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        // (&GV+C1) - (&GV+C2) -> C1-C2, pointer arithmetic cannot overflow.
10903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        return ConstantInt::get(Op0->getType(), Offs1-Offs2);
11003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      }
11103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
11203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
11303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // TODO: Fold icmp setne/seteq as well.
11403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return 0;
11503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner}
11603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
11703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// SymbolicallyEvaluateGEP - If we can symbolically evaluate the specified GEP
11803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner/// constant expression, do so.
11903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattnerstatic Constant *SymbolicallyEvaluateGEP(Constant** Ops, unsigned NumOps,
12003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                         const Type *ResultTy,
12103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                         const TargetData *TD) {
12203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  Constant *Ptr = Ops[0];
12303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (!cast<PointerType>(Ptr->getType())->getElementType()->isSized())
12403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    return 0;
12503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
12603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (TD && Ptr->isNullValue()) {
12703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // If this is a constant expr gep that is effectively computing an
12803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    // "offsetof", fold it into 'cast int Size to T*' instead of 'gep 0, 0, 12'
12903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    bool isFoldableGEP = true;
13003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    for (unsigned i = 1; i != NumOps; ++i)
13103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (!isa<ConstantInt>(Ops[i])) {
13203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        isFoldableGEP = false;
13303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        break;
13403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      }
13503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (isFoldableGEP) {
136309f87e34a12e3398932e4c2c9e3c47cad0e8f0fChris Lattner      uint64_t Offset = TD->getIndexedOffset(Ptr->getType(),
137309f87e34a12e3398932e4c2c9e3c47cad0e8f0fChris Lattner                                             (Value**)Ops+1, NumOps-1);
13803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      Constant *C = ConstantInt::get(TD->getIntPtrType(), Offset);
13903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return ConstantExpr::getIntToPtr(C, ResultTy);
14003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    }
14103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
14203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
14303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return 0;
14403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner}
14503dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
14603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
14703dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
14803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner// Constant Folding public APIs
14903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner//===----------------------------------------------------------------------===//
15003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
15103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
1525520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldInstruction - Attempt to constant fold the specified
1535520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// instruction.  If successful, the constant result is returned, if not, null
1545520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// is returned.  Note that this function can only fail when attempting to fold
1555520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// instructions like loads and stores, which have no constant expression form.
1565520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner///
1575520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldInstruction(Instruction *I, const TargetData *TD) {
1585520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  if (PHINode *PN = dyn_cast<PHINode>(I)) {
1595520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (PN->getNumIncomingValues() == 0)
1605520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return Constant::getNullValue(PN->getType());
1615520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1625520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    Constant *Result = dyn_cast<Constant>(PN->getIncomingValue(0));
1635520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (Result == 0) return 0;
1645520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1655520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    // Handle PHI nodes specially here...
1665520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    for (unsigned i = 1, e = PN->getNumIncomingValues(); i != e; ++i)
1675520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (PN->getIncomingValue(i) != Result && PN->getIncomingValue(i) != PN)
1685520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;   // Not all the same incoming constants...
1695520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1705520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    // If we reach here, all incoming values are the same constant.
1715520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return Result;
1725520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  }
1735520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1745520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // Scan the operand list, checking to see if they are all constants, if so,
1755520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // hand off to ConstantFoldInstOperands.
1765520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  SmallVector<Constant*, 8> Ops;
1775520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  for (unsigned i = 0, e = I->getNumOperands(); i != e; ++i)
1785520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (Constant *Op = dyn_cast<Constant>(I->getOperand(i)))
1795520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      Ops.push_back(Op);
1805520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    else
1815520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return 0;  // All operands not constant!
1825520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
18303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  return ConstantFoldInstOperands(I, &Ops[0], Ops.size(), TD);
1845520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
1855520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
1865520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
1875520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// specified opcode and operands.  If successful, the constant result is
1885520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// returned, if not, null is returned.  Note that this function can fail when
1895520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// attempting to fold instructions like loads and stores, which have no
1905520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// constant expression form.
1915520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner///
1925520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldInstOperands(const Instruction* I,
1935520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                         Constant** Ops, unsigned NumOps,
1945520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                         const TargetData *TD) {
1955520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  unsigned Opc = I->getOpcode();
1965520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  const Type *DestTy = I->getType();
1975520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
19803dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  // Handle easy binops first.
19903dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  if (isa<BinaryOperator>(I)) {
20003dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (isa<ConstantExpr>(Ops[0]) || isa<ConstantExpr>(Ops[1]))
20103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      if (Constant *C = SymbolicallyEvaluateBinop(I->getOpcode(), Ops[0],
20203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner                                                  Ops[1], TD))
20303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner        return C;
20403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
2055520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::get(Opc, Ops[0], Ops[1]);
20603dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner  }
2075520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2085520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  switch (Opc) {
2095520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  default: return 0;
2105520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Call:
2115520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (Function *F = dyn_cast<Function>(Ops[0]))
2125520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (canConstantFoldCallTo(F))
213ad58eb34342f70f094008e6d08cb4ed814754e64Chris Lattner        return ConstantFoldCall(F, Ops+1, NumOps-1);
2145520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return 0;
2155520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ICmp:
2165520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FCmp:
2175520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getCompare(cast<CmpInst>(I)->getPredicate(), Ops[0],
2185520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                    Ops[1]);
2195520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Trunc:
2205520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ZExt:
2215520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::SExt:
2225520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPTrunc:
2235520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPExt:
2245520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::UIToFP:
2255520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::SIToFP:
2265520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPToUI:
2275520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPToSI:
2285520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::PtrToInt:
2295520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::IntToPtr:
2305520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::BitCast:
2315520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getCast(Opc, Ops[0], DestTy);
2325520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Select:
2335520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
2345520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ExtractElement:
2355520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getExtractElement(Ops[0], Ops[1]);
2365520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::InsertElement:
2375520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]);
2385520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ShuffleVector:
2395520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
2405520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::GetElementPtr:
24103dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (Constant *C = SymbolicallyEvaluateGEP(Ops, NumOps, I->getType(), TD))
24203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return C;
24303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
244d917fe56926f2f80665fd154eb23ca41e9df6f67Chris Lattner    return ConstantExpr::getGetElementPtr(Ops[0], Ops+1, NumOps-1);
2455520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  }
2465520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
2475520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2485520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a
2495520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// getelementptr constantexpr, return the constant value being addressed by the
2505520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// constant expression, or null if something is funny and we can't decide.
2515520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C,
2525520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                                       ConstantExpr *CE) {
2535520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  if (CE->getOperand(1) != Constant::getNullValue(CE->getOperand(1)->getType()))
2545520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return 0;  // Do not allow stepping over the value!
2555520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2565520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // Loop over all of the operands, tracking down which value we are
2575520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // addressing...
2585520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  gep_type_iterator I = gep_type_begin(CE), E = gep_type_end(CE);
2595520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  for (++I; I != E; ++I)
2605520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (const StructType *STy = dyn_cast<StructType>(*I)) {
2615520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      ConstantInt *CU = cast<ConstantInt>(I.getOperand());
2625520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      assert(CU->getZExtValue() < STy->getNumElements() &&
2635520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner             "Struct index out of range!");
2645520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      unsigned El = (unsigned)CU->getZExtValue();
2655520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) {
2665520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = CS->getOperand(El);
2675520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (isa<ConstantAggregateZero>(C)) {
2685520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = Constant::getNullValue(STy->getElementType(El));
2695520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (isa<UndefValue>(C)) {
2705520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = UndefValue::get(STy->getElementType(El));
2715520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else {
2725520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;
2735520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      }
2745520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) {
2755520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) {
2765520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (CI->getZExtValue() >= ATy->getNumElements())
2775520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner         return 0;
2785520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
2795520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = CA->getOperand(CI->getZExtValue());
2805520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<ConstantAggregateZero>(C))
2815520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = Constant::getNullValue(ATy->getElementType());
2825520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<UndefValue>(C))
2835520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = UndefValue::get(ATy->getElementType());
2845520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else
2855520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
2865520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (const PackedType *PTy = dyn_cast<PackedType>(*I)) {
2875520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (CI->getZExtValue() >= PTy->getNumElements())
2885520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
2895520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C))
2905520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = CP->getOperand(CI->getZExtValue());
2915520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<ConstantAggregateZero>(C))
2925520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = Constant::getNullValue(PTy->getElementType());
2935520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<UndefValue>(C))
2945520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = UndefValue::get(PTy->getElementType());
2955520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else
2965520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
2975520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else {
2985520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;
2995520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      }
3005520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    } else {
3015520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return 0;
3025520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    }
3035520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  return C;
3045520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
3055520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
3065520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
307bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//===----------------------------------------------------------------------===//
3085520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner//  Constant Folding for Calls
309bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
310bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
311bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// canConstantFoldCallTo - Return true if its even possible to fold a call to
312bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// the specified function.
313bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellbool
314bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellllvm::canConstantFoldCallTo(Function *F) {
315bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  const std::string &Name = F->getName();
316bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
317bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  switch (F->getIntrinsicID()) {
3180b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  case Intrinsic::sqrt_f32:
3190b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  case Intrinsic::sqrt_f64:
3206fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  case Intrinsic::bswap_i16:
3216fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  case Intrinsic::bswap_i32:
3226fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  case Intrinsic::bswap_i64:
323b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner  case Intrinsic::powi_f32:
324b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner  case Intrinsic::powi_f64:
3256fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman  // FIXME: these should be constant folded as well
3260b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctpop_i8:
3270b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctpop_i16:
3280b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctpop_i32:
3290b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctpop_i64:
3300b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctlz_i8:
3310b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctlz_i16:
3320b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctlz_i32:
3330b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::ctlz_i64:
3340b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::cttz_i8:
3350b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::cttz_i16:
3360b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::cttz_i32:
3370b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  //case Intrinsic::cttz_i64:
338bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    return true;
339bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  default: break;
340bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
341bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
342bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  switch (Name[0])
343bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  {
344bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 'a':
345bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "acos" || Name == "asin" || Name == "atan" ||
346bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell             Name == "atan2";
347bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 'c':
348bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "ceil" || Name == "cos" || Name == "cosf" ||
349bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell             Name == "cosh";
350bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 'e':
351bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "exp";
352bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 'f':
353bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "fabs" || Name == "fmod" || Name == "floor";
354bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 'l':
355bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "log" || Name == "log10";
356bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 'p':
357bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "pow";
358bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 's':
3595cff2677a68bf7748bbc2d680b59248448a7fc89Chris Lattner      return Name == "sin" || Name == "sinh" ||
3605cff2677a68bf7748bbc2d680b59248448a7fc89Chris Lattner             Name == "sqrt" || Name == "sqrtf";
361bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    case 't':
362bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return Name == "tan" || Name == "tanh";
363bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    default:
364bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      return false;
365bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
366bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
367bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
36872d88ae5447a3929c97e88f4c806213847b5d988Chris Lattnerstatic Constant *ConstantFoldFP(double (*NativeFP)(double), double V,
36972d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner                                const Type *Ty) {
370bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  errno = 0;
371bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  V = NativeFP(V);
372bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  if (errno == 0)
373bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    return ConstantFP::get(Ty, V);
37472d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  errno = 0;
375bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  return 0;
376bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
377bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
378bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// ConstantFoldCall - Attempt to constant fold a call to the specified function
379bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// with the specified arguments, returning null if unsuccessful.
380bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John CriswellConstant *
38172d88ae5447a3929c97e88f4c806213847b5d988Chris Lattnerllvm::ConstantFoldCall(Function *F, Constant** Operands, unsigned NumOperands) {
382bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  const std::string &Name = F->getName();
383bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  const Type *Ty = F->getReturnType();
384bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
38572d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  if (NumOperands == 1) {
386bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    if (ConstantFP *Op = dyn_cast<ConstantFP>(Operands[0])) {
387bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      double V = Op->getValue();
388bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      switch (Name[0])
389bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      {
390bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 'a':
391bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "acos")
392bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFoldFP(acos, V, Ty);
393bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "asin")
394bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFoldFP(asin, V, Ty);
395bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "atan")
396bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, atan(V));
397bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
398bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 'c':
399bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "ceil")
400bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFoldFP(ceil, V, Ty);
401bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "cos")
402bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, cos(V));
403bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "cosh")
404bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, cosh(V));
405bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
406bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 'e':
407bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "exp")
408bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, exp(V));
409bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
410bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 'f':
411bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "fabs")
412bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, fabs(V));
413bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "floor")
414bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFoldFP(floor, V, Ty);
415bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
416bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 'l':
417bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "log" && V > 0)
418bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, log(V));
419bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "log10" && V > 0)
420bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFoldFP(log10, V, Ty);
4210b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer          else if (Name == "llvm.sqrt.f32" || Name == "llvm.sqrt.f64") {
422bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            if (V >= -0.0)
423bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell              return ConstantFP::get(Ty, sqrt(V));
424bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            else // Undefined
425bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell              return ConstantFP::get(Ty, 0.0);
426bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          }
427bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
428bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 's':
429bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "sin")
430bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, sin(V));
431bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "sinh")
432bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, sinh(V));
433bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "sqrt" && V >= 0)
434bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, sqrt(V));
4355cff2677a68bf7748bbc2d680b59248448a7fc89Chris Lattner          else if (Name == "sqrtf" && V >= 0)
4365cff2677a68bf7748bbc2d680b59248448a7fc89Chris Lattner            return ConstantFP::get(Ty, sqrt((float)V));
437bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
438bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        case 't':
439bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (Name == "tan")
440bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, tan(V));
441bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          else if (Name == "tanh")
442bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, tanh(V));
443bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
444bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        default:
445bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          break;
446bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      }
447b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer    } else if (ConstantInt *Op = dyn_cast<ConstantInt>(Operands[0])) {
448b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer      uint64_t V = Op->getZExtValue();
4496fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman      if (Name == "llvm.bswap.i16")
450b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        return ConstantInt::get(Ty, ByteSwap_16(V));
4516fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman      else if (Name == "llvm.bswap.i32")
452b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        return ConstantInt::get(Ty, ByteSwap_32(V));
4536fb3bd6a658940287789198d3207b0da04c0a4e6Nate Begeman      else if (Name == "llvm.bswap.i64")
454b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer        return ConstantInt::get(Ty, ByteSwap_64(V));
455bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    }
45672d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  } else if (NumOperands == 2) {
457bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    if (ConstantFP *Op1 = dyn_cast<ConstantFP>(Operands[0])) {
458bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      double Op1V = Op1->getValue();
459bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      if (ConstantFP *Op2 = dyn_cast<ConstantFP>(Operands[1])) {
460bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        double Op2V = Op2->getValue();
461bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
462bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        if (Name == "pow") {
463bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          errno = 0;
464bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          double V = pow(Op1V, Op2V);
465bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (errno == 0)
466bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, V);
467bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        } else if (Name == "fmod") {
468bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          errno = 0;
469bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          double V = fmod(Op1V, Op2V);
470bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          if (errno == 0)
471bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell            return ConstantFP::get(Ty, V);
472b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        } else if (Name == "atan2") {
473bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell          return ConstantFP::get(Ty, atan2(Op1V,Op2V));
474b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        }
475b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner      } else if (ConstantInt *Op2C = dyn_cast<ConstantInt>(Operands[1])) {
476b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        if (Name == "llvm.powi.f32") {
477b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner          return ConstantFP::get(Ty, std::pow((float)Op1V,
478b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner                                              (int)Op2C->getZExtValue()));
479b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        } else if (Name == "llvm.powi.f64") {
480b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner          return ConstantFP::get(Ty, std::pow((double)Op1V,
481b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner                                              (int)Op2C->getZExtValue()));
482b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        }
483bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      }
484bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    }
485bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
486bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  return 0;
487bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
488bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
489