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
21namespace llvm {
22
23/// IRBuilderFolder - Interface for constant folding in IRBuilder.
24class IRBuilderFolder {
25public:
26 virtual ~IRBuilderFolder();
27
28 //===--------------------------------------------------------------------===//
29 // Binary Operators
30 //===--------------------------------------------------------------------===//
31
32 virtual Value *CreateAdd(Constant *LHS, Constant *RHS,
33 bool HasNUW = false, bool HasNSW = false) const = 0;
34 virtual Value *CreateFAdd(Constant *LHS, Constant *RHS) const = 0;
35 virtual Value *CreateSub(Constant *LHS, Constant *RHS,
36 bool HasNUW = false, bool HasNSW = false) const = 0;
37 virtual Value *CreateFSub(Constant *LHS, Constant *RHS) const = 0;
38 virtual Value *CreateMul(Constant *LHS, Constant *RHS,
39 bool HasNUW = false, bool HasNSW = false) const = 0;
40 virtual Value *CreateFMul(Constant *LHS, Constant *RHS) const = 0;
41 virtual Value *CreateUDiv(Constant *LHS, Constant *RHS,
42 bool isExact = false) const = 0;
43 virtual Value *CreateSDiv(Constant *LHS, Constant *RHS,
44 bool isExact = false) const = 0;
45 virtual Value *CreateFDiv(Constant *LHS, Constant *RHS) const = 0;
46 virtual Value *CreateURem(Constant *LHS, Constant *RHS) const = 0;
47 virtual Value *CreateSRem(Constant *LHS, Constant *RHS) const = 0;
48 virtual Value *CreateFRem(Constant *LHS, Constant *RHS) const = 0;
49 virtual Value *CreateShl(Constant *LHS, Constant *RHS,
50 bool HasNUW = false, bool HasNSW = false) const = 0;
51 virtual Value *CreateLShr(Constant *LHS, Constant *RHS,
52 bool isExact = false) const = 0;
53 virtual Value *CreateAShr(Constant *LHS, Constant *RHS,
54 bool isExact = false) const = 0;
55 virtual Value *CreateAnd(Constant *LHS, Constant *RHS) const = 0;
56 virtual Value *CreateOr(Constant *LHS, Constant *RHS) const = 0;
57 virtual Value *CreateXor(Constant *LHS, Constant *RHS) const = 0;
58 virtual Value *CreateBinOp(Instruction::BinaryOps Opc,
59 Constant *LHS, Constant *RHS) const = 0;
60
61 //===--------------------------------------------------------------------===//
62 // Unary Operators
63 //===--------------------------------------------------------------------===//
64
65 virtual Value *CreateNeg(Constant *C,
66 bool HasNUW = false, bool HasNSW = false) const = 0;
67 virtual Value *CreateFNeg(Constant *C) const = 0;
68 virtual Value *CreateNot(Constant *C) const = 0;
69 virtual Value *CreateUnOp(Instruction::UnaryOps Opc, Constant *C) const = 0;
70
71 //===--------------------------------------------------------------------===//
72 // Memory Instructions
73 //===--------------------------------------------------------------------===//
74
75 virtual Value *CreateGetElementPtr(Type *Ty, Constant *C,
76 ArrayRef<Constant *> IdxList) const = 0;
77 // This form of the function only exists to avoid ambiguous overload
78 // warnings about whether to convert Idx to ArrayRef<Constant *> or
79 // ArrayRef<Value *>.
80 virtual Value *CreateGetElementPtr(Type *Ty, Constant *C,
81 Constant *Idx) const = 0;
82 virtual Value *CreateGetElementPtr(Type *Ty, Constant *C,
83 ArrayRef<Value *> IdxList) const = 0;
84 virtual Value *CreateInBoundsGetElementPtr(
85 Type *Ty, Constant *C, ArrayRef<Constant *> IdxList) const = 0;
86 // This form of the function only exists to avoid ambiguous overload
87 // warnings about whether to convert Idx to ArrayRef<Constant *> or
88 // ArrayRef<Value *>.
89 virtual Value *CreateInBoundsGetElementPtr(Type *Ty, Constant *C,
90 Constant *Idx) const = 0;
91 virtual Value *CreateInBoundsGetElementPtr(
92 Type *Ty, Constant *C, ArrayRef<Value *> IdxList) const = 0;
93
94 //===--------------------------------------------------------------------===//
95 // Cast/Conversion Operators
96 //===--------------------------------------------------------------------===//
97
98 virtual Value *CreateCast(Instruction::CastOps Op, Constant *C,
99 Type *DestTy) const = 0;
100 virtual Value *CreatePointerCast(Constant *C, Type *DestTy) const = 0;
101 virtual Value *CreatePointerBitCastOrAddrSpaceCast(Constant *C,
102 Type *DestTy) const = 0;
103 virtual Value *CreateIntCast(Constant *C, Type *DestTy,
104 bool isSigned) const = 0;
105 virtual Value *CreateFPCast(Constant *C, Type *DestTy) const = 0;
106 virtual Value *CreateBitCast(Constant *C, Type *DestTy) const = 0;
107 virtual Value *CreateIntToPtr(Constant *C, Type *DestTy) const = 0;
108 virtual Value *CreatePtrToInt(Constant *C, Type *DestTy) const = 0;
109 virtual Value *CreateZExtOrBitCast(Constant *C, Type *DestTy) const = 0;
110 virtual Value *CreateSExtOrBitCast(Constant *C, Type *DestTy) const = 0;
111 virtual Value *CreateTruncOrBitCast(Constant *C, Type *DestTy) const = 0;
112
113 //===--------------------------------------------------------------------===//
114 // Compare Instructions
115 //===--------------------------------------------------------------------===//
116
117 virtual Value *CreateICmp(CmpInst::Predicate P, Constant *LHS,
118 Constant *RHS) const = 0;
119 virtual Value *CreateFCmp(CmpInst::Predicate P, Constant *LHS,
120 Constant *RHS) const = 0;
121
122 //===--------------------------------------------------------------------===//
123 // Other Instructions
124 //===--------------------------------------------------------------------===//
125
126 virtual Value *CreateSelect(Constant *C, Constant *True,
127 Constant *False) const = 0;
128 virtual Value *CreateExtractElement(Constant *Vec, Constant *Idx) const = 0;
129 virtual Value *CreateInsertElement(Constant *Vec, Constant *NewElt,
130 Constant *Idx) const = 0;
131 virtual Value *CreateShuffleVector(Constant *V1, Constant *V2,
132 ArrayRef<int> Mask) const = 0;
133 virtual Value *CreateExtractValue(Constant *Agg,
134 ArrayRef<unsigned> IdxList) const = 0;
135 virtual Value *CreateInsertValue(Constant *Agg, Constant *Val,
136 ArrayRef<unsigned> IdxList) const = 0;
137};
138
139} // end namespace llvm
140
141#endif // LLVM_IR_IRBUILDERFOLDER_H
142