ConstantFolder.h revision 1e7f7865ebd3b47c93dc8867abe5baae0df0ebce
11e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//===-- llvm/Support/ConstantFolder.h - Constant folding helper -*- C++ -*-===//
21e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//
31e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//                     The LLVM Compiler Infrastructure
41e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//
51e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands// This file is distributed under the University of Illinois Open Source
61e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands// License. See LICENSE.TXT for details.
71e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//
81e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//===----------------------------------------------------------------------===//
91e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//
101e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands// This file defines the ConstantFolder class, which provides a set of methods
111e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands// for creating constants, with minimal folding.
121e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//
131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//===----------------------------------------------------------------------===//
141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
151e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#ifndef LLVM_SUPPORT_CONSTANTFOLDER_H
161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#define LLVM_SUPPORT_CONSTANTFOLDER_H
171e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#include "llvm/Constants.h"
191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandsnamespace llvm {
211e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands/// ConstantFolder - Create constants with minimum, target independent, folding.
231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandsclass ConstantFolder {
241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandspublic:
251e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
261e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Binary Operators
281e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
291e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateAdd(Constant *LHS, Constant *RHS) const {
311e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getAdd(LHS, RHS);
321e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSub(Constant *LHS, Constant *RHS) const {
341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getSub(LHS, RHS);
351e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
361e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateMul(Constant *LHS, Constant *RHS) const {
371e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getMul(LHS, RHS);
381e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
391e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateUDiv(Constant *LHS, Constant *RHS) const {
401e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getUDiv(LHS, RHS);
411e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
421e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSDiv(Constant *LHS, Constant *RHS) const {
431e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getSDiv(LHS, RHS);
441e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
451e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
461e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getFDiv(LHS, RHS);
471e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
481e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateURem(Constant *LHS, Constant *RHS) const {
491e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getURem(LHS, RHS);
501e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
511e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSRem(Constant *LHS, Constant *RHS) const {
521e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getSRem(LHS, RHS);
531e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
541e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateFRem(Constant *LHS, Constant *RHS) const {
551e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getFRem(LHS, RHS);
561e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
571e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateShl(Constant *LHS, Constant *RHS) const {
581e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getShl(LHS, RHS);
591e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
601e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateLShr(Constant *LHS, Constant *RHS) const {
611e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getLShr(LHS, RHS);
621e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
631e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateAShr(Constant *LHS, Constant *RHS) const {
641e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getAShr(LHS, RHS);
651e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
661e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateAnd(Constant *LHS, Constant *RHS) const {
671e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getAnd(LHS, RHS);
681e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
691e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateOr(Constant *LHS, Constant *RHS) const {
701e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getOr(LHS, RHS);
711e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
721e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateXor(Constant *LHS, Constant *RHS) const {
731e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getXor(LHS, RHS);
741e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
751e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
761e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateBinOp(Instruction::BinaryOps Opc,
771e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                        Constant *LHS, Constant *RHS) const {
781e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::get(Opc, LHS, RHS);
791e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
801e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
811e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
821e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Unary Operators
831e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
841e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
851e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateNeg(Constant *C) const {
861e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getNeg(C);
871e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
881e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateNot(Constant *C) const {
891e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getNot(C);
901e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
911e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
921e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
931e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Memory Instructions
941e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
951e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
961e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateGetElementPtr(Constant *C, Constant* const *IdxList,
971e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                unsigned NumIdx) const {
981e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
991e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1001e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateGetElementPtr(Constant *C, Value* const *IdxList,
1011e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                unsigned NumIdx) const {
1021e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
1031e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1041e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1051e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1061e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Cast/Conversion Operators
1071e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1081e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1091e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateCast(Instruction::CastOps Op, Constant *C,
1101e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                       const Type *DestTy) const {
1111e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getCast(Op, C, DestTy);
1121e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateIntCast(Constant *C, const Type *DestTy,
1141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                          bool isSigned) const {
1151e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getIntegerCast(C, DestTy, isSigned);
1161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1171e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateBitCast(Constant *C, const Type *DestTy) const {
1191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::BitCast, C, DestTy);
1201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1211e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateIntToPtr(Constant *C, const Type *DestTy) const {
1221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::IntToPtr, C, DestTy);
1231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreatePtrToInt(Constant *C, const Type *DestTy) const {
1251e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::PtrToInt, C, DestTy);
1261e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateTruncOrBitCast(Constant *C, const Type *DestTy) const {
1281e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getTruncOrBitCast(C, DestTy);
1291e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1311e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1321e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Compare Instructions
1331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1351e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateCompare(CmpInst::Predicate P, Constant *LHS,
1361e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                          Constant *RHS) const {
1371e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getCompare(P, LHS, RHS);
1381e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1391e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1401e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1411e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Other Instructions
1421e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1431e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1441e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSelect(Constant *C, Constant *True, Constant *False) const {
1451e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getSelect(C, True, False);
1461e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1471e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1481e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateExtractElement(Constant *Vec, Constant *Idx) const {
1491e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getExtractElement(Vec, Idx);
1501e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1511e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1521e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertElement(Constant *Vec, Constant *NewElt,
1531e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Idx) const {
1541e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getInsertElement(Vec, NewElt, Idx);
1551e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1561e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1571e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateShuffleVector(Constant *V1, Constant *V2,
1581e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Mask) const {
1591e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getShuffleVector(V1, V2, Mask);
1601e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1611e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1621e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateExtractValue(Constant *Agg, const unsigned *IdxList,
1631e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                               unsigned NumIdx) const {
1641e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getExtractValue(Agg, IdxList, NumIdx);
1651e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1661e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1671e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertValue(Constant *Agg, Constant *Val,
1681e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                              const unsigned *IdxList, unsigned NumIdx) const {
1691e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return ConstantExpr::getInsertValue(Agg, Val, IdxList, NumIdx);
1701e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1711e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands};
1721e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1731e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands}
1741e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1751e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#endif
176