xref: /llvm-project/llvm/test/Transforms/SCCP/freeze.ll (revision d37d4072f2eef35ba573350faa07909a36988e34)
1b2a885a2SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2b2a885a2SFlorian Hahn; RUN: opt -passes=ipsccp -S %s | FileCheck %s
3b2a885a2SFlorian Hahn
4*d37d4072SMikhail Gudim@g = global i64 0
5b2a885a2SFlorian Hahndeclare void @use(i1)
6b2a885a2SFlorian Hahn
7b2a885a2SFlorian Hahndefine i1 @freeze_undef_i1() {
8b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_i1(
9b2a885a2SFlorian Hahn; CHECK-NEXT:    [[FR:%.*]] = freeze i1 undef
10b2a885a2SFlorian Hahn; CHECK-NEXT:    ret i1 [[FR]]
11b2a885a2SFlorian Hahn;
12b2a885a2SFlorian Hahn  %fr = freeze i1 undef
13b2a885a2SFlorian Hahn  ret i1 %fr
14b2a885a2SFlorian Hahn}
15b2a885a2SFlorian Hahn
16b2a885a2SFlorian Hahndefine ptr @freeze_undef_ptr() {
17b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_ptr(
18b2a885a2SFlorian Hahn; CHECK-NEXT:    [[FR:%.*]] = freeze ptr undef
19b2a885a2SFlorian Hahn; CHECK-NEXT:    ret ptr [[FR]]
20b2a885a2SFlorian Hahn;
21b2a885a2SFlorian Hahn  %fr = freeze ptr undef
22b2a885a2SFlorian Hahn  ret ptr %fr
23b2a885a2SFlorian Hahn}
24b2a885a2SFlorian Hahn
25b2a885a2SFlorian Hahndefine float @freeze_undef_float() {
26b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_float(
27b2a885a2SFlorian Hahn; CHECK-NEXT:    [[FR:%.*]] = freeze float undef
28b2a885a2SFlorian Hahn; CHECK-NEXT:    ret float [[FR]]
29b2a885a2SFlorian Hahn;
30b2a885a2SFlorian Hahn  %fr = freeze float undef
31b2a885a2SFlorian Hahn  ret float %fr
32b2a885a2SFlorian Hahn}
33b2a885a2SFlorian Hahn
34b2a885a2SFlorian Hahndefine <2 x i32> @freeze_undef_vector() {
35b2a885a2SFlorian Hahn; CHECK-LABEL: @freeze_undef_vector(
36b2a885a2SFlorian Hahn; CHECK-NEXT:    [[FR:%.*]] = freeze <2 x i32> undef
37b2a885a2SFlorian Hahn; CHECK-NEXT:    ret <2 x i32> [[FR]]
38b2a885a2SFlorian Hahn;
39b2a885a2SFlorian Hahn  %fr = freeze <2 x i32> undef
40b2a885a2SFlorian Hahn  ret <2 x i32> %fr
41b2a885a2SFlorian Hahn}
42b2a885a2SFlorian Hahn
43*d37d4072SMikhail Gudimdefine i1 @freeze_const_i1() {
44*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_i1(
45*d37d4072SMikhail Gudim; CHECK-NEXT:    ret i1 true
46*d37d4072SMikhail Gudim;
47*d37d4072SMikhail Gudim  %fr = freeze i1 1
48*d37d4072SMikhail Gudim  ret i1 %fr
49*d37d4072SMikhail Gudim}
50*d37d4072SMikhail Gudim
51*d37d4072SMikhail Gudimdefine ptr @freeze_const_ptr() {
52*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_ptr(
53*d37d4072SMikhail Gudim; CHECK-NEXT:    ret ptr inttoptr (i32 256 to ptr)
54*d37d4072SMikhail Gudim;
55*d37d4072SMikhail Gudim  %fr = freeze ptr inttoptr (i32 256 to ptr)
56*d37d4072SMikhail Gudim  ret ptr %fr
57*d37d4072SMikhail Gudim}
58*d37d4072SMikhail Gudim
59*d37d4072SMikhail Gudimdefine float @freeze_const_float() {
60*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_float(
61*d37d4072SMikhail Gudim; CHECK-NEXT:    ret float 2.500000e-01
62*d37d4072SMikhail Gudim;
63*d37d4072SMikhail Gudim  %fr = freeze float 2.500000e-01
64*d37d4072SMikhail Gudim  ret float %fr
65*d37d4072SMikhail Gudim}
66*d37d4072SMikhail Gudim
67*d37d4072SMikhail Gudimdefine <2 x i32> @freeze_const_vector() {
68*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_const_vector(
69*d37d4072SMikhail Gudim; CHECK-NEXT:    ret <2 x i32> <i32 1, i32 2>
70*d37d4072SMikhail Gudim;
71*d37d4072SMikhail Gudim  %fr = freeze <2 x i32> <i32 1, i32 2>
72*d37d4072SMikhail Gudim  ret <2 x i32> %fr
73*d37d4072SMikhail Gudim}
74*d37d4072SMikhail Gudim
75*d37d4072SMikhail Gudim; make sure we don't constant-propagate values that could potentially be poison
76*d37d4072SMikhail Gudimdefine i64 @maybe_poison() {
77*d37d4072SMikhail Gudim; CHECK-LABEL: @maybe_poison(
78*d37d4072SMikhail Gudim; CHECK-NEXT:    [[FR:%.*]] = freeze i64 add nuw (i64 ptrtoint (ptr @g to i64), i64 123)
79*d37d4072SMikhail Gudim; CHECK-NEXT:    ret i64 [[FR]]
80*d37d4072SMikhail Gudim;
81*d37d4072SMikhail Gudim  %fr = freeze i64 add nuw (i64 ptrtoint (ptr @g to i64), i64 123)
82*d37d4072SMikhail Gudim  ret i64 %fr
83*d37d4072SMikhail Gudim}
84*d37d4072SMikhail Gudim
85*d37d4072SMikhail Gudimdefine {i64, i64} @freeze_struct({i64, i64} %s) {
86*d37d4072SMikhail Gudim; CHECK-LABEL: @freeze_struct(
87*d37d4072SMikhail Gudim; CHECK-NEXT:    [[FR:%.*]] = freeze { i64, i64 } [[S:%.*]]
88*d37d4072SMikhail Gudim; CHECK-NEXT:    ret { i64, i64 } [[FR]]
89*d37d4072SMikhail Gudim;
90*d37d4072SMikhail Gudim  %fr = freeze {i64, i64} %s
91*d37d4072SMikhail Gudim  ret {i64, i64} %fr
92*d37d4072SMikhail Gudim}
93*d37d4072SMikhail Gudim
94b2a885a2SFlorian Hahndefine i1 @propagate_range_from_and_through_freeze(i32 %x, i32 %y) {
95b2a885a2SFlorian Hahn; CHECK-LABEL: @propagate_range_from_and_through_freeze(
96b2a885a2SFlorian Hahn; CHECK-NEXT:    [[AND:%.*]] = and i32 [[X:%.*]], 3
97b2a885a2SFlorian Hahn; CHECK-NEXT:    [[AND_FR:%.*]] = freeze i32 [[AND]]
98b2a885a2SFlorian Hahn; CHECK-NEXT:    [[F_1:%.*]] = icmp eq i32 [[AND_FR]], 100
99b2a885a2SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_1]])
100b2a885a2SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[AND_FR]], 3
101b2a885a2SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[T_1]])
102b2a885a2SFlorian Hahn; CHECK-NEXT:    [[F_2:%.*]] = icmp ugt i32 [[AND_FR]], 3
103b2a885a2SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[F_2]])
104b2a885a2SFlorian Hahn; CHECK-NEXT:    [[C_1:%.*]] = icmp eq i32 [[AND_FR]], [[Y:%.*]]
105b2a885a2SFlorian Hahn; CHECK-NEXT:    call void @use(i1 [[C_1]])
106b2a885a2SFlorian Hahn; CHECK-NEXT:    [[R_1:%.*]] = xor i1 [[T_1]], [[F_1]]
107b2a885a2SFlorian Hahn; CHECK-NEXT:    [[R_2:%.*]] = xor i1 [[R_1]], [[F_2]]
108b2a885a2SFlorian Hahn; CHECK-NEXT:    [[R_3:%.*]] = xor i1 [[R_2]], [[C_1]]
109b2a885a2SFlorian Hahn; CHECK-NEXT:    ret i1 [[R_3]]
110b2a885a2SFlorian Hahn;
111b2a885a2SFlorian Hahn  %and = and i32 %x, 3
112b2a885a2SFlorian Hahn  %and.fr = freeze i32 %and
113b2a885a2SFlorian Hahn  %f.1 = icmp eq i32 %and.fr, 100
114b2a885a2SFlorian Hahn  call void @use(i1 %f.1)
115b2a885a2SFlorian Hahn  %t.1 = icmp ule i32 %and.fr, 3
116b2a885a2SFlorian Hahn  call void @use(i1 %t.1)
117b2a885a2SFlorian Hahn  %f.2 = icmp ugt i32 %and.fr, 3
118b2a885a2SFlorian Hahn  call void @use(i1 %f.2)
119b2a885a2SFlorian Hahn  %c.1 = icmp eq i32 %and.fr, %y
120b2a885a2SFlorian Hahn  call void @use(i1 %c.1)
121b2a885a2SFlorian Hahn  %r.1 = xor i1 %t.1, %f.1
122b2a885a2SFlorian Hahn  %r.2 = xor i1 %r.1, %f.2
123b2a885a2SFlorian Hahn  %r.3 = xor i1 %r.2, %c.1
124b2a885a2SFlorian Hahn  ret i1 %r.3
125b2a885a2SFlorian Hahn}
126b2a885a2SFlorian Hahn
127b2a885a2SFlorian Hahndefine i1 @range_from_phi_with_undef(i1 %c.1, i1 %c.2) {
128b2a885a2SFlorian Hahn; CHECK-LABEL: @range_from_phi_with_undef(
129b2a885a2SFlorian Hahn; CHECK-NEXT:    br i1 [[C_1:%.*]], label [[TRUE_1:%.*]], label [[FALSE:%.*]]
130b2a885a2SFlorian Hahn; CHECK:       true.1:
131b2a885a2SFlorian Hahn; CHECK-NEXT:    br i1 [[C_2:%.*]], label [[TRUE_2:%.*]], label [[EXIT:%.*]]
132b2a885a2SFlorian Hahn; CHECK:       true.2:
133b2a885a2SFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
134b2a885a2SFlorian Hahn; CHECK:       false:
135b2a885a2SFlorian Hahn; CHECK-NEXT:    br label [[EXIT]]
136b2a885a2SFlorian Hahn; CHECK:       exit:
137b2a885a2SFlorian Hahn; CHECK-NEXT:    [[P:%.*]] = phi i32 [ 10, [[TRUE_1]] ], [ 20, [[TRUE_2]] ], [ undef, [[FALSE]] ]
138b2a885a2SFlorian Hahn; CHECK-NEXT:    [[P_FR:%.*]] = freeze i32 [[P]]
139b2a885a2SFlorian Hahn; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i32 [[P_FR]], 20
140b2a885a2SFlorian Hahn; CHECK-NEXT:    [[T_2:%.*]] = icmp uge i32 [[P_FR]], 10
141b2a885a2SFlorian Hahn; CHECK-NEXT:    [[RES:%.*]] = xor i1 [[T_1]], [[T_2]]
142b2a885a2SFlorian Hahn; CHECK-NEXT:    ret i1 [[RES]]
143b2a885a2SFlorian Hahn;
144b2a885a2SFlorian Hahn  br i1 %c.1, label %true.1, label %false
145b2a885a2SFlorian Hahn
146b2a885a2SFlorian Hahntrue.1:
147b2a885a2SFlorian Hahn  br i1 %c.2, label %true.2, label %exit
148b2a885a2SFlorian Hahn
149b2a885a2SFlorian Hahntrue.2:
150b2a885a2SFlorian Hahn  br label %exit
151b2a885a2SFlorian Hahn
152b2a885a2SFlorian Hahnfalse:
153b2a885a2SFlorian Hahn  br label %exit
154b2a885a2SFlorian Hahn
155b2a885a2SFlorian Hahnexit:
156b2a885a2SFlorian Hahn  %p = phi i32 [ 10, %true.1 ], [ 20, %true.2], [ undef, %false ]
157b2a885a2SFlorian Hahn  %p.fr = freeze i32 %p
158b2a885a2SFlorian Hahn  %t.1 = icmp ule i32 %p.fr, 20
159b2a885a2SFlorian Hahn  %t.2 = icmp uge i32 %p.fr, 10
160b2a885a2SFlorian Hahn  %res = xor i1 %t.1, %t.2
161b2a885a2SFlorian Hahn  ret i1 %res
162b2a885a2SFlorian Hahn}
163b2a885a2SFlorian Hahn
164b2a885a2SFlorian Hahndefine i32 @propagate_info_from_predicate_through_freeze(i32 %x) {
165b2a885a2SFlorian Hahn; CHECK-LABEL: @propagate_info_from_predicate_through_freeze(
166b2a885a2SFlorian Hahn; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 10
167b2a885a2SFlorian Hahn; CHECK-NEXT:    [[X_FR:%.*]] = freeze i32 [[X]]
168b2a885a2SFlorian Hahn; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
169b2a885a2SFlorian Hahn; CHECK:       then:
170b2a885a2SFlorian Hahn; CHECK-NEXT:    [[ADD_1:%.*]] = add i32 [[X_FR]], 10
171b2a885a2SFlorian Hahn; CHECK-NEXT:    [[ADD_2:%.*]] = add i32 [[X_FR]], 1
172b2a885a2SFlorian Hahn; CHECK-NEXT:    ret i32 [[ADD_2]]
173b2a885a2SFlorian Hahn; CHECK:       else:
174b2a885a2SFlorian Hahn; CHECK-NEXT:    [[ADD_3:%.*]] = add i32 [[X_FR]], 1
175b2a885a2SFlorian Hahn; CHECK-NEXT:    ret i32 [[ADD_3]]
176b2a885a2SFlorian Hahn;
177b2a885a2SFlorian Hahn  %cmp = icmp eq i32 %x, 10
178b2a885a2SFlorian Hahn  %x.fr = freeze i32 %x
179b2a885a2SFlorian Hahn  br i1 %cmp, label %then, label %else
180b2a885a2SFlorian Hahn
181b2a885a2SFlorian Hahnthen:
182b2a885a2SFlorian Hahn  %add.1 = add i32 %x.fr, %x
183b2a885a2SFlorian Hahn  %add.2 = add i32 %x.fr, 1
184b2a885a2SFlorian Hahn  ret i32 %add.2
185b2a885a2SFlorian Hahn
186b2a885a2SFlorian Hahnelse:
187b2a885a2SFlorian Hahn  %add.3 = add i32 %x.fr, 1
188b2a885a2SFlorian Hahn  ret i32 %add.3
189b2a885a2SFlorian Hahn}
190