summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Hahn <flo@fhahn.com>2022-01-11 16:11:22 +0000
committerFlorian Hahn <flo@fhahn.com>2022-01-11 16:11:22 +0000
commit8a469e20505fd9b8daddd88227ff33888d6be821 (patch)
tree1b8a2acdcd4c9bbb16735be075e73752103a5ebc
parent0199e47373497ec01d0e76ee379b9e0180b76edf (diff)
downloadllvm-8a469e20505fd9b8daddd88227ff33888d6be821.tar.gz
[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
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp3
-rw-r--r--llvm/test/Transforms/InstSimplify/gep.ll4
2 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 8bdcb70a4170..1ec5c4e9f6b5 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -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) {
diff --git a/llvm/test/Transforms/InstSimplify/gep.ll b/llvm/test/Transforms/InstSimplify/gep.ll
index 4814291ddd67..66bcbd9be866 100644
--- a/llvm/test/Transforms/InstSimplify/gep.ll
+++ b/llvm/test/Transforms/InstSimplify/gep.ll
@@ -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