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 *FoldExtractValue(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 *FoldExtractElement(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