[llvm] [SandboxIR] Add more Instruction member functions (PR #98588)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 12 10:49:34 PDT 2024
================
@@ -262,6 +262,113 @@ const char *Instruction::getOpcodeName(Opcode Opc) {
llvm_unreachable("Unknown Opcode");
}
+llvm::Instruction *Instruction::getTopmostLLVMInstruction() const {
+ Instruction *Prev = getPrevNode();
+ if (Prev == nullptr) {
+ // If at top of the BB, return the first BB instruction.
+ return &*cast<llvm::BasicBlock>(getParent()->Val)->begin();
+ }
+ // Else get the Previous sandbox IR instruction's bottom IR instruction and
+ // return its successor.
+ llvm::Instruction *PrevBotI = cast<llvm::Instruction>(Prev->Val);
+ return PrevBotI->getNextNode();
+}
+
+BBIterator Instruction::getIterator() const {
+ auto *I = cast<llvm::Instruction>(Val);
+ return BasicBlock::iterator(I->getParent(), I->getIterator(), &Ctx);
+}
+
+Instruction *Instruction::getNextNode() const {
+ assert(getParent() != nullptr && "Detached!");
+ assert(getIterator() != getParent()->end() && "Already at end!");
+ auto *LLVMI = cast<llvm::Instruction>(Val);
+ assert(LLVMI->getParent() != nullptr && "LLVM IR instr is detached!");
+ auto *NextLLVMI = LLVMI->getNextNode();
+ auto *NextI = cast_or_null<Instruction>(Ctx.getValue(NextLLVMI));
+ if (NextI == nullptr)
+ return nullptr;
+ return NextI;
+}
+
+Instruction *Instruction::getPrevNode() const {
+ assert(getParent() != nullptr && "Detached!");
+ auto It = getIterator();
+ if (It != getParent()->begin())
+ return std::prev(getIterator()).get();
+ return nullptr;
+}
+
+void Instruction::removeFromParent() {
+ // Detach all the LLVM IR instructions from their parent BB.
+ for (llvm::Instruction *I : getLLVMInstrs())
+ I->removeFromParent();
+}
+
+void Instruction::eraseFromParent() {
+ assert(users().empty() && "Still connected to users, can't erase!");
----------------
vporpo wrote:
Did you mean `hasNUses(0)` ? Why would that be faster? `users().empty()` should be equivalent to `user_begin() == user_end()`, which avoids the loop in `hasNUses(0). Wdyt?
https://github.com/llvm/llvm-project/pull/98588
More information about the llvm-commits
mailing list