xref: /llvm-project/llvm/test/Transforms/SCCP/ipsccp-noundef.ll (revision 16bb8c16aab32e2ee623a2b64d976548be247180)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2; RUN: opt -S -passes=ipsccp < %s | FileCheck %s
3@g = external global i8
4
5define internal noundef i32 @ret_noundef() {
6; CHECK-LABEL: define internal i32 @ret_noundef() {
7; CHECK-NEXT:    ret i32 poison
8;
9  ret i32 0
10}
11
12define internal dereferenceable(1) ptr @ret_dereferenceable() {
13; CHECK-LABEL: define internal ptr @ret_dereferenceable() {
14; CHECK-NEXT:    ret ptr poison
15;
16  ret ptr @g
17}
18
19define internal dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null() {
20; CHECK-LABEL: define internal ptr @ret_dereferenceable_or_null() {
21; CHECK-NEXT:    ret ptr poison
22;
23  ret ptr @g
24}
25
26; Non-null is fine, because it does not cause immediate UB.
27define internal nonnull ptr @ret_nonnull() {
28; CHECK-LABEL: define internal nonnull ptr @ret_nonnull() {
29; CHECK-NEXT:    ret ptr poison
30;
31  ret ptr @g
32}
33
34define internal nonnull ptr @ret_nonnull_noundef() {
35; CHECK-LABEL: define internal nonnull ptr @ret_nonnull_noundef() {
36; CHECK-NEXT:    ret ptr poison
37;
38  ret ptr @g
39}
40
41define void @test() {
42; CHECK-LABEL: define void @test() {
43; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @ret_noundef()
44; CHECK-NEXT:    [[TMP2:%.*]] = call ptr @ret_dereferenceable()
45; CHECK-NEXT:    [[TMP3:%.*]] = call ptr @ret_dereferenceable_or_null()
46; CHECK-NEXT:    [[TMP4:%.*]] = call nonnull ptr @ret_nonnull()
47; CHECK-NEXT:    [[TMP5:%.*]] = call nonnull ptr @ret_nonnull_noundef()
48; CHECK-NEXT:    ret void
49;
50  call noundef i32 @ret_noundef()
51  call dereferenceable(1) ptr @ret_dereferenceable()
52  call dereferenceable_or_null(1) ptr @ret_dereferenceable_or_null()
53  call nonnull ptr @ret_nonnull()
54  call nonnull noundef ptr @ret_nonnull_noundef()
55  ret void
56}
57