blob: 2385b6f09c4055ca5df6cbc292ef2d0d80d372cc [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===-- ConstantFolding.h - Fold instructions into constants ----*- C++ -*-===//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// 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
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
7//===----------------------------------------------------------------------===//
8//
9// This file declares routines for folding instructions into constants when all
10// operands are constants, for example "sub i32 1, 0" -> "1".
11//
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
15// dependency issues.
16//
17//===----------------------------------------------------------------------===//
18
19#ifndef LLVM_ANALYSIS_CONSTANTFOLDING_H
20#define LLVM_ANALYSIS_CONSTANTFOLDING_H
21
22namespace llvm {
23class APInt;
24template <typename T> class ArrayRef;
Andrew Walbran16937d02019-10-22 13:54:20 +010025class CallBase;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010026class Constant;
27class ConstantExpr;
28class ConstantVector;
29class DataLayout;
30class Function;
31class GlobalValue;
32class Instruction;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010033class TargetLibraryInfo;
34class Type;
35
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.
38bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset,
39 const DataLayout &DL);
40
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.
46Constant *ConstantFoldInstruction(Instruction *I, const DataLayout &DL,
47 const TargetLibraryInfo *TLI = nullptr);
48
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.
52Constant *ConstantFoldConstant(const Constant *C, const DataLayout &DL,
53 const TargetLibraryInfo *TLI = nullptr);
54
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
59/// form.
60///
61Constant *ConstantFoldInstOperands(Instruction *I, ArrayRef<Constant *> Ops,
62 const DataLayout &DL,
63 const TargetLibraryInfo *TLI = nullptr);
64
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.
68///
69Constant *
70ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS,
71 Constant *RHS, const DataLayout &DL,
72 const TargetLibraryInfo *TLI = nullptr);
73
Andrew Walbran3d2c1972020-04-07 12:24:26 +010074/// Attempt to constant fold a unary operation with the specified
75/// operand. If it fails, it returns a constant expression of the specified
76/// operands.
77Constant *ConstantFoldUnaryOpOperand(unsigned Opcode, Constant *Op,
78 const DataLayout &DL);
79
Andrew Scullcdfcccc2018-10-05 20:58:37 +010080/// Attempt to constant fold a binary operation with the specified
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010081/// operands. If it fails, it returns a constant expression of the specified
82/// operands.
83Constant *ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS,
84 Constant *RHS, const DataLayout &DL);
85
Andrew Scullcdfcccc2018-10-05 20:58:37 +010086/// Attempt to constant fold a select instruction with the specified
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010087/// operands. The constant result is returned if successful; if not, null is
88/// returned.
89Constant *ConstantFoldSelectInstruction(Constant *Cond, Constant *V1,
90 Constant *V2);
91
Andrew Scullcdfcccc2018-10-05 20:58:37 +010092/// Attempt to constant fold a cast with the specified operand. If it
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010093/// fails, it returns a constant expression of the specified operand.
94Constant *ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy,
95 const DataLayout &DL);
96
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.
100Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val,
101 ArrayRef<unsigned> Idxs);
102
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100103/// Attempt to constant fold an extractvalue instruction with the
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100104/// specified operands and indices. The constant result is returned if
105/// successful; if not, null is returned.
106Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
107 ArrayRef<unsigned> Idxs);
108
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100109/// Attempt to constant fold an insertelement instruction with the
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100110/// specified operands and indices. The constant result is returned if
111/// successful; if not, null is returned.
112Constant *ConstantFoldInsertElementInstruction(Constant *Val,
113 Constant *Elt,
114 Constant *Idx);
115
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100116/// Attempt to constant fold an extractelement instruction with the
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100117/// specified operands and indices. The constant result is returned if
118/// successful; if not, null is returned.
119Constant *ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx);
120
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100121/// Attempt to constant fold a shufflevector instruction with the
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100122/// specified operands and indices. The constant result is returned if
123/// successful; if not, null is returned.
124Constant *ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2,
125 Constant *Mask);
126
127/// ConstantFoldLoadFromConstPtr - Return the value that a load from C would
128/// produce if it is constant and determinable. If this is not determinable,
129/// return null.
130Constant *ConstantFoldLoadFromConstPtr(Constant *C, Type *Ty, const DataLayout &DL);
131
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.
135Constant *ConstantFoldLoadThroughGEPConstantExpr(Constant *C, ConstantExpr *CE);
136
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.
141Constant *ConstantFoldLoadThroughGEPIndices(Constant *C,
142 ArrayRef<Constant *> Indices);
143
144/// canConstantFoldCallTo - Return true if its even possible to fold a call to
145/// the specified function.
Andrew Walbran16937d02019-10-22 13:54:20 +0100146bool canConstantFoldCallTo(const CallBase *Call, const Function *F);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100147
148/// ConstantFoldCall - Attempt to constant fold a call to the specified function
149/// with the specified arguments, returning null if unsuccessful.
Andrew Walbran16937d02019-10-22 13:54:20 +0100150Constant *ConstantFoldCall(const CallBase *Call, Function *F,
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100151 ArrayRef<Constant *> Operands,
152 const TargetLibraryInfo *TLI = nullptr);
153
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.
157Constant *ConstantFoldLoadThroughBitcast(Constant *C, Type *DestTy,
158 const DataLayout &DL);
159
Andrew Scullcdfcccc2018-10-05 20:58:37 +0100160/// Check whether the given call has no side-effects.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100161/// Specifically checks for math routimes which sometimes set errno.
Andrew Walbran16937d02019-10-22 13:54:20 +0100162bool isMathLibCallNoop(const CallBase *Call, const TargetLibraryInfo *TLI);
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100163}
164
165#endif