Home | History | Annotate | Download | only in CodeGen
      1 //===- 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 
     16 namespace llvm {
     17 
     18 class 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)))))
     33 class BaseIndexOffset {
     34 private:
     35   SDValue Base;
     36   SDValue Index;
     37   int64_t Offset = 0;
     38   bool IsIndexSignExt = false;
     39 
     40 public:
     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(SDValue Ptr, const SelectionDAG &DAG);
     60 };
     61 
     62 } // end namespace llvm
     63 
     64 #endif // LLVM_CODEGEN_SELECTIONDAGADDRESSANALYSIS_H
     65