diff --git a/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp --- a/llvm/lib/IR/DataLayout.cpp +++ b/llvm/lib/IR/DataLayout.cpp @@ -937,13 +937,10 @@ } if (auto *VecTy = dyn_cast(ElemTy)) { - ElemTy = VecTy->getElementType(); - unsigned ElemSizeInBits = getTypeSizeInBits(ElemTy).getFixedValue(); - // GEPs over non-multiple of 8 size vector elements are invalid. - if (ElemSizeInBits % 8 != 0) - return std::nullopt; - - return getElementIndex(TypeSize::Fixed(ElemSizeInBits / 8), Offset); + // Vector GEPs are partially broken (e.g. for overaligned element types), + // and may be forbidden in the future, so avoid generating GEPs into + // vectors. See https://discourse.llvm.org/t/67497 + return std::nullopt; } if (auto *STy = dyn_cast(ElemTy)) { diff --git a/llvm/test/Transforms/InstCombine/load-gep-overalign.ll b/llvm/test/Transforms/InstCombine/load-gep-overalign.ll --- a/llvm/test/Transforms/InstCombine/load-gep-overalign.ll +++ b/llvm/test/Transforms/InstCombine/load-gep-overalign.ll @@ -16,9 +16,7 @@ ; OVERALIGNED and NATURAL should have the same result, because the layout of vectors ignores ; element type alignment, and thus the representation of @foo is the same in both cases. ; -; TODO: The OVERALIGNED result is incorrect. -; First, for nonzero even indices, the valid load is replaced by poison. -; Second, the remaining bytes at indices >= 2 are also incorrect, as apparently padding bytes +; TODO: The OVERALIGNED result is incorrect, as apparently padding bytes ; are assumed as they would appear in an array. In vectors, there is no padding. ; ; NATURAL-LABEL: @test_vector_load_i8( @@ -35,11 +33,11 @@ ; OVERALIGNED-LABEL: @test_vector_load_i8( ; OVERALIGNED-NEXT: call void @report(i64 0, i8 1) ; OVERALIGNED-NEXT: call void @report(i64 1, i8 35) -; OVERALIGNED-NEXT: call void @report(i64 2, i8 poison) +; OVERALIGNED-NEXT: call void @report(i64 2, i8 0) ; OVERALIGNED-NEXT: call void @report(i64 3, i8 0) -; OVERALIGNED-NEXT: call void @report(i64 4, i8 poison) +; OVERALIGNED-NEXT: call void @report(i64 4, i8 69) ; OVERALIGNED-NEXT: call void @report(i64 5, i8 103) -; OVERALIGNED-NEXT: call void @report(i64 6, i8 poison) +; OVERALIGNED-NEXT: call void @report(i64 6, i8 0) ; OVERALIGNED-NEXT: call void @report(i64 7, i8 0) ; OVERALIGNED-NEXT: ret void ;