ConstantFolding.cpp revision c5f6a1f9d61d74017d90e149728cb3d283e0a0e0
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]);
2205520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Trunc:
2215520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ZExt:
2225520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::SExt:
2235520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPTrunc:
2245520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPExt:
2255520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::UIToFP:
2265520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::SIToFP:
2275520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPToUI:
2285520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::FPToSI:
2295520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::PtrToInt:
2305520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::IntToPtr:
2315520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::BitCast:
2325520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getCast(Opc, Ops[0], DestTy);
2335520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::Select:
2345520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getSelect(Ops[0], Ops[1], Ops[2]);
2355520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ExtractElement:
2365520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getExtractElement(Ops[0], Ops[1]);
2375520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::InsertElement:
2385520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getInsertElement(Ops[0], Ops[1], Ops[2]);
2395520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::ShuffleVector:
2405520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return ConstantExpr::getShuffleVector(Ops[0], Ops[1], Ops[2]);
2415520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  case Instruction::GetElementPtr:
24203dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner    if (Constant *C = SymbolicallyEvaluateGEP(Ops, NumOps, I->getType(), TD))
24303dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner      return C;
24403dd25ca964813c8b9fe14479443b9c21fb92c55Chris Lattner
245d917fe56926f2f80665fd154eb23ca41e9df6f67Chris Lattner    return ConstantExpr::getGetElementPtr(Ops[0], Ops+1, NumOps-1);
2465520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  }
2475520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
2485520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2495520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a
2505520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// getelementptr constantexpr, return the constant value being addressed by the
2515520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner/// constant expression, or null if something is funny and we can't decide.
2525520732b24a5a321140dd79af70d321c7ff3dec9Chris LattnerConstant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C,
2535520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner                                                       ConstantExpr *CE) {
2545520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  if (CE->getOperand(1) != Constant::getNullValue(CE->getOperand(1)->getType()))
2555520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    return 0;  // Do not allow stepping over the value!
2565520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
2575520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // Loop over all of the operands, tracking down which value we are
2585520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  // addressing...
2595520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  gep_type_iterator I = gep_type_begin(CE), E = gep_type_end(CE);
2605520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  for (++I; I != E; ++I)
2615520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    if (const StructType *STy = dyn_cast<StructType>(*I)) {
2625520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      ConstantInt *CU = cast<ConstantInt>(I.getOperand());
2635520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      assert(CU->getZExtValue() < STy->getNumElements() &&
2645520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner             "Struct index out of range!");
2655520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      unsigned El = (unsigned)CU->getZExtValue();
2665520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) {
2675520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = CS->getOperand(El);
2685520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (isa<ConstantAggregateZero>(C)) {
2695520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = Constant::getNullValue(STy->getElementType(El));
2705520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else if (isa<UndefValue>(C)) {
2715520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        C = UndefValue::get(STy->getElementType(El));
2725520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else {
2735520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;
2745520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      }
2755520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) {
2765520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) {
2775520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (CI->getZExtValue() >= ATy->getNumElements())
2785520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner         return 0;
2795520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
2805520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = CA->getOperand(CI->getZExtValue());
2815520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<ConstantAggregateZero>(C))
2825520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = Constant::getNullValue(ATy->getElementType());
2835520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<UndefValue>(C))
2845520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = UndefValue::get(ATy->getElementType());
2855520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else
2865520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
2879d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer      } else if (const VectorType *PTy = dyn_cast<VectorType>(*I)) {
2885520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        if (CI->getZExtValue() >= PTy->getNumElements())
2895520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
2909d6565a5b1fbc4286d6ee638d8f47a3171a9ed7eReid Spencer        if (ConstantVector *CP = dyn_cast<ConstantVector>(C))
2915520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = CP->getOperand(CI->getZExtValue());
2925520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<ConstantAggregateZero>(C))
2935520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = Constant::getNullValue(PTy->getElementType());
2945520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else if (isa<UndefValue>(C))
2955520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          C = UndefValue::get(PTy->getElementType());
2965520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        else
2975520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner          return 0;
2985520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      } else {
2995520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner        return 0;
3005520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      }
3015520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    } else {
3025520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner      return 0;
3035520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner    }
3045520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner  return C;
3055520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner}
3065520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
3075520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner
308bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//===----------------------------------------------------------------------===//
3095520732b24a5a321140dd79af70d321c7ff3dec9Chris Lattner//  Constant Folding for Calls
310bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell//
311bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
312bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// canConstantFoldCallTo - Return true if its even possible to fold a call to
313bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// the specified function.
314bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellbool
315bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswellllvm::canConstantFoldCallTo(Function *F) {
316bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  switch (F->getIntrinsicID()) {
3170b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  case Intrinsic::sqrt_f32:
3180b118206bf3411722707f2e5cab8fd2eedcd50d6Reid Spencer  case Intrinsic::sqrt_f64:
319b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner  case Intrinsic::powi_f32:
320b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner  case Intrinsic::powi_f64:
321e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::bswap:
322e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::ctpop:
323e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::ctlz:
324e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer  case Intrinsic::cttz:
325bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    return true;
326bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  default: break;
327bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
328bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
329c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const ValueName *NameVal = F->getValueName();
330c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const char *Str = NameVal->getKeyData();
331c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  unsigned Len = NameVal->getKeyLength();
332c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  if (Len == 0) return false;
333c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner
334c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  // In these cases, the check of the length is required.  We don't want to
335c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  // return true for a name like "cos\0blah" which strcmp would return equal to
336c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  // "cos", but has length 8.
337c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  switch (Str[0]) {
338c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  default: return false;
339c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'a':
340c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 4)
341c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "acos") || !strcmp(Str, "asin") ||
342c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner             !strcmp(Str, "atan");
343c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 5)
344c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "atan2");
345c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
346c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'c':
347c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3)
348c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "cos");
349c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 4)
350c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "ceil") || !strcmp(Str, "cosf") ||
351c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner             !strcmp(Str, "cosh");
352c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
353c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'e':
354c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3)
355c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "exp");
356c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
357c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'f':
358c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 4)
359c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "fabs") || !strcmp(Str, "fmod");
360c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 5)
361c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "floor");
362c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
363c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    break;
364c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'l':
365c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3 && !strcmp(Str, "log"))
366c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
367c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 5 && !strcmp(Str, "log10"))
368c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
369c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
370c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 'p':
371c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3 && !strcmp(Str, "pow"))
372c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
373c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
374c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 's':
375c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3)
376c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "sin");
377c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 4)
378c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "sinh") || !strcmp(Str, "sqrt");
379c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 5)
380c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return !strcmp(Str, "sqrtf");
381c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
382c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  case 't':
383c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    if (Len == 3 && !strcmp(Str, "tan"))
384c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
385c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    else if (Len == 4 && !strcmp(Str, "tanh"))
386c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      return true;
387c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner    return false;
388bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
389bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
390bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
39172d88ae5447a3929c97e88f4c806213847b5d988Chris Lattnerstatic Constant *ConstantFoldFP(double (*NativeFP)(double), double V,
39272d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner                                const Type *Ty) {
393bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  errno = 0;
394bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  V = NativeFP(V);
395bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  if (errno == 0)
396bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    return ConstantFP::get(Ty, V);
39772d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  errno = 0;
398bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  return 0;
399bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
400bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
401384152444d22d356f7b4090a158da4cbc1f79464Dan Gohmanstatic Constant *ConstantFoldBinaryFP(double (*NativeFP)(double, double),
402384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman                                      double V, double W,
403384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman                                      const Type *Ty) {
404384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  errno = 0;
405384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  V = NativeFP(V, W);
406384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  if (errno == 0)
407384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman    return ConstantFP::get(Ty, V);
408384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  errno = 0;
409384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman  return 0;
410384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman}
411384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman
412bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// ConstantFoldCall - Attempt to constant fold a call to the specified function
413bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell/// with the specified arguments, returning null if unsuccessful.
414bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John CriswellConstant *
41572d88ae5447a3929c97e88f4c806213847b5d988Chris Lattnerllvm::ConstantFoldCall(Function *F, Constant** Operands, unsigned NumOperands) {
416c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const ValueName *NameVal = F->getValueName();
417c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  const char *Str = NameVal->getKeyData();
418c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner  unsigned Len = NameVal->getKeyLength();
419c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner
420bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  const Type *Ty = F->getReturnType();
42172d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  if (NumOperands == 1) {
422bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    if (ConstantFP *Op = dyn_cast<ConstantFP>(Operands[0])) {
423bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      double V = Op->getValue();
424c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      switch (Str[0]) {
425c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'a':
426c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 4 && !strcmp(Str, "acos"))
427c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(acos, V, Ty);
428c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "asin"))
429c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(asin, V, Ty);
430c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "atan"))
431c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(atan, V, Ty);
432c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
433c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'c':
434c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 4 && !strcmp(Str, "ceil"))
435c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(ceil, V, Ty);
436c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 3 && !strcmp(Str, "cos"))
437c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(cos, V, Ty);
438c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "cosh"))
439c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(cosh, V, Ty);
440c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
441c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'e':
442c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "exp"))
443c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(exp, V, Ty);
444c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
445c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'f':
446c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 4 && !strcmp(Str, "fabs"))
447c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFP::get(Ty, fabs(V));
448c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 5 && !strcmp(Str, "floor"))
449c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(floor, V, Ty);
450c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
451c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 'l':
452c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "log") && V > 0)
453c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(log, V, Ty);
454c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 5 && !strcmp(Str, "log10") && V > 0)
455c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(log10, V, Ty);
456c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (!strcmp(Str, "llvm.sqrt.f32") ||
457c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner                 !strcmp(Str, "llvm.sqrt.f64")) {
458c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          if (V >= -0.0)
459c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner            return ConstantFP::get(Ty, sqrt(V));
460c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          else // Undefined
461c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner            return ConstantFP::get(Ty, 0.0);
462c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        }
463c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
464c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 's':
465c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "sin"))
466c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sin, V, Ty);
467c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "sinh"))
468c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sinh, V, Ty);
469c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "sqrt") && V >= 0)
470c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sqrt, V, Ty);
471c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 5 && !strcmp(Str, "sqrtf") && V >= 0)
472c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(sqrt, V, Ty);
473c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
474c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      case 't':
475c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "tan"))
476c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(tan, V, Ty);
477c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        else if (Len == 4 && !strcmp(Str, "tanh"))
478c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner          return ConstantFoldFP(tanh, V, Ty);
479c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
480c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      default:
481c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        break;
482bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      }
483b83eb6447ba155342598f0fabe1f08f5baa9164aReid Spencer    } else if (ConstantInt *Op = dyn_cast<ConstantInt>(Operands[0])) {
484c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      if (Len > 11 && !memcmp(Str, "llvm.bswap", 10)) {
485e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        return ConstantInt::get(Op->getValue().byteSwap());
486c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      } else if (Len > 11 && !memcmp(Str, "llvm.ctpop", 10)) {
487e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        uint64_t ctpop = Op->getValue().countPopulation();
4886994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        return ConstantInt::get(Ty, ctpop);
489c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      } else if (Len > 10 && !memcmp(Str, "llvm.cttz", 9)) {
490e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        uint64_t cttz = Op->getValue().countTrailingZeros();
4916994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        return ConstantInt::get(Ty, cttz);
492c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner      } else if (Len > 10 && !memcmp(Str, "llvm.ctlz", 9)) {
493e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer        uint64_t ctlz = Op->getValue().countLeadingZeros();
4946994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        return ConstantInt::get(Ty, ctlz);
495e9391fd9b52e93717b365bdd05c471101323a4dfReid Spencer      }
496bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    }
49772d88ae5447a3929c97e88f4c806213847b5d988Chris Lattner  } else if (NumOperands == 2) {
498bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    if (ConstantFP *Op1 = dyn_cast<ConstantFP>(Operands[0])) {
499bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      double Op1V = Op1->getValue();
500bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      if (ConstantFP *Op2 = dyn_cast<ConstantFP>(Operands[1])) {
501bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell        double Op2V = Op2->getValue();
502bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
503c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (Len == 3 && !strcmp(Str, "pow")) {
504384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman          return ConstantFoldBinaryFP(pow, Op1V, Op2V, Ty);
505c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        } else if (Len == 4 && !strcmp(Str, "fmod")) {
506384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman          return ConstantFoldBinaryFP(fmod, Op1V, Op2V, Ty);
507c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        } else if (Len == 5 && !strcmp(Str, "atan2")) {
508384152444d22d356f7b4090a158da4cbc1f79464Dan Gohman          return ConstantFoldBinaryFP(atan2, Op1V, Op2V, Ty);
509b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        }
510b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner      } else if (ConstantInt *Op2C = dyn_cast<ConstantInt>(Operands[1])) {
511c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        if (!strcmp(Str, "llvm.powi.f32")) {
512b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner          return ConstantFP::get(Ty, std::pow((float)Op1V,
513b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner                                              (int)Op2C->getZExtValue()));
514c5f6a1f9d61d74017d90e149728cb3d283e0a0e0Chris Lattner        } else if (!strcmp(Str, "llvm.powi.f64")) {
515b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner          return ConstantFP::get(Ty, std::pow((double)Op1V,
516b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner                                              (int)Op2C->getZExtValue()));
517b5282dcf4745be59046f440980a1c0f0a50c9c09Chris Lattner        }
518bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell      }
519bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell    }
520bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  }
521bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell  return 0;
522bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell}
523bd9d37026a5c17d9a51371a6a5446bf4761ee7d6John Criswell
524