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