1//===- GIMatchDagEdge.h - Represent a shared operand list for nodes -------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_UTILS_TABLEGEN_GIMATCHDAGEDGE_H
10#define LLVM_UTILS_TABLEGEN_GIMATCHDAGEDGE_H
11
12#include "llvm/ADT/StringRef.h"
13
14namespace llvm {
15class raw_ostream;
16class GIMatchDagInstr;
17class GIMatchDagOperand;
18
19/// Represents an edge that connects two instructions together via a pair of
20/// operands. For example:
21///     %a = FOO ...
22///     %0 = BAR %a
23///     %1 = BAZ %a
24/// would have two edges for %a like so:
25///     BAR:Op#1 --[a]----> Op#0:FOO
26///                         ^
27///     BAZ:Op#1 --[a]------/
28/// Ideally, all edges in the DAG are from a use to a def as this is a many
29/// to one edge but edges from defs to uses are supported too.
30class GIMatchDagEdge {
31  /// The name of the edge. For example,
32  ///     (FOO $a, $b, $c)
33  ///     (BAR $d, $e, $a)
34  /// will create an edge named 'a' to connect FOO to BAR. Although the name
35  /// refers to the edge, the canonical value of 'a' is the operand that defines
36  /// it.
37  StringRef Name;
38  const GIMatchDagInstr *FromMI;
39  const GIMatchDagOperand *FromMO;
40  const GIMatchDagInstr *ToMI;
41  const GIMatchDagOperand *ToMO;
42
43public:
44  GIMatchDagEdge(StringRef Name, const GIMatchDagInstr *FromMI, const GIMatchDagOperand *FromMO,
45            const GIMatchDagInstr *ToMI, const GIMatchDagOperand *ToMO)
46      : Name(Name), FromMI(FromMI), FromMO(FromMO), ToMI(ToMI), ToMO(ToMO) {}
47
48  StringRef getName() const { return Name; }
49  const GIMatchDagInstr *getFromMI() const { return FromMI; }
50  const GIMatchDagOperand *getFromMO() const { return FromMO; }
51  const GIMatchDagInstr *getToMI() const { return ToMI; }
52  const GIMatchDagOperand *getToMO() const { return ToMO; }
53
54  /// Flip the direction of the edge.
55  void reverse();
56
57  /// Does this edge run from a def to (one of many) uses?
58  bool isDefToUse() const;
59
60  LLVM_DUMP_METHOD void print(raw_ostream &OS) const;
61
62#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
63  LLVM_DUMP_METHOD void dump() const;
64#endif // if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
65};
66
67raw_ostream &operator<<(raw_ostream &OS, const GIMatchDagEdge &E);
68
69} // end namespace llvm
70#endif // ifndef LLVM_UTILS_TABLEGEN_GIMATCHDAGEDGE_H
71