[llvm] [SandboxIR] sandboxir::Use operands (part 1) and uses (part 2) (PR #98251)

via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 10 14:07:16 PDT 2024


================
@@ -71,6 +71,98 @@ namespace sandboxir {
 class Function;
 class Context;
 class Instruction;
+class User;
+class Value;
+
+/// Represents a Def-use/Use-def edge in SandboxIR.
+/// NOTE: Unlike llvm::Use, this is not an integral part of the use-def chains.
+/// It is also not uniqued and is currently passed by value, so you can have
+/// more than one sandboxir::Use objects for the same use-def edge.
+class Use {
+  llvm::Use *LLVMUse;
+  User *User;
+  Context *Ctx;
+
+  /// Don't allow the user to create a sandboxir::Use directly.
+  Use(llvm::Use *LLVMUse, class User *User, Context &Ctx)
+      : LLVMUse(LLVMUse), User(User), Ctx(&Ctx) {}
+  Use() : LLVMUse(nullptr), Ctx(nullptr) {}
+
+  friend class Value;              // For constructor
+  friend class User;               // For constructor
+  friend class OperandUseIterator; // For constructor
+  friend class UserUseIterator;    // For accessing members
+
+public:
+  operator Value *() const { return get(); }
----------------
vporpo wrote:

I did this because this is how it's done in LLVM IR's `Use` class. This is used for example by `getOperand(Idx)` which internally finds the Use at `Idx` and casts it to `Value *` to return it.
Not sure how often this is used in practice by passes, so I don't feel strongly about keeping it. Wdyt?

https://github.com/llvm/llvm-project/pull/98251


More information about the llvm-commits mailing list