diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index f404e11b9c0f0..e22b04e1bb0b3 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -448,7 +448,7 @@ bool CallBase::paramHasNonNullAttr(unsigned ArgNo, (AllowUndefOrPoison || paramHasAttr(ArgNo, Attribute::NoUndef))) return true; - if (getParamDereferenceableBytes(ArgNo) > 0 && + if (paramHasAttr(ArgNo, Attribute::Dereferenceable) && !NullPointerIsDefined( getCaller(), getArgOperand(ArgNo)->getType()->getPointerAddressSpace())) diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 7840601d341b8..b7299e01b0c5f 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -8224,8 +8224,8 @@ static bool passingValueIsAlwaysUndefined(Value *V, Instruction *I, bool PtrValu if (CB->isArgOperand(&Use)) { unsigned ArgIdx = CB->getArgOperandNo(&Use); // Passing null to a nonnnull+noundef argument is undefined. - if (C->isNullValue() && CB->isPassingUndefUB(ArgIdx) && - CB->paramHasAttr(ArgIdx, Attribute::NonNull)) + if (isa(C) && + CB->paramHasNonNullAttr(ArgIdx, /*AllowUndefOrPoison=*/false)) return !PtrValueMayBeModified; // Passing undef to a noundef argument is undefined. if (isa(C) && CB->isPassingUndefUB(ArgIdx)) diff --git a/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll b/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll index aae1ab032f36e..2da5d18b63f49 100644 --- a/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll +++ b/llvm/test/Transforms/SimplifyCFG/UnreachableEliminate.ll @@ -238,7 +238,7 @@ else: } declare ptr @fn_nonnull_noundef_arg(ptr nonnull noundef %p) -declare ptr @fn_nonnull_deref_arg(ptr nonnull dereferenceable(4) %p) +declare ptr @fn_deref_arg(ptr dereferenceable(4) %p) declare ptr @fn_nonnull_deref_or_null_arg(ptr nonnull dereferenceable_or_null(4) %p) declare ptr @fn_nonnull_arg(ptr nonnull %p) declare ptr @fn_noundef_arg(ptr noundef %p) @@ -271,7 +271,7 @@ define void @test9_deref(i1 %X, ptr %Y) { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[X:%.*]], true ; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]]) -; CHECK-NEXT: [[TMP1:%.*]] = call ptr @fn_nonnull_deref_arg(ptr [[Y:%.*]]) +; CHECK-NEXT: [[TMP1:%.*]] = call ptr @fn_deref_arg(ptr [[Y:%.*]]) ; CHECK-NEXT: ret void ; entry: @@ -282,7 +282,7 @@ if: else: %phi = phi ptr [ %Y, %entry ], [ null, %if ] - call ptr @fn_nonnull_deref_arg(ptr %phi) + call ptr @fn_deref_arg(ptr %phi) ret void } @@ -290,9 +290,8 @@ else: define void @test9_deref_or_null(i1 %X, ptr %Y) { ; CHECK-LABEL: @test9_deref_or_null( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[X:%.*]], true -; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]]) -; CHECK-NEXT: [[TMP1:%.*]] = call ptr @fn_nonnull_deref_or_null_arg(ptr [[Y:%.*]]) +; CHECK-NEXT: [[Y:%.*]] = select i1 [[X:%.*]], ptr null, ptr [[Y1:%.*]] +; CHECK-NEXT: [[TMP1:%.*]] = call ptr @fn_nonnull_deref_or_null_arg(ptr [[Y]]) ; CHECK-NEXT: ret void ; entry: