forked from OSchip/llvm-project
67 lines
4.5 KiB
LLVM
67 lines
4.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt -passes='assume-builder,verify' --enable-knowledge-retention -S %s | FileCheck %s --check-prefixes=BASIC
|
|
; RUN: opt -passes='assume-builder,verify' --enable-knowledge-retention --assume-preserve-all -S %s | FileCheck %s --check-prefixes=ALL
|
|
|
|
declare void @func(i32*, i32*)
|
|
declare void @func_cold(i32*) cold
|
|
declare void @func_strbool(i32*) "no-jump-tables"
|
|
declare void @func_many(i32*) "no-jump-tables" nounwind "less-precise-fpmad" willreturn norecurse
|
|
declare void @func_argattr(i32* align 8, i32* nonnull) nounwind
|
|
|
|
define void @test(i32* %P, i32* %P1, i32* %P2, i32* %P3) {
|
|
; BASIC-LABEL: @test(
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P:%.*]], i64 16), "nonnull"(i32* [[P]]) ]
|
|
; BASIC-NEXT: call void @func(i32* nonnull dereferenceable(16) [[P]], i32* null)
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1:%.*]], i64 12), "nonnull"(i32* [[P]]) ]
|
|
; BASIC-NEXT: call void @func(i32* dereferenceable(12) [[P1]], i32* nonnull [[P]])
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "cold"(), "dereferenceable"(i32* [[P1]], i64 12) ]
|
|
; BASIC-NEXT: call void @func_cold(i32* dereferenceable(12) [[P1]]) #0
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "cold"(), "dereferenceable"(i32* [[P1]], i64 12) ]
|
|
; BASIC-NEXT: call void @func_cold(i32* dereferenceable(12) [[P1]])
|
|
; BASIC-NEXT: call void @func(i32* [[P1]], i32* [[P]])
|
|
; BASIC-NEXT: call void @func_strbool(i32* [[P1]])
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 8), "dereferenceable"(i32* [[P]], i64 16) ]
|
|
; BASIC-NEXT: call void @func(i32* dereferenceable(16) [[P]], i32* dereferenceable(8) [[P]])
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8) ]
|
|
; BASIC-NEXT: call void @func_many(i32* align 8 [[P1]])
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P2:%.*]], i64 8), "nonnull"(i32* [[P3:%.*]]) ]
|
|
; BASIC-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
|
|
; BASIC-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P]]), "nonnull"(i32* [[P1]]) ]
|
|
; BASIC-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
|
|
; BASIC-NEXT: ret void
|
|
;
|
|
; ALL-LABEL: @test(
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P:%.*]], i64 16), "nonnull"(i32* [[P]]) ]
|
|
; ALL-NEXT: call void @func(i32* nonnull dereferenceable(16) [[P]], i32* null)
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P1:%.*]], i64 12), "nonnull"(i32* [[P]]) ]
|
|
; ALL-NEXT: call void @func(i32* dereferenceable(12) [[P1]], i32* nonnull [[P]])
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "cold"(), "dereferenceable"(i32* [[P1]], i64 12) ]
|
|
; ALL-NEXT: call void @func_cold(i32* dereferenceable(12) [[P1]]) #0
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "cold"(), "dereferenceable"(i32* [[P1]], i64 12) ]
|
|
; ALL-NEXT: call void @func_cold(i32* dereferenceable(12) [[P1]])
|
|
; ALL-NEXT: call void @func(i32* [[P1]], i32* [[P]])
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "no-jump-tables"() ]
|
|
; ALL-NEXT: call void @func_strbool(i32* [[P1]])
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "dereferenceable"(i32* [[P]], i64 8), "dereferenceable"(i32* [[P]], i64 16) ]
|
|
; ALL-NEXT: call void @func(i32* dereferenceable(16) [[P]], i32* dereferenceable(8) [[P]])
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P1]], i64 8), "less-precise-fpmad"(), "no-jump-tables"(), "norecurse"(), "nounwind"(), "willreturn"() ]
|
|
; ALL-NEXT: call void @func_many(i32* align 8 [[P1]])
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "align"(i32* [[P2:%.*]], i64 8), "nonnull"(i32* [[P3:%.*]]), "nounwind"() ]
|
|
; ALL-NEXT: call void @func_argattr(i32* [[P2]], i32* [[P3]])
|
|
; ALL-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i32* [[P]]), "nonnull"(i32* [[P1]]) ]
|
|
; ALL-NEXT: call void @func(i32* nonnull [[P1]], i32* nonnull [[P]])
|
|
; ALL-NEXT: ret void
|
|
;
|
|
call void @func(i32* nonnull dereferenceable(16) %P, i32* null)
|
|
call void @func(i32* dereferenceable(12) %P1, i32* nonnull %P)
|
|
call void @func_cold(i32* dereferenceable(12) %P1) cold
|
|
call void @func_cold(i32* dereferenceable(12) %P1)
|
|
call void @func(i32* %P1, i32* %P)
|
|
call void @func_strbool(i32* %P1)
|
|
call void @func(i32* dereferenceable(16) %P, i32* dereferenceable(8) %P)
|
|
call void @func_many(i32* align 8 %P1)
|
|
call void @func_argattr(i32* %P2, i32* %P3)
|
|
call void @func(i32* nonnull %P1, i32* nonnull %P)
|
|
ret void
|
|
}
|