================
@@ -410,44 +408,67 @@ void insertReturnCoercion(mlir::FunctionOpInterface
funcOp,
}
}
+/// If \p recordVal is a plain load of an alloca, return that alloca and the
+/// load. Return nulls otherwise: a volatile or atomic load has to keep its
+/// ordering, and a call result or a load of a member of a larger record has no
+/// alloca of its own.
+static std::pair<cir::AllocaOp, cir::LoadOp>
+getWholeRecordSource(mlir::Value recordVal) {
+ cir::LoadOp load = recordVal.getDefiningOp<cir::LoadOp>();
+ if (!load || load.getIsVolatile() || load.getMemOrder())
+ return {};
+ auto alloca = load.getAddr().getDefiningOp<cir::AllocaOp>();
----------------
andykaylor wrote:
This should probably be trying to look through address space casts. See
getUnderlyingAllocaOp() in Address.h. We can't call that here, but we could add
a similar helper function at the dialect level. This won't matter until we get
into offload targets, so you can just add a TODO comment for now.
https://github.com/llvm/llvm-project/pull/216499
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits