Skip to content

Commit 33520e7

Browse files
author
git apple-llvm automerger
committed
Merge commit '5e36281480bc' from apple/master into swift/master-next
2 parents ff2338d + 5e36281 commit 33520e7

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed

llvm/test/Transforms/InstSimplify/fcmp-select.ll

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,162 @@ define double @une_swapped(double %x) {
4848
ret double %cond
4949
}
5050

51+
; X == 0.0 ? X : 0.0 --> ? (X could be -0.0)
52+
53+
define double @oeq_zero(double %x) {
54+
; CHECK-LABEL: @oeq_zero(
55+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[X:%.*]], 0.000000e+00
56+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], double [[X]], double 0.000000e+00
57+
; CHECK-NEXT: ret double [[COND]]
58+
;
59+
%cmp = fcmp oeq double %x, 0.0
60+
%cond = select i1 %cmp, double %x, double 0.0
61+
ret double %cond
62+
}
63+
64+
; X == 0.0 ? 0.0 : X --> ? (change sign if X is -0.0)
65+
66+
define float @oeq_zero_swapped(float %x) {
67+
; CHECK-LABEL: @oeq_zero_swapped(
68+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
69+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], float 0.000000e+00, float [[X]]
70+
; CHECK-NEXT: ret float [[COND]]
71+
;
72+
%cmp = fcmp oeq float %x, 0.0
73+
%cond = select i1 %cmp, float 0.0, float %x
74+
ret float %cond
75+
}
76+
77+
; X != 0.0 ? X : -0.0 --> ? (change sign if X is 0.0)
78+
79+
define double @une_zero(double %x) {
80+
; CHECK-LABEL: @une_zero(
81+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
82+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], double [[X]], double -0.000000e+00
83+
; CHECK-NEXT: ret double [[COND]]
84+
;
85+
%cmp = fcmp une double %x, 0.0
86+
%cond = select i1 %cmp, double %x, double -0.0
87+
ret double %cond
88+
}
89+
90+
; X != 0.0 ? -0.0 : X --> ? (X could be 0.0)
91+
92+
define double @une_zero_swapped(double %x) {
93+
; CHECK-LABEL: @une_zero_swapped(
94+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
95+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], double -0.000000e+00, double [[X]]
96+
; CHECK-NEXT: ret double [[COND]]
97+
;
98+
%cmp = fcmp une double %x, 0.0
99+
%cond = select i1 %cmp, double -0.0, double %x
100+
ret double %cond
101+
}
102+
103+
; X == 0.0 ? X : 0.0 --> 0.0
104+
105+
define double @oeq_zero_nsz(double %x) {
106+
; CHECK-LABEL: @oeq_zero_nsz(
107+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[X:%.*]], 0.000000e+00
108+
; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double 0.000000e+00
109+
; CHECK-NEXT: ret double [[COND]]
110+
;
111+
%cmp = fcmp oeq double %x, 0.0
112+
%cond = select nsz i1 %cmp, double %x, double 0.0
113+
ret double %cond
114+
}
115+
116+
; X == 0.0 ? 0.0 : X --> X
117+
118+
define float @oeq_zero_swapped_nsz(float %x) {
119+
; CHECK-LABEL: @oeq_zero_swapped_nsz(
120+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
121+
; CHECK-NEXT: [[COND:%.*]] = select fast i1 [[CMP]], float 0.000000e+00, float [[X]]
122+
; CHECK-NEXT: ret float [[COND]]
123+
;
124+
%cmp = fcmp oeq float %x, 0.0
125+
%cond = select fast i1 %cmp, float 0.0, float %x
126+
ret float %cond
127+
}
128+
129+
; X != 0.0 ? X : -0.0 --> X
130+
131+
define double @une_zero_nsz(double %x) {
132+
; CHECK-LABEL: @une_zero_nsz(
133+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
134+
; CHECK-NEXT: [[COND:%.*]] = select ninf nsz i1 [[CMP]], double [[X]], double -0.000000e+00
135+
; CHECK-NEXT: ret double [[COND]]
136+
;
137+
%cmp = fcmp une double %x, 0.0
138+
%cond = select nsz ninf i1 %cmp, double %x, double -0.0
139+
ret double %cond
140+
}
141+
142+
; X != 0.0 ? -0.0 : X --> 0.0
143+
144+
define <2 x double> @une_zero_swapped_nsz(<2 x double> %x) {
145+
; CHECK-LABEL: @une_zero_swapped_nsz(
146+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une <2 x double> [[X:%.*]], <double -0.000000e+00, double 0.000000e+00>
147+
; CHECK-NEXT: [[COND:%.*]] = select nsz <2 x i1> [[CMP]], <2 x double> <double 0.000000e+00, double -0.000000e+00>, <2 x double> [[X]]
148+
; CHECK-NEXT: ret <2 x double> [[COND]]
149+
;
150+
%cmp = fcmp une <2 x double> %x, <double -0.0, double 0.0>
151+
%cond = select nsz <2 x i1> %cmp, <2 x double> <double 0.0, double -0.0>, <2 x double> %x
152+
ret <2 x double> %cond
153+
}
154+
155+
; X == Y ? X : Y --> Y
156+
157+
define double @oeq_nsz(double %x, double %y) {
158+
; CHECK-LABEL: @oeq_nsz(
159+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[X:%.*]], [[Y:%.*]]
160+
; CHECK-NEXT: [[COND:%.*]] = select fast i1 [[CMP]], double [[X]], double [[Y]]
161+
; CHECK-NEXT: ret double [[COND]]
162+
;
163+
%cmp = fcmp oeq double %x, %y
164+
%cond = select fast i1 %cmp, double %x, double %y
165+
ret double %cond
166+
}
167+
168+
; X == Y ? Y : X --> X
169+
170+
define <2 x float> @oeq_swapped_nsz(<2 x float> %x, <2 x float> %y) {
171+
; CHECK-LABEL: @oeq_swapped_nsz(
172+
; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq <2 x float> [[X:%.*]], [[Y:%.*]]
173+
; CHECK-NEXT: [[COND:%.*]] = select nnan nsz <2 x i1> [[CMP]], <2 x float> [[Y]], <2 x float> [[X]]
174+
; CHECK-NEXT: ret <2 x float> [[COND]]
175+
;
176+
%cmp = fcmp oeq <2 x float> %x, %y
177+
%cond = select nsz nnan <2 x i1> %cmp, <2 x float> %y, <2 x float> %x
178+
ret <2 x float> %cond
179+
}
180+
181+
; X != Y ? X : Y --> X
182+
183+
define double @une_nsz(double %x, double %y) {
184+
; CHECK-LABEL: @une_nsz(
185+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], [[Y:%.*]]
186+
; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[Y]]
187+
; CHECK-NEXT: ret double [[COND]]
188+
;
189+
%cmp = fcmp une double %x, %y
190+
%cond = select nsz i1 %cmp, double %x, double %y
191+
ret double %cond
192+
}
193+
194+
; X != Y ? Y : X --> Y
195+
196+
define <2 x double> @une_swapped_nsz(<2 x double> %x, <2 x double> %y) {
197+
; CHECK-LABEL: @une_swapped_nsz(
198+
; CHECK-NEXT: [[CMP:%.*]] = fcmp une <2 x double> [[X:%.*]], [[Y:%.*]]
199+
; CHECK-NEXT: [[COND:%.*]] = select fast <2 x i1> [[CMP]], <2 x double> [[Y]], <2 x double> [[X]]
200+
; CHECK-NEXT: ret <2 x double> [[COND]]
201+
;
202+
%cmp = fcmp une <2 x double> %x, %y
203+
%cond = select fast <2 x i1> %cmp, <2 x double> %y, <2 x double> %x
204+
ret <2 x double> %cond
205+
}
206+
51207
define double @une_could_be_negzero(double %x, double %y) {
52208
; CHECK-LABEL: @une_could_be_negzero(
53209
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], [[Y:%.*]]

0 commit comments

Comments
 (0)