================
@@ -32,6 +33,68 @@ namespace mlir {
 
 namespace {
 
+/// Find the `cir.store` operation that stores to the given alloca and 
dominates
+/// the given load operation. Dominance calculation is done through the given
+/// DominanceInfo object.
+///
+/// Return nullptr if no such store operation exists. If multiple store
+/// operations satisfy the criteria, any of them may be returned.
+cir::StoreOp findDominatingInitOp(cir::AllocaOp alloca, cir::LoadOp load,
+                                  const DominanceInfo &domInfo) {
+  // Walk through all uses of the alloca and visit the store operations that
+  // store to the alloca
+  for (const mlir::OpOperand &use : alloca->getUses()) {
+    auto store = mlir::dyn_cast<cir::StoreOp>(use.getOwner());
+    if (!store)
+      continue;
+
+    // `cir.store` has two operands, we're only interested if the store is
+    // storing into the alloca, not if the store is storing the address of the
+    // alloca slot into somewhere else
+    if (use.getOperandNumber() != cir::StoreOp::odsIndex_addr)
----------------
erichkeane wrote:

Not sure if said function belongs on the LoadOp or or StoreOp, but SOMETHING 
that looks less fragile perhaps?  I was hoping someone with more opt experience 
would come along and tell us that this is just 'the way' vs a better way.

>This is a very good point. I feel that it's OK to fold the load away if the 
>corresponding store is atomic/volatile, but I would definitely also agree that 
>we could ask some C/C++ language expert for this.

As a BIT of a language expert: I can't think of a reason why an atomic store 
would be problematic, but the volatile definitely seems like it would be 
problematic.  ONE of the meanings of volatile is "we don't expect what we store 
into a volatile variable to necessarily be what we load out of it".  It seems 
WEIRD to me that we'd have a volatile store but not a volatile load?  But 
presumably we'd want to skip out in that case too?

Atomics are a little weird to me in this case.  I might suggest just skipping 
on them as well, at least until we can prove out that it is ok.  Again, a case 
where having an atomic store but NOT load seems like it is perhaps a bug (since 
atomic/volatile is part of the TYPE not the operation?), but I think the same 
logic follows.

https://github.com/llvm/llvm-project/pull/212284
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to