Index: lib/IR/ConstantFold.cpp =================================================================== --- lib/IR/ConstantFold.cpp +++ lib/IR/ConstantFold.cpp @@ -349,19 +349,29 @@ if (NumElems == 0) return ConstantExpr::getNullValue(DestTy); // Check for a struct with all members having the same size. - Constant *MemberSize = + Constant *FirstMemberSize = getFoldedSizeOf(STy->getElementType(0), DestTy, true); + Constant *StructSize = FirstMemberSize; + bool AllSame = true; - for (unsigned i = 1; i != NumElems; ++i) - if (MemberSize != - getFoldedSizeOf(STy->getElementType(i), DestTy, true)) { + for (unsigned i = 1; i != NumElems; ++i){ + Constant *MemberSize = getFoldedSizeOf(STy->getElementType(i), DestTy, true); + StructSize = ConstantExpr::getNUWAdd(StructSize, MemberSize); + + if (FirstMemberSize != MemberSize){ + if (!Folded) + return nullptr; + AllSame = false; - break; } + } + if (AllSame) { Constant *N = ConstantInt::get(DestTy, NumElems); - return ConstantExpr::getNUWMul(MemberSize, N); + return ConstantExpr::getNUWMul(FirstMemberSize, N); } + + return ConstantExpr::getCast(CastInst::getCastOpcode(StructSize, false, DestTy, false), StructSize, DestTy); } // Pointer size doesn't depend on the pointee type, so canonicalize them