diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index daa468ac095c3..ccb7fd39ba969 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 ef69805747091..c0b25800a68e5 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