forked from OSchip/llvm-project
[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:
parent
0199e47373
commit
8a469e2050
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue