[llvm] [SandboxIR] sandboxir::Use operands (part 1) and uses (part 2) (PR #98251)
Arthur Eubanks via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 9 18:33:51 PDT 2024
================
@@ -7,19 +7,117 @@
//===----------------------------------------------------------------------===//
#include "llvm/SandboxIR/SandboxIR.h"
+#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/IR/Constants.h"
#include "llvm/Support/Debug.h"
#include <sstream>
using namespace llvm::sandboxir;
+Value *Use::get() const { return Ctx->getValue(LLVMUse->get()); }
+
+unsigned Use::getOperandNo() const { return User->getUseOperandNo(*this); }
+
+#ifndef NDEBUG
+void Use::dump(raw_ostream &OS) const {
+ Value *Def = nullptr;
+ if (LLVMUse == nullptr)
+ OS << "<null> LLVM Use! ";
+ else
+ Def = Ctx->getValue(LLVMUse->get());
+ OS << "Def: ";
+ if (Def == nullptr)
+ OS << "NULL";
+ else
+ OS << *Def;
+ OS << "\n";
+
+ OS << "User: ";
+ if (User == nullptr)
+ OS << "NULL";
+ else
+ OS << *User;
+ OS << "\n";
+
+ OS << "OperandNo: ";
+ if (User == nullptr)
+ OS << "N/A";
+ else
+ OS << getOperandNo();
+ OS << "\n";
+}
+
+void Use::dump() const { dump(dbgs()); }
+#endif // NDEBUG
+
+Use OperandUseIterator::operator*() const { return Use; }
+
+OperandUseIterator &OperandUseIterator::operator++() {
+ assert(Use.LLVMUse != nullptr && "Already at end!");
+ User *User = Use.getUser();
+ Use = User->getOperandUseInternal(Use.getOperandNo() + 1, /*Verify=*/false);
+ return *this;
+}
+
+UserUseIterator &UserUseIterator::operator++() {
+ llvm::Use *&LLVMUse = Use.LLVMUse;
+ assert(LLVMUse != nullptr && "Already at end!");
+ LLVMUse = LLVMUse->getNext();
+ if (LLVMUse == nullptr) {
+ Use.User = nullptr;
+ return *this;
+ }
+ auto *Ctx = Use.Ctx;
+ auto *LLVMUser = LLVMUse->getUser();
+ Use.User = cast_or_null<sandboxir::User>(Ctx->getValue(LLVMUser));
+ return *this;
+}
+
Value::Value(ClassID SubclassID, llvm::Value *Val, Context &Ctx)
: SubclassID(SubclassID), Val(Val), Ctx(Ctx) {
#ifndef NDEBUG
UID = Ctx.getNumValues();
#endif
}
+Value::use_iterator Value::use_begin() {
+ llvm::Use *LLVMUse = nullptr;
+ if (Val->use_begin() != Val->use_end())
+ LLVMUse = &*Val->use_begin();
+ User *User = LLVMUse != nullptr ? cast_or_null<sandboxir::User>(Ctx.getValue(
+ Val->use_begin()->getUser()))
+ : nullptr;
+ return use_iterator(Use(LLVMUse, User, Ctx));
+}
+
+Value::user_iterator Value::user_begin() {
+ auto UseBegin = Val->use_begin();
+ auto UseEnd = Val->use_end();
+ bool AtEnd = UseBegin == UseEnd;
+ llvm::Use *LLVMUse = AtEnd ? nullptr : &*UseBegin;
+ User *User =
+ AtEnd ? nullptr
+ : cast_or_null<sandboxir::User>(Ctx.getValue(&*LLVMUse->getUser()));
+ return user_iterator(Use(LLVMUse, User, Ctx), UseToUser());
+}
+
+unsigned Value::getNumUsers() const {
+ // Look for unique users.
+ SmallPtrSet<Value *, 4> UserNs;
+ for (llvm::User *U : Val->users())
+ UserNs.insert(getContext().getValue(U));
+ return UserNs.size();
+}
+
+unsigned Value::getNumUses() const {
+ unsigned Cnt = 0;
+ for (llvm::User *U : Val->users()) {
----------------
aeubanks wrote:
`return range_size(Val->users());`
https://github.com/llvm/llvm-project/pull/98251
More information about the llvm-commits
mailing list