AANonNull is now the first AA that is always queried via the new APIs and not created manually. Others will follow shortly to avoid trivial AAs whenever possible. This commit introduced some helper logic that will make it simpler to port the next one. It also untangles AADereferenceable and AANonNull such that the former does not keep a handle on the latter. Finally, we stop deducing `nonnull` for `undef`, which was incorrect.
23 lines
1.2 KiB
LLVM
23 lines
1.2 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes --check-attributes --check-globals
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -attributor-max-initialization-chain-length=1 -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK_1
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-annotate-decl-cs -attributor-max-initialization-chain-length=1024 -S < %s | FileCheck %s --check-prefixes=CHECK,CHECK_5
|
|
|
|
declare void @foo(ptr dereferenceable(8) %arg)
|
|
|
|
define dso_local i32 @bar(ptr %arg) {
|
|
; CHECK-LABEL: define {{[^@]+}}@bar
|
|
; CHECK-SAME: (ptr noundef nonnull dereferenceable(8) [[ARG:%.*]]) {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: call void @foo(ptr noundef nonnull dereferenceable(8) [[ARG]])
|
|
; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[ARG]], align 4
|
|
; CHECK-NEXT: ret i32 [[LD]]
|
|
;
|
|
entry:
|
|
call void @foo(ptr %arg)
|
|
%ld = load i32, ptr %arg
|
|
ret i32 %ld
|
|
}
|
|
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
|
; CHECK_1: {{.*}}
|
|
; CHECK_5: {{.*}}
|