================
@@ -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