================
@@ -751,11 +517,44 @@ static void processBranchOp(BranchOpInterface branchOp,
RunLivenessAnalysis &la,
}
}
+/// Create ub.poison ops for the given values. If a value has no uses, return
+/// an "empty" value.
+static SmallVector<Value> createPoisonedValues(OpBuilder &b,
+ ValueRange values) {
+ return llvm::map_to_vector(values, [&](Value value) {
+ if (value.use_empty())
+ return Value();
+ return ub::PoisonOp::create(b, value.getLoc(),
value.getType()).getResult();
+ });
+}
+
+namespace {
+/// A listener that keeps track of ub.poison ops.
+struct TrackingListener : public RewriterBase::Listener {
+ void notifyOperationErased(Operation *op) override {
+ if (auto poisonOp = dyn_cast<ub::PoisonOp>(op))
+ poisonOps.erase(poisonOp);
+ }
+ void notifyOperationInserted(Operation *op,
+ OpBuilder::InsertPoint previous) override {
+ if (auto poisonOp = dyn_cast<ub::PoisonOp>(op))
+ poisonOps.insert(poisonOp);
+ }
+ DenseSet<ub::PoisonOp> poisonOps;
----------------
matthias-springer wrote:
I would keep this one as a regular `DenseSet`. It is expected to be larger than
the other `DenseSet` above because it tracks `ub.poison` ops across the entire
pass application.
https://github.com/llvm/llvm-project/pull/173505
_______________________________________________
llvm-branch-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits