================
@@ -572,21 +572,27 @@ void UnionType::complete(ArrayRef<Type> members, bool 
packed,
 
 mlir::Type
 UnionType::getUnionStorageType(const mlir::DataLayout &dataLayout) const {
-  return getUnionStorageType(dataLayout, getMembers());
+  return getUnionStorageType(dataLayout, getMembers(), getMemberKinds());
 }
 
-mlir::Type UnionType::getUnionStorageType(const mlir::DataLayout &dataLayout,
-                                          llvm::ArrayRef<mlir::Type> members) {
-  if (members.empty())
-    return {};
-  return *std::max_element(
-      members.begin(), members.end(), [&](mlir::Type lhs, mlir::Type rhs) {
-        return dataLayout.getTypeABIAlignment(lhs) <
-                   dataLayout.getTypeABIAlignment(rhs) ||
-               (dataLayout.getTypeABIAlignment(lhs) ==
-                    dataLayout.getTypeABIAlignment(rhs) &&
-                dataLayout.getTypeSize(lhs) < dataLayout.getTypeSize(rhs));
-      });
+mlir::Type
+UnionType::getUnionStorageType(const mlir::DataLayout &dataLayout,
+                               llvm::ArrayRef<mlir::Type> members,
+                               llvm::ArrayRef<RecordMemberKind> kinds) {
+  // A member occupying no storage cannot be the storage.
+  mlir::Type storage;
+  for (auto [memberTy, kind] : llvm::zip_equal(members, kinds)) {
+    if (isZeroWidthBitField(memberTy, kind))
----------------
erichkeane wrote:

I'd suggest just doing this with a filter iterator.  This loop is actually 
quite touch to read in a way that max_element did well.  

So just extract the `isZeroWidthBitField` into a filter-range.

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

Reply via email to