blob: dd8c1b7671f6ef0925733110b1b756ebf3f460af [file] [log] [blame]
Philip Reames7c78ef72015-05-22 23:53:24 +00001; RUN: opt -early-cse -S < %s | FileCheck %s
Geoff Berry8d846052016-08-31 19:24:10 +00002; RUN: opt -basicaa -early-cse-memssa -S < %s | FileCheck %s
Philip Reames7c78ef72015-05-22 23:53:24 +00003; Same as GVN/edge.ll, but updated to reflect EarlyCSE's less powerful
Philip Reames6bbe9742015-05-23 00:05:43 +00004; implementation. EarlyCSE currently doesn't exploit equality comparisons
5; against constants.
Philip Reames7c78ef72015-05-22 23:53:24 +00006
7define i32 @f1(i32 %x) {
8 ; CHECK-LABEL: define i32 @f1(
9bb0:
10 %cmp = icmp eq i32 %x, 0
11 br i1 %cmp, label %bb2, label %bb1
12bb1:
13 br label %bb2
14bb2:
15 %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
16 %foo = add i32 %cond, %x
17 ret i32 %foo
18 ; CHECK: bb2:
19 ; CHECK: %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
20}
21
22define i32 @f2(i32 %x) {
23 ; CHECK-LABEL: define i32 @f2(
24bb0:
25 %cmp = icmp ne i32 %x, 0
26 br i1 %cmp, label %bb1, label %bb2
27bb1:
28 br label %bb2
29bb2:
30 %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
31 %foo = add i32 %cond, %x
32 ret i32 %foo
33 ; CHECK: bb2:
34 ; CHECK: %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
35}
36
37define i32 @f3(i32 %x) {
38 ; CHECK-LABEL: define i32 @f3(
39bb0:
40 switch i32 %x, label %bb1 [ i32 0, label %bb2]
41bb1:
42 br label %bb2
43bb2:
44 %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
45 %foo = add i32 %cond, %x
46 ret i32 %foo
47 ; CHECK: bb2:
48 ; CHECK: %cond = phi i32 [ %x, %bb0 ], [ 0, %bb1 ]
49}
50
51declare void @g(i1)
52define void @f4(i8 * %x) {
53; CHECK-LABEL: define void @f4(
54bb0:
55 %y = icmp eq i8* null, %x
56 br i1 %y, label %bb2, label %bb1
57bb1:
58 br label %bb2
59bb2:
60 %zed = icmp eq i8* null, %x
61 call void @g(i1 %zed)
62; CHECK: call void @g(i1 %y)
63 ret void
64}
65
66define double @fcmp_oeq_not_zero(double %x, double %y) {
67entry:
68 %cmp = fcmp oeq double %y, 2.0
69 br i1 %cmp, label %if, label %return
70
71if:
72 %div = fdiv double %x, %y
73 br label %return
74
75return:
76 %retval = phi double [ %div, %if ], [ %x, %entry ]
77 ret double %retval
78
79; CHECK-LABEL: define double @fcmp_oeq_not_zero(
80; CHECK: %div = fdiv double %x, %y
81}
82
83define double @fcmp_une_not_zero(double %x, double %y) {
84entry:
85 %cmp = fcmp une double %y, 2.0
86 br i1 %cmp, label %return, label %else
87
88else:
89 %div = fdiv double %x, %y
90 br label %return
91
92return:
93 %retval = phi double [ %div, %else ], [ %x, %entry ]
94 ret double %retval
95
96; CHECK-LABEL: define double @fcmp_une_not_zero(
97; CHECK: %div = fdiv double %x, %y
98}
99
100; PR22376 - We can't propagate zero constants because -0.0
101; compares equal to 0.0. If %y is -0.0 in this test case,
102; we would produce the wrong sign on the infinity return value.
103define double @fcmp_oeq_zero(double %x, double %y) {
104entry:
105 %cmp = fcmp oeq double %y, 0.0
106 br i1 %cmp, label %if, label %return
107
108if:
109 %div = fdiv double %x, %y
110 br label %return
111
112return:
113 %retval = phi double [ %div, %if ], [ %x, %entry ]
114 ret double %retval
115
116; CHECK-LABEL: define double @fcmp_oeq_zero(
117; CHECK: %div = fdiv double %x, %y
118}
119
120define double @fcmp_une_zero(double %x, double %y) {
121entry:
122 %cmp = fcmp une double %y, -0.0
123 br i1 %cmp, label %return, label %else
124
125else:
126 %div = fdiv double %x, %y
127 br label %return
128
129return:
130 %retval = phi double [ %div, %else ], [ %x, %entry ]
131 ret double %retval
132
133; CHECK-LABEL: define double @fcmp_une_zero(
134; CHECK: %div = fdiv double %x, %y
135}
136
137; We also cannot propagate a value if it's not a constant.
138; This is because the value could be 0.0 or -0.0.
139
140define double @fcmp_oeq_maybe_zero(double %x, double %y, double %z1, double %z2) {
141entry:
142 %z = fadd double %z1, %z2
143 %cmp = fcmp oeq double %y, %z
144 br i1 %cmp, label %if, label %return
145
146if:
147 %div = fdiv double %x, %z
148 br label %return
149
150return:
151 %retval = phi double [ %div, %if ], [ %x, %entry ]
152 ret double %retval
153
154; CHECK-LABEL: define double @fcmp_oeq_maybe_zero(
155; CHECK: %div = fdiv double %x, %z
156}
157
158define double @fcmp_une_maybe_zero(double %x, double %y, double %z1, double %z2) {
159entry:
160 %z = fadd double %z1, %z2
161 %cmp = fcmp une double %y, %z
162 br i1 %cmp, label %return, label %else
163
164else:
165 %div = fdiv double %x, %z
166 br label %return
167
168return:
169 %retval = phi double [ %div, %else ], [ %x, %entry ]
170 ret double %retval
171
172; CHECK-LABEL: define double @fcmp_une_maybe_zero(
173; CHECK: %div = fdiv double %x, %z
174}