mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 18:06:49 +00:00
Teach isKnownNonNull that a nonnull return is not null. Add a test for this case as well as the case of a nonnull attribute (already handled but not tested).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209193 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
956583e98e
commit
4bf804fe0d
@ -16,6 +16,7 @@
|
||||
#include "llvm/ADT/SmallPtrSet.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/MemoryBuiltins.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/ConstantRange.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
@ -2073,6 +2074,10 @@ bool llvm::isKnownNonNull(const Value *V, const TargetLibraryInfo *TLI) {
|
||||
if (const GlobalValue *GV = dyn_cast<GlobalValue>(V))
|
||||
return !GV->hasExternalWeakLinkage();
|
||||
|
||||
if (ImmutableCallSite CS = V)
|
||||
if (CS.paramHasAttr(0, Attribute::NonNull))
|
||||
return true;
|
||||
|
||||
// operator new never returns null.
|
||||
if (isOperatorNewLikeFn(V, TLI, /*LookThroughBitCast=*/true))
|
||||
return true;
|
||||
|
@ -866,3 +866,20 @@ define i1 @exact_ashr_sgt_false(i32 %a) {
|
||||
; CHECK-LABEL: @exact_ashr_sgt_false
|
||||
; CHECK-NEXT: ret i1 false
|
||||
}
|
||||
|
||||
define i1 @nonnull_arg(i32* nonnull %i) {
|
||||
%cmp = icmp eq i32* %i, null
|
||||
ret i1 %cmp
|
||||
; CHECK-LABEL: @nonnull_arg
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
||||
declare nonnull i32* @returns_nonnull_helper()
|
||||
define i1 @returns_nonnull() {
|
||||
%call = call nonnull i32* @returns_nonnull_helper()
|
||||
%cmp = icmp eq i32* %call, null
|
||||
ret i1 %cmp
|
||||
; CHECK-LABEL: @returns_nonnull
|
||||
; CHECK: ret i1 false
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user