1 //===-- ConstantFolding.h - Fold instructions into constants ----*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares routines for folding instructions into constants when all
10 // operands are constants, for example "sub i32 1, 0" -> "1".
12 // Also, to supplement the basic VMCore ConstantExpr simplifications,
13 // this file declares some additional folding routines that can make use of
14 // DataLayout information. These functions cannot go in VMCore due to library
17 //===----------------------------------------------------------------------===//
19 #ifndef LLVM_ANALYSIS_CONSTANTFOLDING_H
20 #define LLVM_ANALYSIS_CONSTANTFOLDING_H
24 template <typename T
> class ArrayRef
;
33 class TargetLibraryInfo
;
36 /// If this constant is a constant offset from a global, return the global and
37 /// the constant. Because of constantexprs, this function is recursive.
38 bool IsConstantOffsetFromGlobal(Constant
*C
, GlobalValue
*&GV
, APInt
&Offset
,
39 const DataLayout
&DL
);
41 /// ConstantFoldInstruction - Try to constant fold the specified instruction.
42 /// If successful, the constant result is returned, if not, null is returned.
43 /// Note that this fails if not all of the operands are constant. Otherwise,
44 /// this function can only fail when attempting to fold instructions like loads
45 /// and stores, which have no constant expression form.
46 Constant
*ConstantFoldInstruction(Instruction
*I
, const DataLayout
&DL
,
47 const TargetLibraryInfo
*TLI
= nullptr);
49 /// ConstantFoldConstant - Attempt to fold the constant using the
50 /// specified DataLayout.
51 /// If successful, the constant result is returned, if not, null is returned.
52 Constant
*ConstantFoldConstant(const Constant
*C
, const DataLayout
&DL
,
53 const TargetLibraryInfo
*TLI
= nullptr);
55 /// ConstantFoldInstOperands - Attempt to constant fold an instruction with the
56 /// specified operands. If successful, the constant result is returned, if not,
57 /// null is returned. Note that this function can fail when attempting to
58 /// fold instructions like loads and stores, which have no constant expression
61 Constant
*ConstantFoldInstOperands(Instruction
*I
, ArrayRef
<Constant
*> Ops
,
63 const TargetLibraryInfo
*TLI
= nullptr);
65 /// ConstantFoldCompareInstOperands - Attempt to constant fold a compare
66 /// instruction (icmp/fcmp) with the specified operands. If it fails, it
67 /// returns a constant expression of the specified operands.
70 ConstantFoldCompareInstOperands(unsigned Predicate
, Constant
*LHS
,
71 Constant
*RHS
, const DataLayout
&DL
,
72 const TargetLibraryInfo
*TLI
= nullptr);
74 /// Attempt to constant fold a unary operation with the specified
75 /// operand. If it fails, it returns a constant expression of the specified
77 Constant
*ConstantFoldUnaryOpOperand(unsigned Opcode
, Constant
*Op
,
78 const DataLayout
&DL
);
80 /// Attempt to constant fold a binary operation with the specified
81 /// operands. If it fails, it returns a constant expression of the specified
83 Constant
*ConstantFoldBinaryOpOperands(unsigned Opcode
, Constant
*LHS
,
84 Constant
*RHS
, const DataLayout
&DL
);
86 /// Attempt to constant fold a select instruction with the specified
87 /// operands. The constant result is returned if successful; if not, null is
89 Constant
*ConstantFoldSelectInstruction(Constant
*Cond
, Constant
*V1
,
92 /// Attempt to constant fold a cast with the specified operand. If it
93 /// fails, it returns a constant expression of the specified operand.
94 Constant
*ConstantFoldCastOperand(unsigned Opcode
, Constant
*C
, Type
*DestTy
,
95 const DataLayout
&DL
);
97 /// ConstantFoldInsertValueInstruction - Attempt to constant fold an insertvalue
98 /// instruction with the specified operands and indices. The constant result is
99 /// returned if successful; if not, null is returned.
100 Constant
*ConstantFoldInsertValueInstruction(Constant
*Agg
, Constant
*Val
,
101 ArrayRef
<unsigned> Idxs
);
103 /// Attempt to constant fold an extractvalue instruction with the
104 /// specified operands and indices. The constant result is returned if
105 /// successful; if not, null is returned.
106 Constant
*ConstantFoldExtractValueInstruction(Constant
*Agg
,
107 ArrayRef
<unsigned> Idxs
);
109 /// Attempt to constant fold an insertelement instruction with the
110 /// specified operands and indices. The constant result is returned if
111 /// successful; if not, null is returned.
112 Constant
*ConstantFoldInsertElementInstruction(Constant
*Val
,
116 /// Attempt to constant fold an extractelement instruction with the
117 /// specified operands and indices. The constant result is returned if
118 /// successful; if not, null is returned.
119 Constant
*ConstantFoldExtractElementInstruction(Constant
*Val
, Constant
*Idx
);
121 /// Attempt to constant fold a shufflevector instruction with the
122 /// specified operands and indices. The constant result is returned if
123 /// successful; if not, null is returned.
124 Constant
*ConstantFoldShuffleVectorInstruction(Constant
*V1
, Constant
*V2
,
127 /// ConstantFoldLoadFromConstPtr - Return the value that a load from C would
128 /// produce if it is constant and determinable. If this is not determinable,
130 Constant
*ConstantFoldLoadFromConstPtr(Constant
*C
, Type
*Ty
, const DataLayout
&DL
);
132 /// ConstantFoldLoadThroughGEPConstantExpr - Given a constant and a
133 /// getelementptr constantexpr, return the constant value being addressed by the
134 /// constant expression, or null if something is funny and we can't decide.
135 Constant
*ConstantFoldLoadThroughGEPConstantExpr(Constant
*C
, ConstantExpr
*CE
);
137 /// ConstantFoldLoadThroughGEPIndices - Given a constant and getelementptr
138 /// indices (with an *implied* zero pointer index that is not in the list),
139 /// return the constant value being addressed by a virtual load, or null if
140 /// something is funny and we can't decide.
141 Constant
*ConstantFoldLoadThroughGEPIndices(Constant
*C
,
142 ArrayRef
<Constant
*> Indices
);
144 /// canConstantFoldCallTo - Return true if its even possible to fold a call to
145 /// the specified function.
146 bool canConstantFoldCallTo(const CallBase
*Call
, const Function
*F
);
148 /// ConstantFoldCall - Attempt to constant fold a call to the specified function
149 /// with the specified arguments, returning null if unsuccessful.
150 Constant
*ConstantFoldCall(const CallBase
*Call
, Function
*F
,
151 ArrayRef
<Constant
*> Operands
,
152 const TargetLibraryInfo
*TLI
= nullptr);
154 /// ConstantFoldLoadThroughBitcast - try to cast constant to destination type
155 /// returning null if unsuccessful. Can cast pointer to pointer or pointer to
156 /// integer and vice versa if their sizes are equal.
157 Constant
*ConstantFoldLoadThroughBitcast(Constant
*C
, Type
*DestTy
,
158 const DataLayout
&DL
);
160 /// Check whether the given call has no side-effects.
161 /// Specifically checks for math routimes which sometimes set errno.
162 bool isMathLibCallNoop(const CallBase
*Call
, const TargetLibraryInfo
*TLI
);