Index: lib/Analysis/ConstantFolding.cpp =================================================================== --- lib/Analysis/ConstantFolding.cpp +++ lib/Analysis/ConstantFolding.cpp @@ -347,9 +347,16 @@ // We're simulating a load through a pointer that was bitcast to point to // a different type, so we can try to walk down through the initial - // elements of an aggregate to see if some part of th e aggregate is + // elements of an aggregate to see if some part of the aggregate is // castable to implement the "load" semantic model. - C = C->getAggregateElement(0u); + unsigned Elem = 0; + Constant *ElemC; + do { + ElemC = C->getAggregateElement(Elem++); + // Structs might have leading zero-length elements like [0 x i32], which + // are certainly not what we are looking for, so skip them. + } while (ElemC && DL.getTypeSizeInBits(ElemC->getType()) == 0); + C = ElemC; } while (C); return nullptr; Index: test/Transforms/ConstProp/loads.ll =================================================================== --- test/Transforms/ConstProp/loads.ll +++ test/Transforms/ConstProp/loads.ll @@ -269,3 +269,16 @@ ; BE-LABEL: @test16.3( ; BE: ret i64 0 } + +@g7 = constant {[0 x i32], [0 x i8], i64} { [0 x i32] undef, [0 x i8] undef, i64 123 } + +define i64 @test_leading_zero_size_elems() { + %v = load i64, i64* bitcast ({[0 x i32], [0 x i8], i64}* @g7 to i64*) + ret i64 %v + +; LE-LABEL: @test_leading_zero_size_elems( +; LE: ret i64 123 + +; BE-LABEL: @test_leading_zero_size_elems( +; BE: ret i64 123 +}