diff options
Diffstat (limited to 'clang-r353983/include/llvm/CodeGen/SelectionDAGAddressAnalysis.h')
| -rw-r--r-- | clang-r353983/include/llvm/CodeGen/SelectionDAGAddressAnalysis.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/clang-r353983/include/llvm/CodeGen/SelectionDAGAddressAnalysis.h b/clang-r353983/include/llvm/CodeGen/SelectionDAGAddressAnalysis.h new file mode 100644 index 00000000..f168b846 --- /dev/null +++ b/clang-r353983/include/llvm/CodeGen/SelectionDAGAddressAnalysis.h @@ -0,0 +1,69 @@ +//===- SelectionDAGAddressAnalysis.h - DAG Address Analysis -----*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H +#define LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H + +#include "llvm/CodeGen/SelectionDAGNodes.h" +#include <cstdint> + +namespace llvm { + +class SelectionDAG; + +/// Helper struct to parse and store a memory address as base + index + offset. +/// We ignore sign extensions when it is safe to do so. +/// The following two expressions are not equivalent. To differentiate we need +/// to store whether there was a sign extension involved in the index +/// computation. +/// (load (i64 add (i64 copyfromreg %c) +/// (i64 signextend (add (i8 load %index) +/// (i8 1)))) +/// vs +/// +/// (load (i64 add (i64 copyfromreg %c) +/// (i64 signextend (i32 add (i32 signextend (i8 load %index)) +/// (i32 1))))) +class BaseIndexOffset { +private: + SDValue Base; + SDValue Index; + int64_t Offset = 0; + bool IsIndexSignExt = false; + +public: + BaseIndexOffset() = default; + BaseIndexOffset(SDValue Base, SDValue Index, int64_t Offset, + bool IsIndexSignExt) + : Base(Base), Index(Index), Offset(Offset), + IsIndexSignExt(IsIndexSignExt) {} + + SDValue getBase() { return Base; } + SDValue getBase() const { return Base; } + SDValue getIndex() { return Index; } + SDValue getIndex() const { return Index; } + + bool equalBaseIndex(const BaseIndexOffset &Other, + const SelectionDAG &DAG) const { + int64_t Off; + return equalBaseIndex(Other, DAG, Off); + } + + bool equalBaseIndex(const BaseIndexOffset &Other, const SelectionDAG &DAG, + int64_t &Off) const; + + /// Parses tree in Ptr for base, index, offset addresses. + static BaseIndexOffset match(const LSBaseSDNode *N, const SelectionDAG &DAG); + + void print(raw_ostream& OS) const; + void dump() const; +}; + +} // end namespace llvm + +#endif // LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H |
