ConstantFolder.h revision 413c3bd9fd820a0969cd0e84124f3a3fadc5cc61
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//
1020df07ba22c0b7e907c1a7912b5d3d1d2fb948dbDuncan Sands// This file defines the ConstantFolder class, a helper for IRBuilder.
1120df07ba22c0b7e907c1a7912b5d3d1d2fb948dbDuncan Sands// It provides IRBuilder with a set of methods for creating constants
1220df07ba22c0b7e907c1a7912b5d3d1d2fb948dbDuncan Sands// with minimal folding.  For general constant creation and folding,
1320df07ba22c0b7e907c1a7912b5d3d1d2fb948dbDuncan Sands// use ConstantExpr and the routines in llvm/Analysis/ConstantFolding.h.
141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//
151e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands//===----------------------------------------------------------------------===//
161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
171e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#ifndef LLVM_SUPPORT_CONSTANTFOLDER_H
181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#define LLVM_SUPPORT_CONSTANTFOLDER_H
191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#include "llvm/Constants.h"
21131b0d2fcfa72de250f0add965f6f12aea943bf3Douglas Gregor#include "llvm/InstrTypes.h"
221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandsnamespace llvm {
247f4151bc69e02a22862752742ad1cb637d90ded0Dan Gohman
2512ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContext;
267f4151bc69e02a22862752742ad1cb637d90ded0Dan Gohman
271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands/// ConstantFolder - Create constants with minimum, target independent, folding.
281e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandsclass ConstantFolder {
291e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandspublic:
307f4151bc69e02a22862752742ad1cb637d90ded0Dan Gohman  explicit ConstantFolder(LLVMContext &) {}
311e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
321e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Binary Operators
341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
351e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
361e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateAdd(Constant *LHS, Constant *RHS) const {
37baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getAdd(LHS, RHS);
381e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
39d6474fa1f19224e62e5095a6373bed0c69bdb215Dan Gohman  Constant *CreateNSWAdd(Constant *LHS, Constant *RHS) const {
406e7ad958683f34bf6c014c88fef723e5a2d741beDan Gohman    return ConstantExpr::getNSWAdd(LHS, RHS);
41d6474fa1f19224e62e5095a6373bed0c69bdb215Dan Gohman  }
428991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Constant *CreateNUWAdd(Constant *LHS, Constant *RHS) const {
438991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands    return ConstantExpr::getNUWAdd(LHS, RHS);
448991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
45ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFAdd(Constant *LHS, Constant *RHS) const {
46baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFAdd(LHS, RHS);
47ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
481e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSub(Constant *LHS, Constant *RHS) const {
49baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getSub(LHS, RHS);
501e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
513548ea8e905269e819fdd4c7fab42142b745c6c5Duncan Sands  Constant *CreateNSWSub(Constant *LHS, Constant *RHS) const {
523548ea8e905269e819fdd4c7fab42142b745c6c5Duncan Sands    return ConstantExpr::getNSWSub(LHS, RHS);
533548ea8e905269e819fdd4c7fab42142b745c6c5Duncan Sands  }
548991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Constant *CreateNUWSub(Constant *LHS, Constant *RHS) const {
558991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands    return ConstantExpr::getNUWSub(LHS, RHS);
568991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
57ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFSub(Constant *LHS, Constant *RHS) const {
58baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFSub(LHS, RHS);
59ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
601e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateMul(Constant *LHS, Constant *RHS) const {
61baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getMul(LHS, RHS);
621e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
63411984810e4a66591123e1b16873e5f19ae18817Dan Gohman  Constant *CreateNSWMul(Constant *LHS, Constant *RHS) const {
64411984810e4a66591123e1b16873e5f19ae18817Dan Gohman    return ConstantExpr::getNSWMul(LHS, RHS);
65411984810e4a66591123e1b16873e5f19ae18817Dan Gohman  }
668991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Constant *CreateNUWMul(Constant *LHS, Constant *RHS) const {
678991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands    return ConstantExpr::getNUWMul(LHS, RHS);
688991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
69ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFMul(Constant *LHS, Constant *RHS) const {
70baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFMul(LHS, RHS);
71ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
72413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateUDiv(Constant *LHS, Constant *RHS,
73413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
74413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getUDiv(LHS, RHS, isExact);
751e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
76413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateSDiv(Constant *LHS, Constant *RHS,
77413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
78413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getSDiv(LHS, RHS, isExact);
7959c4f5c2fc82af14b0f4f332709aac62921c6177Dan Gohman  }
801e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
81baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFDiv(LHS, RHS);
821e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
831e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateURem(Constant *LHS, Constant *RHS) const {
84baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getURem(LHS, RHS);
851e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
861e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSRem(Constant *LHS, Constant *RHS) const {
87baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getSRem(LHS, RHS);
881e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
891e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateFRem(Constant *LHS, Constant *RHS) const {
90baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFRem(LHS, RHS);
911e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
921e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateShl(Constant *LHS, Constant *RHS) const {
93baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getShl(LHS, RHS);
941e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
95413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateLShr(Constant *LHS, Constant *RHS,
96413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
97413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getLShr(LHS, RHS, isExact);
981e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
99413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateAShr(Constant *LHS, Constant *RHS,
100413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
101413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getAShr(LHS, RHS, isExact);
1021e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1031e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateAnd(Constant *LHS, Constant *RHS) const {
104baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getAnd(LHS, RHS);
1051e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1061e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateOr(Constant *LHS, Constant *RHS) const {
107baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getOr(LHS, RHS);
1081e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1091e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateXor(Constant *LHS, Constant *RHS) const {
110baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getXor(LHS, RHS);
1111e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1121e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateBinOp(Instruction::BinaryOps Opc,
1141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                        Constant *LHS, Constant *RHS) const {
115baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::get(Opc, LHS, RHS);
1161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1171e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Unary Operators
1201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1211e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateNeg(Constant *C) const {
123baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getNeg(C);
1241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
125bdc46c6af5ffcf3596a72df75880fe8703436060Dan Gohman  Constant *CreateNSWNeg(Constant *C) const {
126bdc46c6af5ffcf3596a72df75880fe8703436060Dan Gohman    return ConstantExpr::getNSWNeg(C);
127bdc46c6af5ffcf3596a72df75880fe8703436060Dan Gohman  }
1288991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Constant *CreateNUWNeg(Constant *C) const {
1298991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands    return ConstantExpr::getNUWNeg(C);
1308991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
131ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFNeg(Constant *C) const {
132baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFNeg(C);
133ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
1341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateNot(Constant *C) const {
135baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getNot(C);
1361e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1371e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1381e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1391e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Memory Instructions
1401e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1411e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1421e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateGetElementPtr(Constant *C, Constant* const *IdxList,
1431e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                unsigned NumIdx) const {
144baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
1451e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1461e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateGetElementPtr(Constant *C, Value* const *IdxList,
1471e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                unsigned NumIdx) const {
148baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getGetElementPtr(C, IdxList, NumIdx);
1491e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1501e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
151e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Constant *CreateInBoundsGetElementPtr(Constant *C, Constant* const *IdxList,
152e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman                                        unsigned NumIdx) const {
1536e7ad958683f34bf6c014c88fef723e5a2d741beDan Gohman    return ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx);
154e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
155e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Constant *CreateInBoundsGetElementPtr(Constant *C, Value* const *IdxList,
156e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman                                        unsigned NumIdx) const {
1576e7ad958683f34bf6c014c88fef723e5a2d741beDan Gohman    return ConstantExpr::getInBoundsGetElementPtr(C, IdxList, NumIdx);
158e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
159e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
1601e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1611e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Cast/Conversion Operators
1621e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1631e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1641e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateCast(Instruction::CastOps Op, Constant *C,
1651e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                       const Type *DestTy) const {
166baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCast(Op, C, DestTy);
1671e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
16802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  Constant *CreatePointerCast(Constant *C, const Type *DestTy) const {
16902904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getPointerCast(C, DestTy);
17002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1711e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateIntCast(Constant *C, const Type *DestTy,
1721e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                          bool isSigned) const {
173baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getIntegerCast(C, DestTy, isSigned);
1741e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
17502904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  Constant *CreateFPCast(Constant *C, const Type *DestTy) const {
17602904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getFPCast(C, DestTy);
17702904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1781e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1791e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateBitCast(Constant *C, const Type *DestTy) const {
1801e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::BitCast, C, DestTy);
1811e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1821e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateIntToPtr(Constant *C, const Type *DestTy) const {
1831e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::IntToPtr, C, DestTy);
1841e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1851e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreatePtrToInt(Constant *C, const Type *DestTy) const {
1861e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::PtrToInt, C, DestTy);
1871e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
18802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  Constant *CreateZExtOrBitCast(Constant *C, const Type *DestTy) const {
18902904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getZExtOrBitCast(C, DestTy);
19002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
19102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  Constant *CreateSExtOrBitCast(Constant *C, const Type *DestTy) const {
19202904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getSExtOrBitCast(C, DestTy);
19302904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
19402904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar
1951e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateTruncOrBitCast(Constant *C, const Type *DestTy) const {
196baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getTruncOrBitCast(C, DestTy);
1971e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1981e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1991e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2001e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Compare Instructions
2011e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2021e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
203fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  Constant *CreateICmp(CmpInst::Predicate P, Constant *LHS,
204fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands                       Constant *RHS) const {
205baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCompare(P, LHS, RHS);
206fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  }
207fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  Constant *CreateFCmp(CmpInst::Predicate P, Constant *LHS,
208fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands                       Constant *RHS) const {
209baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCompare(P, LHS, RHS);
210fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  }
2111e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2121e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Other Instructions
2141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2151e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSelect(Constant *C, Constant *True, Constant *False) const {
217baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getSelect(C, True, False);
2181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateExtractElement(Constant *Vec, Constant *Idx) const {
221baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getExtractElement(Vec, Idx);
2221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertElement(Constant *Vec, Constant *NewElt,
2251e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Idx) const {
226baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getInsertElement(Vec, NewElt, Idx);
2271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2281e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2291e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateShuffleVector(Constant *V1, Constant *V2,
2301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Mask) const {
231baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getShuffleVector(V1, V2, Mask);
2321e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateExtractValue(Constant *Agg, const unsigned *IdxList,
2351e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                               unsigned NumIdx) const {
236baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getExtractValue(Agg, IdxList, NumIdx);
2371e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2381e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2391e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertValue(Constant *Agg, Constant *Val,
2401e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                              const unsigned *IdxList, unsigned NumIdx) const {
241baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getInsertValue(Agg, Val, IdxList, NumIdx);
2421e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2431e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands};
2441e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2451e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands}
2461e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2471e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#endif
248