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