1//===-- ConstantFolding.h - Internal Constant Folding Interface -*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the (internal) constant folding interfaces for LLVM.  These
11// interfaces are used by the ConstantExpr::get* methods to automatically fold
12// constants when possible.
13//
14// These operators may return a null object if they don't know how to perform
15// the specified operation on the specified constant types.
16//
17//===----------------------------------------------------------------------===//
18
19#ifndef CONSTANTFOLDING_H
20#define CONSTANTFOLDING_H
21
22#include "llvm/ADT/ArrayRef.h"
23
24namespace llvm {
25  class Value;
26  class Constant;
27  class Type;
28
29  // Constant fold various types of instruction...
30  Constant *ConstantFoldCastInstruction(
31    unsigned opcode,     ///< The opcode of the cast
32    Constant *V,         ///< The source constant
33    Type *DestTy   ///< The destination type
34  );
35  Constant *ConstantFoldSelectInstruction(Constant *Cond,
36                                          Constant *V1, Constant *V2);
37  Constant *ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx);
38  Constant *ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt,
39                                                 Constant *Idx);
40  Constant *ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2,
41                                                 Constant *Mask);
42  Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
43                                                ArrayRef<unsigned> Idxs);
44  Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val,
45                                               ArrayRef<unsigned> Idxs);
46  Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1,
47                                          Constant *V2);
48  Constant *ConstantFoldCompareInstruction(unsigned short predicate,
49                                           Constant *C1, Constant *C2);
50  Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds,
51                                      ArrayRef<Constant *> Idxs);
52  Constant *ConstantFoldGetElementPtr(Constant *C, bool inBounds,
53                                      ArrayRef<Value *> Idxs);
54} // End llvm namespace
55
56#endif
57