File: GIMatchDagEdge.h

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (70 lines) | stat: -rw-r--r-- 2,500 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//===- GIMatchDagEdge.h - Represent a shared operand list for nodes -------===//
//
// 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_UTILS_TABLEGEN_GIMATCHDAGEDGE_H
#define LLVM_UTILS_TABLEGEN_GIMATCHDAGEDGE_H

#include "llvm/ADT/StringRef.h"

namespace llvm {
class raw_ostream;
class GIMatchDagInstr;
class GIMatchDagOperand;

/// Represents an edge that connects two instructions together via a pair of
/// operands. For example:
///     %a = FOO ...
///     %0 = BAR %a
///     %1 = BAZ %a
/// would have two edges for %a like so:
///     BAR:Op#1 --[a]----> Op#0:FOO
///                         ^
///     BAZ:Op#1 --[a]------/
/// Ideally, all edges in the DAG are from a use to a def as this is a many
/// to one edge but edges from defs to uses are supported too.
class GIMatchDagEdge {
  /// The name of the edge. For example,
  ///     (FOO $a, $b, $c)
  ///     (BAR $d, $e, $a)
  /// will create an edge named 'a' to connect FOO to BAR. Although the name
  /// refers to the edge, the canonical value of 'a' is the operand that defines
  /// it.
  StringRef Name;
  const GIMatchDagInstr *FromMI;
  const GIMatchDagOperand *FromMO;
  const GIMatchDagInstr *ToMI;
  const GIMatchDagOperand *ToMO;

public:
  GIMatchDagEdge(StringRef Name, const GIMatchDagInstr *FromMI, const GIMatchDagOperand *FromMO,
            const GIMatchDagInstr *ToMI, const GIMatchDagOperand *ToMO)
      : Name(Name), FromMI(FromMI), FromMO(FromMO), ToMI(ToMI), ToMO(ToMO) {}

  StringRef getName() const { return Name; }
  const GIMatchDagInstr *getFromMI() const { return FromMI; }
  const GIMatchDagOperand *getFromMO() const { return FromMO; }
  const GIMatchDagInstr *getToMI() const { return ToMI; }
  const GIMatchDagOperand *getToMO() const { return ToMO; }

  /// Flip the direction of the edge.
  void reverse();

  /// Does this edge run from a def to (one of many) uses?
  bool isDefToUse() const;

  LLVM_DUMP_METHOD void print(raw_ostream &OS) const;

#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
  LLVM_DUMP_METHOD void dump() const;
#endif // if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
};

raw_ostream &operator<<(raw_ostream &OS, const GIMatchDagEdge &E);

} // end namespace llvm
#endif // ifndef LLVM_UTILS_TABLEGEN_GIMATCHDAGEDGE_H