xref: /llvm-project/llvm/test/Transforms/InstCombine/nonnull-select.ll (revision 4ab40eca080965c65802710e39adbb78c4ce7bde)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3
4; Passing select(cond, null, v) as nonnull should be optimized to passing v
5
6define nonnull ptr @pr48975(ptr %.0) {
7; CHECK-LABEL: @pr48975(
8; CHECK-NEXT:    [[DOT1:%.*]] = load ptr, ptr [[DOT0:%.*]], align 8
9; CHECK-NEXT:    [[DOT2:%.*]] = icmp eq ptr [[DOT1]], null
10; CHECK-NEXT:    [[DOT4:%.*]] = select i1 [[DOT2]], ptr null, ptr [[DOT0]]
11; CHECK-NEXT:    ret ptr [[DOT4]]
12;
13  %.1 = load ptr, ptr %.0, align 8
14  %.2 = icmp eq ptr %.1, null
15  %.4 = select i1 %.2, ptr null, ptr %.0
16  ret ptr %.4
17}
18
19define nonnull ptr @nonnull_ret(i1 %cond, ptr %p) {
20; CHECK-LABEL: @nonnull_ret(
21; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
22; CHECK-NEXT:    ret ptr [[RES]]
23;
24  %res = select i1 %cond, ptr %p, ptr null
25  ret ptr %res
26}
27
28define nonnull ptr @nonnull_ret2(i1 %cond, ptr %p) {
29; CHECK-LABEL: @nonnull_ret2(
30; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
31; CHECK-NEXT:    ret ptr [[RES]]
32;
33  %res = select i1 %cond, ptr null, ptr %p
34  ret ptr %res
35}
36
37define nonnull noundef ptr @nonnull_noundef_ret(i1 %cond, ptr %p) {
38; CHECK-LABEL: @nonnull_noundef_ret(
39; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
40; CHECK-NEXT:    ret ptr [[RES]]
41;
42  %res = select i1 %cond, ptr %p, ptr null
43  ret ptr %res
44}
45
46define nonnull noundef ptr @nonnull_noundef_ret2(i1 %cond, ptr %p) {
47; CHECK-LABEL: @nonnull_noundef_ret2(
48; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
49; CHECK-NEXT:    ret ptr [[RES]]
50;
51  %res = select i1 %cond, ptr null, ptr %p
52  ret ptr %res
53}
54
55
56define void @nonnull_call(i1 %cond, ptr %p) {
57; CHECK-LABEL: @nonnull_call(
58; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
59; CHECK-NEXT:    call void @f(ptr nonnull [[RES]])
60; CHECK-NEXT:    ret void
61;
62  %res = select i1 %cond, ptr %p, ptr null
63  call void @f(ptr nonnull %res)
64  ret void
65}
66
67define void @nonnull_call2(i1 %cond, ptr %p) {
68; CHECK-LABEL: @nonnull_call2(
69; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
70; CHECK-NEXT:    call void @f(ptr nonnull [[RES]])
71; CHECK-NEXT:    ret void
72;
73  %res = select i1 %cond, ptr null, ptr %p
74  call void @f(ptr nonnull %res)
75  ret void
76}
77
78define void @nonnull_noundef_call(i1 %cond, ptr %p) {
79; CHECK-LABEL: @nonnull_noundef_call(
80; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr [[P:%.*]], ptr null
81; CHECK-NEXT:    call void @f(ptr noundef nonnull [[RES]])
82; CHECK-NEXT:    ret void
83;
84  %res = select i1 %cond, ptr %p, ptr null
85  call void @f(ptr nonnull noundef %res)
86  ret void
87}
88
89define void @nonnull_noundef_call2(i1 %cond, ptr %p) {
90; CHECK-LABEL: @nonnull_noundef_call2(
91; CHECK-NEXT:    [[RES:%.*]] = select i1 [[COND:%.*]], ptr null, ptr [[P:%.*]]
92; CHECK-NEXT:    call void @f(ptr noundef nonnull [[RES]])
93; CHECK-NEXT:    ret void
94;
95  %res = select i1 %cond, ptr null, ptr %p
96  call void @f(ptr nonnull noundef %res)
97  ret void
98}
99
100declare void @f(ptr)
101