1 | //===- IRBuilderFolder.h - Const folder interface for IRBuilder -*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This file defines for constant folding interface used by IRBuilder. |
10 | // It is implemented by ConstantFolder (default), TargetFolder and NoFoler. |
11 | // |
12 | //===----------------------------------------------------------------------===// |
13 | |
14 | #ifndef LLVM_IR_IRBUILDERFOLDER_H |
15 | #define LLVM_IR_IRBUILDERFOLDER_H |
16 | |
17 | #include "llvm/ADT/ArrayRef.h" |
18 | #include "llvm/IR/InstrTypes.h" |
19 | #include "llvm/IR/Instruction.h" |
20 | |
21 | namespace llvm { |
22 | |
23 | /// IRBuilderFolder - Interface for constant folding in IRBuilder. |
24 | class IRBuilderFolder { |
25 | public: |
26 | virtual ~IRBuilderFolder(); |
27 | |
28 | //===--------------------------------------------------------------------===// |
29 | // Value-based folders. |
30 | // |
31 | // Return an existing value or a constant if the operation can be simplified. |
32 | // Otherwise return nullptr. |
33 | //===--------------------------------------------------------------------===// |
34 | |
35 | virtual Value *FoldBinOp(Instruction::BinaryOps Opc, Value *LHS, |
36 | Value *RHS) const = 0; |
37 | |
38 | virtual Value *FoldExactBinOp(Instruction::BinaryOps Opc, Value *LHS, |
39 | Value *RHS, bool IsExact) const = 0; |
40 | |
41 | virtual Value *FoldNoWrapBinOp(Instruction::BinaryOps Opc, Value *LHS, |
42 | Value *RHS, bool HasNUW, |
43 | bool HasNSW) const = 0; |
44 | |
45 | virtual Value *FoldBinOpFMF(Instruction::BinaryOps Opc, Value *LHS, |
46 | Value *RHS, FastMathFlags FMF) const = 0; |
47 | |
48 | virtual Value *FoldUnOpFMF(Instruction::UnaryOps Opc, Value *V, |
49 | FastMathFlags FMF) const = 0; |
50 | |
51 | virtual Value *FoldICmp(CmpInst::Predicate P, Value *LHS, |
52 | Value *RHS) const = 0; |
53 | |
54 | virtual Value *FoldGEP(Type *Ty, Value *Ptr, ArrayRef<Value *> IdxList, |
55 | bool IsInBounds = false) const = 0; |
56 | |
57 | virtual Value *FoldSelect(Value *C, Value *True, Value *False) const = 0; |
58 | |
59 | virtual Value *(Value *Agg, |
60 | ArrayRef<unsigned> IdxList) const = 0; |
61 | |
62 | virtual Value *FoldInsertValue(Value *Agg, Value *Val, |
63 | ArrayRef<unsigned> IdxList) const = 0; |
64 | |
65 | virtual Value *(Value *Vec, Value *Idx) const = 0; |
66 | |
67 | virtual Value *FoldInsertElement(Value *Vec, Value *NewElt, |
68 | Value *Idx) const = 0; |
69 | |
70 | virtual Value *FoldShuffleVector(Value *V1, Value *V2, |
71 | ArrayRef<int> Mask) const = 0; |
72 | |
73 | virtual Value *FoldCast(Instruction::CastOps Op, Value *V, |
74 | Type *DestTy) const = 0; |
75 | |
76 | //===--------------------------------------------------------------------===// |
77 | // Cast/Conversion Operators |
78 | //===--------------------------------------------------------------------===// |
79 | |
80 | virtual Value *CreatePointerCast(Constant *C, Type *DestTy) const = 0; |
81 | virtual Value *CreatePointerBitCastOrAddrSpaceCast(Constant *C, |
82 | Type *DestTy) const = 0; |
83 | |
84 | //===--------------------------------------------------------------------===// |
85 | // Compare Instructions |
86 | //===--------------------------------------------------------------------===// |
87 | |
88 | virtual Value *CreateFCmp(CmpInst::Predicate P, Constant *LHS, |
89 | Constant *RHS) const = 0; |
90 | }; |
91 | |
92 | } // end namespace llvm |
93 | |
94 | #endif // LLVM_IR_IRBUILDERFOLDER_H |
95 | |