ConstantFolding.h revision 7b550ccfc5a3346c17e0390a59e2d6d19bc52705
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- ConstantFolding.h - Fold instructions into constants --------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// This file declares routines for folding instructions into constants. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Also, to supplement the basic VMCore ConstantExpr simplifications, 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this file declares some additional folding routines that can make use of 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TargetData information. These functions cannot go in VMCore due to library 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dependency issues. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef LLVM_ANALYSIS_CONSTANTFOLDING_H 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_ANALYSIS_CONSTANTFOLDING_H 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace llvm { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Constant; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class ConstantExpr; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Instruction; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class TargetData; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Function; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class Type; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ConstantFoldInstruction - Attempt to constant fold the specified 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// instruction. If successful, the constant result is returned, if not, null 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// is returned. Note that this function can only fail when attempting to fold 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// instructions like loads and stores, which have no constant expression form. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Constant *ConstantFoldInstruction(Instruction *I, const TargetData *TD = 0); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ConstantFoldConstantExpression - Attempt to fold the constant expression 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// using the specified TargetData. If successful, the constant result is 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// result is returned, if not, null is returned. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Constant *ConstantFoldConstantExpression(ConstantExpr *CE, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TargetData *TD = 0); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// ConstantFoldInstOperands - Attempt to constant fold an instruction with the 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// specified operands. If successful, the constant result is returned, if not, 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/// null is returned. Note that this function can fail when attempting to 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// fold instructions like loads and stores, which have no constant expression 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// form. 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochConstant *ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy, 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Constant *const *Ops, unsigned NumOps, 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const TargetData *TD = 0); 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// ConstantFoldCompareInstOperands - Attempt to constant fold a compare 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// instruction (icmp/fcmp) with the specified operands. If it fails, it 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// returns a constant expression of the specified operands. 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Constant *ConstantFoldCompareInstOperands(unsigned Predicate, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Constant *const *Ops, unsigned NumOps, 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const TargetData *TD = 0); 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// ConstantFoldLoadFromConstPtr - Return the value that a load from C would 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// produce if it is constant and determinable. If this is not determinable, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// return null. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConstant *ConstantFoldLoadFromConstPtr(Constant *C, const TargetData *TD = 0); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// getelementptr constantexpr, return the constant value being addressed by the 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// constant expression, or null if something is funny and we can't decide. 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConstant *ConstantFoldLoadThroughGEPConstantExpr(Constant *C, ConstantExpr *CE); 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// canConstantFoldCallTo - Return true if its even possible to fold a call to 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// the specified function. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool canConstantFoldCallTo(const Function *F); 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// ConstantFoldCall - Attempt to constant fold a call to the specified function 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/// with the specified arguments, returning null if unsuccessful. 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConstant * 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConstantFoldCall(Function *F, Constant *const *Operands, unsigned NumOperands); 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci