mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
fbb7ea5270
If the inrange keyword is present before any index, loading from or storing to any pointer derived from the getelementptr has undefined behavior if the load or store would access memory outside of the bounds of the element selected by the index marked as inrange. This can be used, e.g. for alias analysis or to split globals at element boundaries where beneficial. As previously proposed on llvm-dev: http://lists.llvm.org/pipermail/llvm-dev/2016-July/102472.html Differential Revision: https://reviews.llvm.org/D22793 llvm-svn: 286514
57 lines
2.4 KiB
C++
57 lines
2.4 KiB
C++
//===-- ConstantFolding.h - Internal Constant Folding Interface -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines the (internal) constant folding interfaces for LLVM. These
|
|
// interfaces are used by the ConstantExpr::get* methods to automatically fold
|
|
// constants when possible.
|
|
//
|
|
// These operators may return a null object if they don't know how to perform
|
|
// the specified operation on the specified constant types.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_IR_CONSTANTFOLD_H
|
|
#define LLVM_LIB_IR_CONSTANTFOLD_H
|
|
|
|
#include "llvm/ADT/Optional.h"
|
|
|
|
namespace llvm {
|
|
template <typename T> class ArrayRef;
|
|
class Value;
|
|
class Constant;
|
|
class Type;
|
|
|
|
// Constant fold various types of instruction...
|
|
Constant *ConstantFoldCastInstruction(
|
|
unsigned opcode, ///< The opcode of the cast
|
|
Constant *V, ///< The source constant
|
|
Type *DestTy ///< The destination type
|
|
);
|
|
Constant *ConstantFoldSelectInstruction(Constant *Cond,
|
|
Constant *V1, Constant *V2);
|
|
Constant *ConstantFoldExtractElementInstruction(Constant *Val, Constant *Idx);
|
|
Constant *ConstantFoldInsertElementInstruction(Constant *Val, Constant *Elt,
|
|
Constant *Idx);
|
|
Constant *ConstantFoldShuffleVectorInstruction(Constant *V1, Constant *V2,
|
|
Constant *Mask);
|
|
Constant *ConstantFoldExtractValueInstruction(Constant *Agg,
|
|
ArrayRef<unsigned> Idxs);
|
|
Constant *ConstantFoldInsertValueInstruction(Constant *Agg, Constant *Val,
|
|
ArrayRef<unsigned> Idxs);
|
|
Constant *ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1,
|
|
Constant *V2);
|
|
Constant *ConstantFoldCompareInstruction(unsigned short predicate,
|
|
Constant *C1, Constant *C2);
|
|
Constant *ConstantFoldGetElementPtr(Type *Ty, Constant *C, bool InBounds,
|
|
Optional<unsigned> InRangeIndex,
|
|
ArrayRef<Value *> Idxs);
|
|
} // End llvm namespace
|
|
|
|
#endif
|