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