[llvm] [InstSimplify] Correctly handle comparison with zero-size allocs (PR #115728)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 12 01:34:50 PST 2024
https://github.com/nikic updated https://github.com/llvm/llvm-project/pull/115728
>From 9b8e91ff0594150f4013a7c203e4ed4f0f6eef8a Mon Sep 17 00:00:00 2001
From: Nikita Popov <npopov at redhat.com>
Date: Mon, 11 Nov 2024 16:50:29 +0100
Subject: [PATCH] [InstSimplify] Correctly handle comparison with zero-size
allocs
InstSimplify currently folds alloc1 == alloc2 to false, even if
one of them is a zero-size allocation. A zero-size allocation may
have the same address as another allocation.
This also disables the fold for the case where we're comparing a
zero-size alloc with the middle of another allocation. It's
possible that this case is legal to fold depending on our precise
zero-size allocation semantics, but LangRef currently doesn't
specify this either way, so we shouldn't make assumptions here.
---
llvm/lib/Analysis/InstructionSimplify.cpp | 4 ++--
.../Transforms/InstSimplify/cmp-alloca-offsets.ll | 14 ++++++++++----
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index daa468ac095c36..ccb7fd39ba969d 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2774,8 +2774,8 @@ static Constant *computePointerICmp(CmpInst::Predicate Pred, Value *LHS,
return nullptr;
}(LHS);
Opts.NullIsUnknownSize = F ? NullPointerIsDefined(F) : true;
- if (getObjectSize(LHS, LHSSize, DL, TLI, Opts) &&
- getObjectSize(RHS, RHSSize, DL, TLI, Opts)) {
+ if (getObjectSize(LHS, LHSSize, DL, TLI, Opts) && LHSSize != 0 &&
+ getObjectSize(RHS, RHSSize, DL, TLI, Opts) && RHSSize != 0) {
APInt Dist = LHSOffset - RHSOffset;
if (Dist.isNonNegative() ? Dist.ult(LHSSize) : (-Dist).ult(RHSSize))
return ConstantInt::get(getCompareTy(LHS),
diff --git a/llvm/test/Transforms/InstSimplify/cmp-alloca-offsets.ll b/llvm/test/Transforms/InstSimplify/cmp-alloca-offsets.ll
index ef69805747091a..c0b25800a68e59 100644
--- a/llvm/test/Transforms/InstSimplify/cmp-alloca-offsets.ll
+++ b/llvm/test/Transforms/InstSimplify/cmp-alloca-offsets.ll
@@ -234,8 +234,9 @@ define i1 @zst_alloca_start() {
; CHECK-LABEL: @zst_alloca_start(
; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
; CHECK-NEXT: [[A2:%.*]] = alloca {}, align 1
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[A]], [[A2]]
; CHECK-NEXT: call void @escape(ptr [[A]], ptr [[A2]])
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 [[CMP]]
;
%a = alloca i64
%a2 = alloca {}, align 1
@@ -249,8 +250,10 @@ define i1 @zst_alloca_middle() {
; CHECK-LABEL: @zst_alloca_middle(
; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
; CHECK-NEXT: [[A2:%.*]] = alloca {}, align 1
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 4
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], [[A2]]
; CHECK-NEXT: call void @escape(ptr [[A]], ptr [[A2]])
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 [[CMP]]
;
%a = alloca i64
%a2 = alloca {}, align 1
@@ -282,8 +285,9 @@ define i1 @zst_alloca_end() {
define i1 @zst_global_start() {
; CHECK-LABEL: @zst_global_start(
; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[A]], @gz
; CHECK-NEXT: call void @escape(ptr [[A]], ptr @gz)
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 [[CMP]]
;
%a = alloca i64
%gep = getelementptr i8, ptr %a, i64 0
@@ -295,8 +299,10 @@ define i1 @zst_global_start() {
define i1 @zst_global_middle() {
; CHECK-LABEL: @zst_global_middle(
; CHECK-NEXT: [[A:%.*]] = alloca i64, align 8
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr [[A]], i64 4
+; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[GEP]], @gz
; CHECK-NEXT: call void @escape(ptr [[A]], ptr @gz)
-; CHECK-NEXT: ret i1 false
+; CHECK-NEXT: ret i1 [[CMP]]
;
%a = alloca i64
%gep = getelementptr i8, ptr %a, i64 4
More information about the llvm-commits
mailing list