blob: 580606441a9d0601d0ffad7efd32e456c070dded [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- SelectionDAGAddressAnalysis.h - DAG Address Analysis -----*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H
11#define LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H
12
13#include "llvm/CodeGen/SelectionDAGNodes.h"
14#include <cstdint>
15
16namespace llvm {
17
18class SelectionDAG;
19
20/// Helper struct to parse and store a memory address as base + index + offset.
21/// We ignore sign extensions when it is safe to do so.
22/// The following two expressions are not equivalent. To differentiate we need
23/// to store whether there was a sign extension involved in the index
24/// computation.
25/// (load (i64 add (i64 copyfromreg %c)
26/// (i64 signextend (add (i8 load %index)
27/// (i8 1))))
28/// vs
29///
30/// (load (i64 add (i64 copyfromreg %c)
31/// (i64 signextend (i32 add (i32 signextend (i8 load %index))
32/// (i32 1)))))
33class BaseIndexOffset {
34private:
35 SDValue Base;
36 SDValue Index;
37 int64_t Offset = 0;
38 bool IsIndexSignExt = false;
39
40public:
41 BaseIndexOffset() = default;
42 BaseIndexOffset(SDValue Base, SDValue Index, int64_t Offset,
43 bool IsIndexSignExt)
44 : Base(Base), Index(Index), Offset(Offset),
45 IsIndexSignExt(IsIndexSignExt) {}
46
47 SDValue getBase() { return Base; }
48 SDValue getIndex() { return Index; }
49
50 bool equalBaseIndex(BaseIndexOffset &Other, const SelectionDAG &DAG) {
51 int64_t Off;
52 return equalBaseIndex(Other, DAG, Off);
53 }
54
55 bool equalBaseIndex(BaseIndexOffset &Other, const SelectionDAG &DAG,
56 int64_t &Off);
57
58 /// Parses tree in Ptr for base, index, offset addresses.
59 static BaseIndexOffset match(LSBaseSDNode *N, const SelectionDAG &DAG);
60};
61
62} // end namespace llvm
63
64#endif // LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H