136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- 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
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_IR_CONSTANTFOLDER_H
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_IR_CONSTANTFOLDER_H
191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/InstrTypes.h"
221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandsnamespace llvm {
247f4151bc69e02a22862752742ad1cb637d90ded0Dan Gohman
251e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands/// ConstantFolder - Create constants with minimum, target independent, folding.
261e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandsclass ConstantFolder {
271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sandspublic:
28c12d4c93f94e271d32e60fae1d521c4fca39ae1eFrits van Bommel  explicit ConstantFolder() {}
291e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
311e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Binary Operators
321e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
3481baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Constant *CreateAdd(Constant *LHS, Constant *RHS,
3581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                      bool HasNUW = false, bool HasNSW = false) const {
3681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return ConstantExpr::getAdd(LHS, RHS, HasNUW, HasNSW);
378991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
38ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFAdd(Constant *LHS, Constant *RHS) const {
39baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFAdd(LHS, RHS);
40ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
4181baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Constant *CreateSub(Constant *LHS, Constant *RHS,
4281baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                      bool HasNUW = false, bool HasNSW = false) const {
4381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return ConstantExpr::getSub(LHS, RHS, HasNUW, HasNSW);
448991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
45ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFSub(Constant *LHS, Constant *RHS) const {
46baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFSub(LHS, RHS);
47ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
4881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Constant *CreateMul(Constant *LHS, Constant *RHS,
4981baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                      bool HasNUW = false, bool HasNSW = false) const {
5081baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return ConstantExpr::getMul(LHS, RHS, HasNUW, HasNSW);
518991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
52ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFMul(Constant *LHS, Constant *RHS) const {
53baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFMul(LHS, RHS);
54ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
55413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateUDiv(Constant *LHS, Constant *RHS,
56413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
57413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getUDiv(LHS, RHS, isExact);
581e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
59413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateSDiv(Constant *LHS, Constant *RHS,
60413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
61413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getSDiv(LHS, RHS, isExact);
6259c4f5c2fc82af14b0f4f332709aac62921c6177Dan Gohman  }
631e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateFDiv(Constant *LHS, Constant *RHS) const {
64baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFDiv(LHS, RHS);
651e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
661e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateURem(Constant *LHS, Constant *RHS) const {
67baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getURem(LHS, RHS);
681e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
691e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSRem(Constant *LHS, Constant *RHS) const {
70baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getSRem(LHS, RHS);
711e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
721e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateFRem(Constant *LHS, Constant *RHS) const {
73baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFRem(LHS, RHS);
741e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
7581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Constant *CreateShl(Constant *LHS, Constant *RHS,
7681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                      bool HasNUW = false, bool HasNSW = false) const {
7781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return ConstantExpr::getShl(LHS, RHS, HasNUW, HasNSW);
781e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
79413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateLShr(Constant *LHS, Constant *RHS,
80413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
81413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getLShr(LHS, RHS, isExact);
821e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
83413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner  Constant *CreateAShr(Constant *LHS, Constant *RHS,
84413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner                       bool isExact = false) const {
85413c3bd9fd820a0969cd0e84124f3a3fadc5cc61Chris Lattner    return ConstantExpr::getAShr(LHS, RHS, isExact);
861e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
871e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateAnd(Constant *LHS, Constant *RHS) const {
88baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getAnd(LHS, RHS);
891e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
901e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateOr(Constant *LHS, Constant *RHS) const {
91baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getOr(LHS, RHS);
921e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
931e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateXor(Constant *LHS, Constant *RHS) const {
94baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getXor(LHS, RHS);
951e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
961e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
971e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateBinOp(Instruction::BinaryOps Opc,
981e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                        Constant *LHS, Constant *RHS) const {
99baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::get(Opc, LHS, RHS);
1001e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1011e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1021e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1031e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Unary Operators
1041e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1051e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
10681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Constant *CreateNeg(Constant *C,
10781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                      bool HasNUW = false, bool HasNSW = false) const {
10881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return ConstantExpr::getNeg(C, HasNUW, HasNSW);
1098991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
110ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  Constant *CreateFNeg(Constant *C) const {
111baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getFNeg(C);
112ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
1131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateNot(Constant *C) const {
114baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getNot(C);
1151e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1171e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Memory Instructions
1191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Constant *CreateGetElementPtr(Type *Ty, Constant *C,
12212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                ArrayRef<Constant *> IdxList) const {
1230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ConstantExpr::getGetElementPtr(Ty, C, IdxList);
1241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Constant *CreateGetElementPtr(Type *Ty, Constant *C, Constant *Idx) const {
12612fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // This form of the function only exists to avoid ambiguous overload
12712fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // warnings about whether to convert Idx to ArrayRef<Constant *> or
12812fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // ArrayRef<Value *>.
1290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ConstantExpr::getGetElementPtr(Ty, C, Idx);
1301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Constant *CreateGetElementPtr(Type *Ty, Constant *C,
13212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                ArrayRef<Value *> IdxList) const {
1330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ConstantExpr::getGetElementPtr(Ty, C, IdxList);
134e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
13512fc16f1950796486988dc91ba69797efa5bdb64Jay Foad
1360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Constant *CreateInBoundsGetElementPtr(Type *Ty, Constant *C,
13712fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                        ArrayRef<Constant *> IdxList) const {
1380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ConstantExpr::getInBoundsGetElementPtr(Ty, C, IdxList);
13912fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  }
1400c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Constant *CreateInBoundsGetElementPtr(Type *Ty, Constant *C,
1410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar                                        Constant *Idx) const {
14212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // This form of the function only exists to avoid ambiguous overload
14312fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // warnings about whether to convert Idx to ArrayRef<Constant *> or
14412fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // ArrayRef<Value *>.
1450c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ConstantExpr::getInBoundsGetElementPtr(Ty, C, Idx);
14612fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  }
1470c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar  Constant *CreateInBoundsGetElementPtr(Type *Ty, Constant *C,
14812fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                        ArrayRef<Value *> IdxList) const {
1490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar    return ConstantExpr::getInBoundsGetElementPtr(Ty, C, IdxList);
150e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
151e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
1521e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1531e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Cast/Conversion Operators
1541e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1551e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1561e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateCast(Instruction::CastOps Op, Constant *C,
157db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner                       Type *DestTy) const {
158baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCast(Op, C, DestTy);
1591e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
160db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreatePointerCast(Constant *C, Type *DestTy) const {
16102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getPointerCast(C, DestTy);
16202904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
16437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Constant *CreatePointerBitCastOrAddrSpaceCast(Constant *C,
16537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                                Type *DestTy) const {
16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return ConstantExpr::getPointerBitCastOrAddrSpaceCast(C, DestTy);
16737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
169db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateIntCast(Constant *C, Type *DestTy,
1701e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                          bool isSigned) const {
171baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getIntegerCast(C, DestTy, isSigned);
1721e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
173db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateFPCast(Constant *C, Type *DestTy) const {
17402904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getFPCast(C, DestTy);
17502904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1761e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
177db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateBitCast(Constant *C, Type *DestTy) const {
1781e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::BitCast, C, DestTy);
1791e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
180db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateIntToPtr(Constant *C, Type *DestTy) const {
1811e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::IntToPtr, C, DestTy);
1821e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
183db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreatePtrToInt(Constant *C, Type *DestTy) const {
1841e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::PtrToInt, C, DestTy);
1851e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
186db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateZExtOrBitCast(Constant *C, Type *DestTy) const {
18702904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getZExtOrBitCast(C, DestTy);
18802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
189db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateSExtOrBitCast(Constant *C, Type *DestTy) const {
19002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getSExtOrBitCast(C, DestTy);
19102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
19202904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar
193db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateTruncOrBitCast(Constant *C, Type *DestTy) const {
194baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getTruncOrBitCast(C, DestTy);
1951e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1961e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1971e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1981e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Compare Instructions
1991e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2001e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
201fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  Constant *CreateICmp(CmpInst::Predicate P, Constant *LHS,
202fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands                       Constant *RHS) const {
203baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCompare(P, LHS, RHS);
204fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  }
205fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  Constant *CreateFCmp(CmpInst::Predicate P, Constant *LHS,
206fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands                       Constant *RHS) const {
207baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCompare(P, LHS, RHS);
208fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  }
2091e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2101e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2111e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Other Instructions
2121e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSelect(Constant *C, Constant *True, Constant *False) const {
215baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getSelect(C, True, False);
2161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2171e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateExtractElement(Constant *Vec, Constant *Idx) const {
219baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getExtractElement(Vec, Idx);
2201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2211e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2221e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertElement(Constant *Vec, Constant *NewElt,
2231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Idx) const {
224baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getInsertElement(Vec, NewElt, Idx);
2251e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2261e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateShuffleVector(Constant *V1, Constant *V2,
2281e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Mask) const {
229baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getShuffleVector(V1, V2, Mask);
2301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2311e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
232fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad  Constant *CreateExtractValue(Constant *Agg,
233fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad                               ArrayRef<unsigned> IdxList) const {
234fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad    return ConstantExpr::getExtractValue(Agg, IdxList);
2351e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2361e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2371e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertValue(Constant *Agg, Constant *Val,
238fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad                              ArrayRef<unsigned> IdxList) const {
239fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad    return ConstantExpr::getInsertValue(Agg, Val, IdxList);
2401e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2411e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands};
2421e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2431e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands}
2441e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2451e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#endif
246