Skip to content

Commit be8c9e3

Browse files
committed
Merging r352707, r352714, r352886, r352892, r352895, r352908, r352917, r352935, r353213, r353733, and r353758
------------------------------------------------------------------------ r352707 | evandro | 2019-01-31 01:49:27 +0100 (Thu, 31 Jan 2019) | 1 line [InstCombine] Simplify check clauses in test (NFC) ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352714 | evandro | 2019-01-31 02:41:39 +0100 (Thu, 31 Jan 2019) | 3 lines [InstCombine] Expand testing for Windows (NFC) Added the checks to the existing cases when the target is Win64. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352886 | evandro | 2019-02-01 17:57:53 +0100 (Fri, 01 Feb 2019) | 1 line [InstCombine] Refactor test checks (NFC) ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352892 | evandro | 2019-02-01 18:39:48 +0100 (Fri, 01 Feb 2019) | 3 lines [InstCombine] Expand Windows test (NFC) Add checks for Win64 to existing cases. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352895 | evandro | 2019-02-01 19:34:20 +0100 (Fri, 01 Feb 2019) | 1 line [InstCombine] Refactor test checks (NFC) ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352908 | evandro | 2019-02-01 21:42:03 +0100 (Fri, 01 Feb 2019) | 3 lines [InstCombine] Expand Windows test (NFC) Run checks for Win64 as well. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352917 | evandro | 2019-02-01 22:14:10 +0100 (Fri, 01 Feb 2019) | 3 lines [InstCombine] Expand Windows test (NFC) Run checks for Win32 as well. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r352935 | evandro | 2019-02-01 23:52:05 +0100 (Fri, 01 Feb 2019) | 1 line [InstCombine] Refactor test checks (NFC) ------------------------------------------------------------------------ ------------------------------------------------------------------------ r353213 | evandro | 2019-02-05 21:24:21 +0100 (Tue, 05 Feb 2019) | 3 lines [TargetLibraryInfo] Regroup run time functions for Windows (NFC) Regroup supported and unsupported functions by precision and C standard. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r353733 | evandro | 2019-02-11 20:02:28 +0100 (Mon, 11 Feb 2019) | 8 lines [TargetLibraryInfo] Update run time support for Windows It seems that the run time for Windows has changed and supports more math functions than it used to, especially on AArch64, ARM, and AMD64. Fixes PR40541. Differential revision: https://reviews.llvm.org/D57625 ------------------------------------------------------------------------ ------------------------------------------------------------------------ r353758 | evandro | 2019-02-11 23:12:01 +0100 (Mon, 11 Feb 2019) | 6 lines [TargetLibraryInfo] Update run time support for Windows It seems that, since VC19, the `float` C99 math functions are supported for all targets, unlike the C89 ones. According to the discussion at https://reviews.llvm.org/D57625. ------------------------------------------------------------------------ llvm-svn: 353934
1 parent 33a2b52 commit be8c9e3

File tree

5 files changed

+724
-585
lines changed

5 files changed

+724
-585
lines changed

llvm/lib/Analysis/TargetLibraryInfo.cpp

Lines changed: 94 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -161,25 +161,66 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
161161
}
162162

163163
if (T.isOSWindows() && !T.isOSCygMing()) {
164-
// Win32 does not support long double
164+
// XXX: The earliest documentation available at the moment is for VS2015/VC19:
165+
// https://docs.microsoft.com/en-us/cpp/c-runtime-library/floating-point-support?view=vs-2015
166+
// XXX: In order to use an MSVCRT older than VC19,
167+
// the specific library version must be explicit in the target triple,
168+
// e.g., x86_64-pc-windows-msvc18.
169+
bool hasPartialC99 = true;
170+
if (T.isKnownWindowsMSVCEnvironment()) {
171+
unsigned Major, Minor, Micro;
172+
T.getEnvironmentVersion(Major, Minor, Micro);
173+
hasPartialC99 = (Major == 0 || Major >= 19);
174+
}
175+
176+
// Latest targets support C89 math functions, in part.
177+
bool isARM = (T.getArch() == Triple::aarch64 ||
178+
T.getArch() == Triple::arm);
179+
bool hasPartialFloat = (isARM ||
180+
T.getArch() == Triple::x86_64);
181+
182+
// Win32 does not support float C89 math functions, in general.
183+
if (!hasPartialFloat) {
184+
TLI.setUnavailable(LibFunc_acosf);
185+
TLI.setUnavailable(LibFunc_asinf);
186+
TLI.setUnavailable(LibFunc_atan2f);
187+
TLI.setUnavailable(LibFunc_atanf);
188+
TLI.setUnavailable(LibFunc_ceilf);
189+
TLI.setUnavailable(LibFunc_cosf);
190+
TLI.setUnavailable(LibFunc_coshf);
191+
TLI.setUnavailable(LibFunc_expf);
192+
TLI.setUnavailable(LibFunc_floorf);
193+
TLI.setUnavailable(LibFunc_fmodf);
194+
TLI.setUnavailable(LibFunc_log10f);
195+
TLI.setUnavailable(LibFunc_logf);
196+
TLI.setUnavailable(LibFunc_modff);
197+
TLI.setUnavailable(LibFunc_powf);
198+
TLI.setUnavailable(LibFunc_sinf);
199+
TLI.setUnavailable(LibFunc_sinhf);
200+
TLI.setUnavailable(LibFunc_sqrtf);
201+
TLI.setUnavailable(LibFunc_tanf);
202+
TLI.setUnavailable(LibFunc_tanhf);
203+
}
204+
if (!isARM)
205+
TLI.setUnavailable(LibFunc_fabsf);
206+
TLI.setUnavailable(LibFunc_frexpf);
207+
TLI.setUnavailable(LibFunc_ldexpf);
208+
209+
// Win32 does not support long double C89 math functions.
165210
TLI.setUnavailable(LibFunc_acosl);
166211
TLI.setUnavailable(LibFunc_asinl);
167-
TLI.setUnavailable(LibFunc_atanl);
168212
TLI.setUnavailable(LibFunc_atan2l);
213+
TLI.setUnavailable(LibFunc_atanl);
169214
TLI.setUnavailable(LibFunc_ceill);
170-
TLI.setUnavailable(LibFunc_copysignl);
171215
TLI.setUnavailable(LibFunc_cosl);
172216
TLI.setUnavailable(LibFunc_coshl);
173217
TLI.setUnavailable(LibFunc_expl);
174-
TLI.setUnavailable(LibFunc_fabsf); // Win32 and Win64 both lack fabsf
175218
TLI.setUnavailable(LibFunc_fabsl);
176219
TLI.setUnavailable(LibFunc_floorl);
177-
TLI.setUnavailable(LibFunc_fmaxl);
178-
TLI.setUnavailable(LibFunc_fminl);
179220
TLI.setUnavailable(LibFunc_fmodl);
180221
TLI.setUnavailable(LibFunc_frexpl);
181-
TLI.setUnavailable(LibFunc_ldexpf);
182222
TLI.setUnavailable(LibFunc_ldexpl);
223+
TLI.setUnavailable(LibFunc_log10l);
183224
TLI.setUnavailable(LibFunc_logl);
184225
TLI.setUnavailable(LibFunc_modfl);
185226
TLI.setUnavailable(LibFunc_powl);
@@ -189,81 +230,66 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
189230
TLI.setUnavailable(LibFunc_tanl);
190231
TLI.setUnavailable(LibFunc_tanhl);
191232

192-
// Win32 only has C89 math
193-
TLI.setUnavailable(LibFunc_acosh);
194-
TLI.setUnavailable(LibFunc_acoshf);
233+
// Win32 does not fully support C99 math functions.
234+
if (!hasPartialC99) {
235+
TLI.setUnavailable(LibFunc_acosh);
236+
TLI.setUnavailable(LibFunc_acoshf);
237+
TLI.setUnavailable(LibFunc_asinh);
238+
TLI.setUnavailable(LibFunc_asinhf);
239+
TLI.setUnavailable(LibFunc_atanh);
240+
TLI.setUnavailable(LibFunc_atanhf);
241+
TLI.setAvailableWithName(LibFunc_cabs, "_cabs");
242+
TLI.setUnavailable(LibFunc_cabsf);
243+
TLI.setUnavailable(LibFunc_cbrt);
244+
TLI.setUnavailable(LibFunc_cbrtf);
245+
TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
246+
TLI.setAvailableWithName(LibFunc_copysignf, "_copysignf");
247+
TLI.setUnavailable(LibFunc_exp2);
248+
TLI.setUnavailable(LibFunc_exp2f);
249+
TLI.setUnavailable(LibFunc_expm1);
250+
TLI.setUnavailable(LibFunc_expm1f);
251+
TLI.setUnavailable(LibFunc_fmax);
252+
TLI.setUnavailable(LibFunc_fmaxf);
253+
TLI.setUnavailable(LibFunc_fmin);
254+
TLI.setUnavailable(LibFunc_fminf);
255+
TLI.setUnavailable(LibFunc_log1p);
256+
TLI.setUnavailable(LibFunc_log1pf);
257+
TLI.setUnavailable(LibFunc_log2);
258+
TLI.setUnavailable(LibFunc_log2f);
259+
TLI.setAvailableWithName(LibFunc_logb, "_logb");
260+
if (hasPartialFloat)
261+
TLI.setAvailableWithName(LibFunc_logbf, "_logbf");
262+
else
263+
TLI.setUnavailable(LibFunc_logbf);
264+
TLI.setUnavailable(LibFunc_rint);
265+
TLI.setUnavailable(LibFunc_rintf);
266+
TLI.setUnavailable(LibFunc_round);
267+
TLI.setUnavailable(LibFunc_roundf);
268+
TLI.setUnavailable(LibFunc_trunc);
269+
TLI.setUnavailable(LibFunc_truncf);
270+
}
271+
272+
// Win32 does not support long double C99 math functions.
195273
TLI.setUnavailable(LibFunc_acoshl);
196-
TLI.setUnavailable(LibFunc_asinh);
197-
TLI.setUnavailable(LibFunc_asinhf);
198274
TLI.setUnavailable(LibFunc_asinhl);
199-
TLI.setUnavailable(LibFunc_atanh);
200-
TLI.setUnavailable(LibFunc_atanhf);
201275
TLI.setUnavailable(LibFunc_atanhl);
202-
TLI.setUnavailable(LibFunc_cabs);
203-
TLI.setUnavailable(LibFunc_cabsf);
204276
TLI.setUnavailable(LibFunc_cabsl);
205-
TLI.setUnavailable(LibFunc_cbrt);
206-
TLI.setUnavailable(LibFunc_cbrtf);
207277
TLI.setUnavailable(LibFunc_cbrtl);
208-
TLI.setUnavailable(LibFunc_exp2);
209-
TLI.setUnavailable(LibFunc_exp2f);
278+
TLI.setUnavailable(LibFunc_copysignl);
210279
TLI.setUnavailable(LibFunc_exp2l);
211-
TLI.setUnavailable(LibFunc_expm1);
212-
TLI.setUnavailable(LibFunc_expm1f);
213280
TLI.setUnavailable(LibFunc_expm1l);
214-
TLI.setUnavailable(LibFunc_log2);
215-
TLI.setUnavailable(LibFunc_log2f);
216-
TLI.setUnavailable(LibFunc_log2l);
217-
TLI.setUnavailable(LibFunc_log1p);
218-
TLI.setUnavailable(LibFunc_log1pf);
281+
TLI.setUnavailable(LibFunc_fmaxl);
282+
TLI.setUnavailable(LibFunc_fminl);
219283
TLI.setUnavailable(LibFunc_log1pl);
220-
TLI.setUnavailable(LibFunc_logb);
221-
TLI.setUnavailable(LibFunc_logbf);
284+
TLI.setUnavailable(LibFunc_log2l);
222285
TLI.setUnavailable(LibFunc_logbl);
223-
TLI.setUnavailable(LibFunc_nearbyint);
224-
TLI.setUnavailable(LibFunc_nearbyintf);
225286
TLI.setUnavailable(LibFunc_nearbyintl);
226-
TLI.setUnavailable(LibFunc_rint);
227-
TLI.setUnavailable(LibFunc_rintf);
228287
TLI.setUnavailable(LibFunc_rintl);
229-
TLI.setUnavailable(LibFunc_round);
230-
TLI.setUnavailable(LibFunc_roundf);
231288
TLI.setUnavailable(LibFunc_roundl);
232-
TLI.setUnavailable(LibFunc_trunc);
233-
TLI.setUnavailable(LibFunc_truncf);
234289
TLI.setUnavailable(LibFunc_truncl);
235290

236-
// Win32 provides some C99 math with mangled names
237-
TLI.setAvailableWithName(LibFunc_copysign, "_copysign");
238-
239-
if (T.getArch() == Triple::x86) {
240-
// Win32 on x86 implements single-precision math functions as macros
241-
TLI.setUnavailable(LibFunc_acosf);
242-
TLI.setUnavailable(LibFunc_asinf);
243-
TLI.setUnavailable(LibFunc_atanf);
244-
TLI.setUnavailable(LibFunc_atan2f);
245-
TLI.setUnavailable(LibFunc_ceilf);
246-
TLI.setUnavailable(LibFunc_copysignf);
247-
TLI.setUnavailable(LibFunc_cosf);
248-
TLI.setUnavailable(LibFunc_coshf);
249-
TLI.setUnavailable(LibFunc_expf);
250-
TLI.setUnavailable(LibFunc_floorf);
251-
TLI.setUnavailable(LibFunc_fminf);
252-
TLI.setUnavailable(LibFunc_fmaxf);
253-
TLI.setUnavailable(LibFunc_fmodf);
254-
TLI.setUnavailable(LibFunc_logf);
255-
TLI.setUnavailable(LibFunc_log10f);
256-
TLI.setUnavailable(LibFunc_modff);
257-
TLI.setUnavailable(LibFunc_powf);
258-
TLI.setUnavailable(LibFunc_sinf);
259-
TLI.setUnavailable(LibFunc_sinhf);
260-
TLI.setUnavailable(LibFunc_sqrtf);
261-
TLI.setUnavailable(LibFunc_tanf);
262-
TLI.setUnavailable(LibFunc_tanhf);
263-
}
264-
265-
// Win32 does *not* provide these functions, but they are
266-
// generally available on POSIX-compliant systems:
291+
// Win32 does not support these functions, but
292+
// they are generally available on POSIX-compliant systems.
267293
TLI.setUnavailable(LibFunc_access);
268294
TLI.setUnavailable(LibFunc_bcmp);
269295
TLI.setUnavailable(LibFunc_bcopy);
@@ -318,12 +344,6 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
318344
TLI.setUnavailable(LibFunc_utime);
319345
TLI.setUnavailable(LibFunc_utimes);
320346
TLI.setUnavailable(LibFunc_write);
321-
322-
// Win32 does *not* provide provide these functions, but they are
323-
// specified by C99:
324-
TLI.setUnavailable(LibFunc_atoll);
325-
TLI.setUnavailable(LibFunc_frexpf);
326-
TLI.setUnavailable(LibFunc_llabs);
327347
}
328348

329349
switch (T.getOS()) {

0 commit comments

Comments
 (0)