[IR] Avoid creation of GEPs into vectors (in one place)
authorJannik Silvanus <jannik.silvanus@amd.com>
Thu, 19 Jan 2023 15:04:45 +0000 (16:04 +0100)
committerJannik Silvanus <jannik.silvanus@amd.com>
Mon, 23 Jan 2023 12:25:39 +0000 (13:25 +0100)
commita4753f5dc0a9bccf3706a82cacbd046c272eb814
tree0ebc018c669e66b3fcc8a3b8f50be51412294ba0
parenteb197e3ea670ee0c573d95a0033327a213656357
[IR] Avoid creation of GEPs into vectors (in one place)

The method DataLayout::getGEPIndexForOffset(Type *&ElemTy, APInt &Offset)
allows to generate GEP indices for a given byte-based offset.
This allows to generate "natural" GEPs using the given type structure
if the byte offset happens to match a nested element object.

With opaque pointers and a general move towards byte-based GEPs [1],
this function may be questionable in the future.

This patch avoids creation of GEPs into vectors in routines that use
DataLayout::getGEPIndexForOffset by not returning indices in that case.

The reason is that A) GEPs into vectors have been discouraged for a long
time [2], and B) that GEPs into vectors are currently broken if the element
type is overaligned [1]. This is also demonstrated by a lit test where
previously InstCombine replaced valid loads by poison. Note that
the result of InstCombine on that test is *still* invalid, because
padding bytes are assumed.
Moreover, GEPs into vectors may be outright forbidden in the future [1].

[1]: https://discourse.llvm.org/t/67497
[2]: https://llvm.org/docs/GetElementPtr.html

The test case is new. It will be precommitted if this patch is accepted.

Differential Revision: https://reviews.llvm.org/D142146
llvm/lib/IR/DataLayout.cpp
llvm/test/Transforms/InstCombine/load-gep-overalign.ll
llvm/test/Transforms/LowerMatrixIntrinsics/multiply-fused-dominance.ll