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
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
12112fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  Constant *CreateGetElementPtr(Constant *C,
12212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                ArrayRef<Constant *> IdxList) const {
123dab3d29605a5c83db41b28176273ef55961120c1Jay Foad    return ConstantExpr::getGetElementPtr(C, IdxList);
1241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
12512fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  Constant *CreateGetElementPtr(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 *>.
129dab3d29605a5c83db41b28176273ef55961120c1Jay Foad    return ConstantExpr::getGetElementPtr(C, Idx);
1301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
13112fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  Constant *CreateGetElementPtr(Constant *C,
13212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                ArrayRef<Value *> IdxList) const {
133dab3d29605a5c83db41b28176273ef55961120c1Jay Foad    return ConstantExpr::getGetElementPtr(C, IdxList);
134e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
13512fc16f1950796486988dc91ba69797efa5bdb64Jay Foad
13612fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  Constant *CreateInBoundsGetElementPtr(Constant *C,
13712fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                        ArrayRef<Constant *> IdxList) const {
138dab3d29605a5c83db41b28176273ef55961120c1Jay Foad    return ConstantExpr::getInBoundsGetElementPtr(C, IdxList);
13912fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  }
14012fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  Constant *CreateInBoundsGetElementPtr(Constant *C, Constant *Idx) const {
14112fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // This form of the function only exists to avoid ambiguous overload
14212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // warnings about whether to convert Idx to ArrayRef<Constant *> or
14312fc16f1950796486988dc91ba69797efa5bdb64Jay Foad    // ArrayRef<Value *>.
144dab3d29605a5c83db41b28176273ef55961120c1Jay Foad    return ConstantExpr::getInBoundsGetElementPtr(C, Idx);
14512fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  }
14612fc16f1950796486988dc91ba69797efa5bdb64Jay Foad  Constant *CreateInBoundsGetElementPtr(Constant *C,
14712fc16f1950796486988dc91ba69797efa5bdb64Jay Foad                                        ArrayRef<Value *> IdxList) const {
148dab3d29605a5c83db41b28176273ef55961120c1Jay Foad    return ConstantExpr::getInBoundsGetElementPtr(C, IdxList);
149e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
150e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
1511e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1521e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Cast/Conversion Operators
1531e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1541e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1551e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateCast(Instruction::CastOps Op, Constant *C,
156db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner                       Type *DestTy) const {
157baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCast(Op, C, DestTy);
1581e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
159db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreatePointerCast(Constant *C, Type *DestTy) const {
16002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getPointerCast(C, DestTy);
16102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
162db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateIntCast(Constant *C, Type *DestTy,
1631e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                          bool isSigned) const {
164baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getIntegerCast(C, DestTy, isSigned);
1651e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
166db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateFPCast(Constant *C, Type *DestTy) const {
16702904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getFPCast(C, DestTy);
16802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1691e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
170db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateBitCast(Constant *C, Type *DestTy) const {
1711e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::BitCast, C, DestTy);
1721e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
173db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateIntToPtr(Constant *C, Type *DestTy) const {
1741e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::IntToPtr, C, DestTy);
1751e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
176db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreatePtrToInt(Constant *C, Type *DestTy) const {
1771e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    return CreateCast(Instruction::PtrToInt, C, DestTy);
1781e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
179db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateZExtOrBitCast(Constant *C, Type *DestTy) const {
18002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getZExtOrBitCast(C, DestTy);
18102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
182db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateSExtOrBitCast(Constant *C, Type *DestTy) const {
18302904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return ConstantExpr::getSExtOrBitCast(C, DestTy);
18402904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
18502904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar
186db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Constant *CreateTruncOrBitCast(Constant *C, Type *DestTy) const {
187baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getTruncOrBitCast(C, DestTy);
1881e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
1891e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1901e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1911e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Compare Instructions
1921e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
1931e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
194fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  Constant *CreateICmp(CmpInst::Predicate P, Constant *LHS,
195fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands                       Constant *RHS) const {
196baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCompare(P, LHS, RHS);
197fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  }
198fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  Constant *CreateFCmp(CmpInst::Predicate P, Constant *LHS,
199fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands                       Constant *RHS) const {
200baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getCompare(P, LHS, RHS);
201fe24bd3a89c44f9a16e3cbcf60c119dac88fad40Duncan Sands  }
2021e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2031e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2041e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  // Other Instructions
2051e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  //===--------------------------------------------------------------------===//
2061e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2071e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateSelect(Constant *C, Constant *True, Constant *False) const {
208baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getSelect(C, True, False);
2091e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2101e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2111e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateExtractElement(Constant *Vec, Constant *Idx) const {
212baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getExtractElement(Vec, Idx);
2131e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2141e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2151e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertElement(Constant *Vec, Constant *NewElt,
2161e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Idx) const {
217baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getInsertElement(Vec, NewElt, Idx);
2181e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2191e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2201e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateShuffleVector(Constant *V1, Constant *V2,
2211e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands                                Constant *Mask) const {
222baf3c404409d5e47b13984a7f95bfbd6d1f2e79eOwen Anderson    return ConstantExpr::getShuffleVector(V1, V2, Mask);
2231e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2241e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
225fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad  Constant *CreateExtractValue(Constant *Agg,
226fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad                               ArrayRef<unsigned> IdxList) const {
227fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad    return ConstantExpr::getExtractValue(Agg, IdxList);
2281e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2291e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Constant *CreateInsertValue(Constant *Agg, Constant *Val,
231fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad                              ArrayRef<unsigned> IdxList) const {
232fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad    return ConstantExpr::getInsertValue(Agg, Val, IdxList);
2331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  }
2341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands};
2351e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2361e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands}
2371e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
2381e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#endif
239