[InstSimplify] Fold inbounds GEP to poison if base is undef.

D92270 updated constant expression folding to fold inbounds GEP to
poison if the base is undef. Apply the same logic to SimplifyGEPInst.

The justification is that we can choose an out-of-bounds pointer as base
pointer.

Reviewed By: nikic, lebedev.ri

Differential Revision: https://reviews.llvm.org/D117015
This commit is contained in:
Florian Hahn 2022-01-11 16:11:22 +00:00
parent 0199e47373
commit 8a469e2050
No known key found for this signature in database
GPG Key ID: CF59919C6547A668
2 changed files with 4 additions and 3 deletions

View File

@ -4457,7 +4457,8 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops, bool InBounds,
return PoisonValue::get(GEPTy);
if (Q.isUndefValue(Ops[0]))
return UndefValue::get(GEPTy);
// If inbounds, we can choose an out-of-bounds pointer as a base pointer.
return InBounds ? PoisonValue::get(GEPTy) : UndefValue::get(GEPTy);
bool IsScalableVec =
isa<ScalableVectorType>(SrcTy) || any_of(Ops, [](const Value *V) {

View File

@ -160,7 +160,7 @@ define i8* @test7(i8* %b, i8** %e) {
define i64* @undef_inbounds_var_idx(i64 %idx) {
; CHECK-LABEL: @undef_inbounds_var_idx(
; CHECK-NEXT: ret i64* undef
; CHECK-NEXT: ret i64* poison
;
%el = getelementptr inbounds i64, i64* undef, i64 %idx
ret i64* %el
@ -176,7 +176,7 @@ define i64* @undef_no_inbounds_var_idx(i64 %idx) {
define <8 x i64*> @undef_vec1() {
; CHECK-LABEL: @undef_vec1(
; CHECK-NEXT: ret <8 x i64*> undef
; CHECK-NEXT: ret <8 x i64*> poison
;
%el = getelementptr inbounds i64, i64* undef, <8 x i64> undef
ret <8 x i64*> %el