Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- NoFolder.h - Constant folding helper ---------------------*- 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 the NoFolder class, a helper for IRBuilder. It provides |
||
10 | // IRBuilder with a set of methods for creating unfolded constants. This is |
||
11 | // useful for learners trying to understand how LLVM IR works, and who don't |
||
12 | // want details to be hidden by the constant folder. For general constant |
||
13 | // creation and folding, use ConstantExpr and the routines in |
||
14 | // llvm/Analysis/ConstantFolding.h. |
||
15 | // |
||
16 | // Note: since it is not actually possible to create unfolded constants, this |
||
17 | // class returns instructions rather than constants. |
||
18 | // |
||
19 | //===----------------------------------------------------------------------===// |
||
20 | |||
21 | #ifndef LLVM_IR_NOFOLDER_H |
||
22 | #define LLVM_IR_NOFOLDER_H |
||
23 | |||
24 | #include "llvm/ADT/ArrayRef.h" |
||
25 | #include "llvm/IR/Constants.h" |
||
26 | #include "llvm/IR/FMF.h" |
||
27 | #include "llvm/IR/IRBuilderFolder.h" |
||
28 | #include "llvm/IR/InstrTypes.h" |
||
29 | #include "llvm/IR/Instruction.h" |
||
30 | #include "llvm/IR/Instructions.h" |
||
31 | |||
32 | namespace llvm { |
||
33 | |||
34 | /// NoFolder - Create "constants" (actually, instructions) with no folding. |
||
35 | class NoFolder final : public IRBuilderFolder { |
||
36 | virtual void anchor(); |
||
37 | |||
38 | public: |
||
39 | explicit NoFolder() = default; |
||
40 | |||
41 | //===--------------------------------------------------------------------===// |
||
42 | // Value-based folders. |
||
43 | // |
||
44 | // Return an existing value or a constant if the operation can be simplified. |
||
45 | // Otherwise return nullptr. |
||
46 | //===--------------------------------------------------------------------===// |
||
47 | |||
48 | Value *FoldBinOp(Instruction::BinaryOps Opc, Value *LHS, |
||
49 | Value *RHS) const override { |
||
50 | return nullptr; |
||
51 | } |
||
52 | |||
53 | Value *FoldExactBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, |
||
54 | bool IsExact) const override { |
||
55 | return nullptr; |
||
56 | } |
||
57 | |||
58 | Value *FoldNoWrapBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, |
||
59 | bool HasNUW, bool HasNSW) const override { |
||
60 | return nullptr; |
||
61 | } |
||
62 | |||
63 | Value *FoldBinOpFMF(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, |
||
64 | FastMathFlags FMF) const override { |
||
65 | return nullptr; |
||
66 | } |
||
67 | |||
68 | Value *FoldUnOpFMF(Instruction::UnaryOps Opc, Value *V, |
||
69 | FastMathFlags FMF) const override { |
||
70 | return nullptr; |
||
71 | } |
||
72 | |||
73 | Value *FoldICmp(CmpInst::Predicate P, Value *LHS, Value *RHS) const override { |
||
74 | return nullptr; |
||
75 | } |
||
76 | |||
77 | Value *FoldGEP(Type *Ty, Value *Ptr, ArrayRef<Value *> IdxList, |
||
78 | bool IsInBounds = false) const override { |
||
79 | return nullptr; |
||
80 | } |
||
81 | |||
82 | Value *FoldSelect(Value *C, Value *True, Value *False) const override { |
||
83 | return nullptr; |
||
84 | } |
||
85 | |||
86 | Value *FoldExtractValue(Value *Agg, |
||
87 | ArrayRef<unsigned> IdxList) const override { |
||
88 | return nullptr; |
||
89 | } |
||
90 | |||
91 | Value *FoldInsertValue(Value *Agg, Value *Val, |
||
92 | ArrayRef<unsigned> IdxList) const override { |
||
93 | return nullptr; |
||
94 | } |
||
95 | |||
96 | Value *FoldExtractElement(Value *Vec, Value *Idx) const override { |
||
97 | return nullptr; |
||
98 | } |
||
99 | |||
100 | Value *FoldInsertElement(Value *Vec, Value *NewElt, |
||
101 | Value *Idx) const override { |
||
102 | return nullptr; |
||
103 | } |
||
104 | |||
105 | Value *FoldShuffleVector(Value *V1, Value *V2, |
||
106 | ArrayRef<int> Mask) const override { |
||
107 | return nullptr; |
||
108 | } |
||
109 | |||
110 | //===--------------------------------------------------------------------===// |
||
111 | // Cast/Conversion Operators |
||
112 | //===--------------------------------------------------------------------===// |
||
113 | |||
114 | Instruction *CreateCast(Instruction::CastOps Op, Constant *C, |
||
115 | Type *DestTy) const override { |
||
116 | return CastInst::Create(Op, C, DestTy); |
||
117 | } |
||
118 | |||
119 | Instruction *CreatePointerCast(Constant *C, Type *DestTy) const override { |
||
120 | return CastInst::CreatePointerCast(C, DestTy); |
||
121 | } |
||
122 | |||
123 | Instruction *CreatePointerBitCastOrAddrSpaceCast( |
||
124 | Constant *C, Type *DestTy) const override { |
||
125 | return CastInst::CreatePointerBitCastOrAddrSpaceCast(C, DestTy); |
||
126 | } |
||
127 | |||
128 | Instruction *CreateIntCast(Constant *C, Type *DestTy, |
||
129 | bool isSigned) const override { |
||
130 | return CastInst::CreateIntegerCast(C, DestTy, isSigned); |
||
131 | } |
||
132 | |||
133 | Instruction *CreateFPCast(Constant *C, Type *DestTy) const override { |
||
134 | return CastInst::CreateFPCast(C, DestTy); |
||
135 | } |
||
136 | |||
137 | Instruction *CreateBitCast(Constant *C, Type *DestTy) const override { |
||
138 | return CreateCast(Instruction::BitCast, C, DestTy); |
||
139 | } |
||
140 | |||
141 | Instruction *CreateIntToPtr(Constant *C, Type *DestTy) const override { |
||
142 | return CreateCast(Instruction::IntToPtr, C, DestTy); |
||
143 | } |
||
144 | |||
145 | Instruction *CreatePtrToInt(Constant *C, Type *DestTy) const override { |
||
146 | return CreateCast(Instruction::PtrToInt, C, DestTy); |
||
147 | } |
||
148 | |||
149 | Instruction *CreateZExtOrBitCast(Constant *C, Type *DestTy) const override { |
||
150 | return CastInst::CreateZExtOrBitCast(C, DestTy); |
||
151 | } |
||
152 | |||
153 | Instruction *CreateSExtOrBitCast(Constant *C, Type *DestTy) const override { |
||
154 | return CastInst::CreateSExtOrBitCast(C, DestTy); |
||
155 | } |
||
156 | |||
157 | Instruction *CreateTruncOrBitCast(Constant *C, Type *DestTy) const override { |
||
158 | return CastInst::CreateTruncOrBitCast(C, DestTy); |
||
159 | } |
||
160 | |||
161 | //===--------------------------------------------------------------------===// |
||
162 | // Compare Instructions |
||
163 | //===--------------------------------------------------------------------===// |
||
164 | |||
165 | Instruction *CreateFCmp(CmpInst::Predicate P, |
||
166 | Constant *LHS, Constant *RHS) const override { |
||
167 | return new FCmpInst(P, LHS, RHS); |
||
168 | } |
||
169 | }; |
||
170 | |||
171 | } // end namespace llvm |
||
172 | |||
173 | #endif // LLVM_IR_NOFOLDER_H |