================ @@ -230,17 +230,41 @@ void RecordType::complete(ArrayRef<Type> members, bool packed, bool padded) { llvm_unreachable("failed to complete record"); } +/// Return the largest member of in the type. +/// +/// Recurses into union members never returning a union as the largest member. +Type RecordType::getLargestMember(const ::mlir::DataLayout &dataLayout) const { + assert(isUnion() && "Only call getLargestMember on unions"); + Type largestMember; + unsigned largestMemberSize = 0; + unsigned numElements = getNumElements(); + auto members = getMembers(); + if (getPadded()) + numElements -= 1; // The last element is padding. + for (unsigned i = 0; i < numElements; ++i) { ---------------- erichkeane wrote:
This loop looks to me to be trivially a `std::max_element`, which would end up saving a lot of the work here. Either way, that `if` statement is really difficult to decode, and we should see if we can do better here. Also, could probably use `make_range` to use a range-for here to make this easier to read as well. https://github.com/llvm/llvm-project/pull/137501 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits