Skip to content

Commit 9364dee

Browse files
committed
[IR] Add an xpassing test for f128 intrinsic lowering
`f128` intrinsic functions lower to incorrect libc calls. Add a test showing current behavior. [IR] Correct lowering of `f128` intrinsics Change the lowering of 128-bit floating point math function intrinsics to use binary128 functions (`sqrtf128`) rather than `long double` functions (`sqrtl`). Currently intrinsic calls such as `@llvm.sqrt.f128` are lowered to libc's `long double` functions. On platforms where `long double` is not `fp128`, this results in incorrect math. define fp128 @test_sqrt(fp128 %a) { start: %0 = tail call fp128 @llvm.sqrt.f128(fp128 %a) ret fp128 %0 } declare fp128 @llvm.sqrt.f128(fp128) lowers to test_sqrt: # @test_sqrt jmp sqrtl@PLT # TAILCALL On x86 this results in the binary128 argument being treated as 80-bit extended precision. This has no effect on clang, which lowers builtins to the libc calls directly without going through LLVM intrinsics. Fixes llvm#44744 Differential Revision: https://reviews.llvm.org/D157836
1 parent 037eb83 commit 9364dee

File tree

2 files changed

+80
-81
lines changed

2 files changed

+80
-81
lines changed

llvm/include/llvm/IR/RuntimeLibcalls.def

+34-34
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ HANDLE_LIBCALL(DIV_PPCF128, "__gcc_qdiv")
110110
HANDLE_LIBCALL(REM_F32, "fmodf")
111111
HANDLE_LIBCALL(REM_F64, "fmod")
112112
HANDLE_LIBCALL(REM_F80, "fmodl")
113-
HANDLE_LIBCALL(REM_F128, "fmodl")
113+
HANDLE_LIBCALL(REM_F128, "fmodf128")
114114
HANDLE_LIBCALL(REM_PPCF128, "fmodl")
115115
HANDLE_LIBCALL(FMA_F32, "fmaf")
116116
HANDLE_LIBCALL(FMA_F64, "fma")
117117
HANDLE_LIBCALL(FMA_F80, "fmal")
118-
HANDLE_LIBCALL(FMA_F128, "fmal")
118+
HANDLE_LIBCALL(FMA_F128, "fmaf128")
119119
HANDLE_LIBCALL(FMA_PPCF128, "fmal")
120120
HANDLE_LIBCALL(POWI_F32, "__powisf2")
121121
HANDLE_LIBCALL(POWI_F64, "__powidf2")
@@ -125,72 +125,72 @@ HANDLE_LIBCALL(POWI_PPCF128, "__powitf2")
125125
HANDLE_LIBCALL(SQRT_F32, "sqrtf")
126126
HANDLE_LIBCALL(SQRT_F64, "sqrt")
127127
HANDLE_LIBCALL(SQRT_F80, "sqrtl")
128-
HANDLE_LIBCALL(SQRT_F128, "sqrtl")
128+
HANDLE_LIBCALL(SQRT_F128, "sqrtf128")
129129
HANDLE_LIBCALL(SQRT_PPCF128, "sqrtl")
130130
HANDLE_LIBCALL(CBRT_F32, "cbrtf")
131131
HANDLE_LIBCALL(CBRT_F64, "cbrt")
132132
HANDLE_LIBCALL(CBRT_F80, "cbrtl")
133-
HANDLE_LIBCALL(CBRT_F128, "cbrtl")
133+
HANDLE_LIBCALL(CBRT_F128, "cbrtf128")
134134
HANDLE_LIBCALL(CBRT_PPCF128, "cbrtl")
135135
HANDLE_LIBCALL(LOG_F32, "logf")
136136
HANDLE_LIBCALL(LOG_F64, "log")
137137
HANDLE_LIBCALL(LOG_F80, "logl")
138-
HANDLE_LIBCALL(LOG_F128, "logl")
138+
HANDLE_LIBCALL(LOG_F128, "logf128")
139139
HANDLE_LIBCALL(LOG_PPCF128, "logl")
140140
HANDLE_LIBCALL(LOG_FINITE_F32, "__logf_finite")
141141
HANDLE_LIBCALL(LOG_FINITE_F64, "__log_finite")
142142
HANDLE_LIBCALL(LOG_FINITE_F80, "__logl_finite")
143-
HANDLE_LIBCALL(LOG_FINITE_F128, "__logl_finite")
143+
HANDLE_LIBCALL(LOG_FINITE_F128, "__logf128_finite")
144144
HANDLE_LIBCALL(LOG_FINITE_PPCF128, "__logl_finite")
145145
HANDLE_LIBCALL(LOG2_F32, "log2f")
146146
HANDLE_LIBCALL(LOG2_F64, "log2")
147147
HANDLE_LIBCALL(LOG2_F80, "log2l")
148-
HANDLE_LIBCALL(LOG2_F128, "log2l")
148+
HANDLE_LIBCALL(LOG2_F128, "log2f128")
149149
HANDLE_LIBCALL(LOG2_PPCF128, "log2l")
150150
HANDLE_LIBCALL(LOG2_FINITE_F32, "__log2f_finite")
151151
HANDLE_LIBCALL(LOG2_FINITE_F64, "__log2_finite")
152152
HANDLE_LIBCALL(LOG2_FINITE_F80, "__log2l_finite")
153-
HANDLE_LIBCALL(LOG2_FINITE_F128, "__log2l_finite")
153+
HANDLE_LIBCALL(LOG2_FINITE_F128, "__log2f128_finite")
154154
HANDLE_LIBCALL(LOG2_FINITE_PPCF128, "__log2l_finite")
155155
HANDLE_LIBCALL(LOG10_F32, "log10f")
156156
HANDLE_LIBCALL(LOG10_F64, "log10")
157157
HANDLE_LIBCALL(LOG10_F80, "log10l")
158-
HANDLE_LIBCALL(LOG10_F128, "log10l")
158+
HANDLE_LIBCALL(LOG10_F128, "log10f128")
159159
HANDLE_LIBCALL(LOG10_PPCF128, "log10l")
160160
HANDLE_LIBCALL(LOG10_FINITE_F32, "__log10f_finite")
161161
HANDLE_LIBCALL(LOG10_FINITE_F64, "__log10_finite")
162162
HANDLE_LIBCALL(LOG10_FINITE_F80, "__log10l_finite")
163-
HANDLE_LIBCALL(LOG10_FINITE_F128, "__log10l_finite")
163+
HANDLE_LIBCALL(LOG10_FINITE_F128, "__log10f128_finite")
164164
HANDLE_LIBCALL(LOG10_FINITE_PPCF128, "__log10l_finite")
165165
HANDLE_LIBCALL(EXP_F32, "expf")
166166
HANDLE_LIBCALL(EXP_F64, "exp")
167167
HANDLE_LIBCALL(EXP_F80, "expl")
168-
HANDLE_LIBCALL(EXP_F128, "expl")
168+
HANDLE_LIBCALL(EXP_F128, "expf128")
169169
HANDLE_LIBCALL(EXP_PPCF128, "expl")
170170
HANDLE_LIBCALL(EXP_FINITE_F32, "__expf_finite")
171171
HANDLE_LIBCALL(EXP_FINITE_F64, "__exp_finite")
172172
HANDLE_LIBCALL(EXP_FINITE_F80, "__expl_finite")
173-
HANDLE_LIBCALL(EXP_FINITE_F128, "__expl_finite")
173+
HANDLE_LIBCALL(EXP_FINITE_F128, "__expf128_finite")
174174
HANDLE_LIBCALL(EXP_FINITE_PPCF128, "__expl_finite")
175175
HANDLE_LIBCALL(EXP2_F32, "exp2f")
176176
HANDLE_LIBCALL(EXP2_F64, "exp2")
177177
HANDLE_LIBCALL(EXP2_F80, "exp2l")
178-
HANDLE_LIBCALL(EXP2_F128, "exp2l")
178+
HANDLE_LIBCALL(EXP2_F128, "exp2f128")
179179
HANDLE_LIBCALL(EXP2_PPCF128, "exp2l")
180180
HANDLE_LIBCALL(EXP2_FINITE_F32, "__exp2f_finite")
181181
HANDLE_LIBCALL(EXP2_FINITE_F64, "__exp2_finite")
182182
HANDLE_LIBCALL(EXP2_FINITE_F80, "__exp2l_finite")
183-
HANDLE_LIBCALL(EXP2_FINITE_F128, "__exp2l_finite")
183+
HANDLE_LIBCALL(EXP2_FINITE_F128, "__exp2f128_finite")
184184
HANDLE_LIBCALL(EXP2_FINITE_PPCF128, "__exp2l_finite")
185185
HANDLE_LIBCALL(SIN_F32, "sinf")
186186
HANDLE_LIBCALL(SIN_F64, "sin")
187187
HANDLE_LIBCALL(SIN_F80, "sinl")
188-
HANDLE_LIBCALL(SIN_F128, "sinl")
188+
HANDLE_LIBCALL(SIN_F128, "sinf128")
189189
HANDLE_LIBCALL(SIN_PPCF128, "sinl")
190190
HANDLE_LIBCALL(COS_F32, "cosf")
191191
HANDLE_LIBCALL(COS_F64, "cos")
192192
HANDLE_LIBCALL(COS_F80, "cosl")
193-
HANDLE_LIBCALL(COS_F128, "cosl")
193+
HANDLE_LIBCALL(COS_F128, "cosf128")
194194
HANDLE_LIBCALL(COS_PPCF128, "cosl")
195195
HANDLE_LIBCALL(SINCOS_F32, nullptr)
196196
HANDLE_LIBCALL(SINCOS_F64, nullptr)
@@ -202,92 +202,92 @@ HANDLE_LIBCALL(SINCOS_STRET_F64, nullptr)
202202
HANDLE_LIBCALL(POW_F32, "powf")
203203
HANDLE_LIBCALL(POW_F64, "pow")
204204
HANDLE_LIBCALL(POW_F80, "powl")
205-
HANDLE_LIBCALL(POW_F128, "powl")
205+
HANDLE_LIBCALL(POW_F128, "powf128")
206206
HANDLE_LIBCALL(POW_PPCF128, "powl")
207207
HANDLE_LIBCALL(POW_FINITE_F32, "__powf_finite")
208208
HANDLE_LIBCALL(POW_FINITE_F64, "__pow_finite")
209209
HANDLE_LIBCALL(POW_FINITE_F80, "__powl_finite")
210-
HANDLE_LIBCALL(POW_FINITE_F128, "__powl_finite")
210+
HANDLE_LIBCALL(POW_FINITE_F128, "__powf128_finite")
211211
HANDLE_LIBCALL(POW_FINITE_PPCF128, "__powl_finite")
212212
HANDLE_LIBCALL(CEIL_F32, "ceilf")
213213
HANDLE_LIBCALL(CEIL_F64, "ceil")
214214
HANDLE_LIBCALL(CEIL_F80, "ceill")
215-
HANDLE_LIBCALL(CEIL_F128, "ceill")
215+
HANDLE_LIBCALL(CEIL_F128, "ceilf128")
216216
HANDLE_LIBCALL(CEIL_PPCF128, "ceill")
217217
HANDLE_LIBCALL(TRUNC_F32, "truncf")
218218
HANDLE_LIBCALL(TRUNC_F64, "trunc")
219219
HANDLE_LIBCALL(TRUNC_F80, "truncl")
220-
HANDLE_LIBCALL(TRUNC_F128, "truncl")
220+
HANDLE_LIBCALL(TRUNC_F128, "truncf128")
221221
HANDLE_LIBCALL(TRUNC_PPCF128, "truncl")
222222
HANDLE_LIBCALL(RINT_F32, "rintf")
223223
HANDLE_LIBCALL(RINT_F64, "rint")
224224
HANDLE_LIBCALL(RINT_F80, "rintl")
225-
HANDLE_LIBCALL(RINT_F128, "rintl")
225+
HANDLE_LIBCALL(RINT_F128, "rintf128")
226226
HANDLE_LIBCALL(RINT_PPCF128, "rintl")
227227
HANDLE_LIBCALL(NEARBYINT_F32, "nearbyintf")
228228
HANDLE_LIBCALL(NEARBYINT_F64, "nearbyint")
229229
HANDLE_LIBCALL(NEARBYINT_F80, "nearbyintl")
230-
HANDLE_LIBCALL(NEARBYINT_F128, "nearbyintl")
230+
HANDLE_LIBCALL(NEARBYINT_F128, "nearbyintf128")
231231
HANDLE_LIBCALL(NEARBYINT_PPCF128, "nearbyintl")
232232
HANDLE_LIBCALL(ROUND_F32, "roundf")
233233
HANDLE_LIBCALL(ROUND_F64, "round")
234234
HANDLE_LIBCALL(ROUND_F80, "roundl")
235-
HANDLE_LIBCALL(ROUND_F128, "roundl")
235+
HANDLE_LIBCALL(ROUND_F128, "roundf128")
236236
HANDLE_LIBCALL(ROUND_PPCF128, "roundl")
237237
HANDLE_LIBCALL(ROUNDEVEN_F32, "roundevenf")
238238
HANDLE_LIBCALL(ROUNDEVEN_F64, "roundeven")
239239
HANDLE_LIBCALL(ROUNDEVEN_F80, "roundevenl")
240-
HANDLE_LIBCALL(ROUNDEVEN_F128, "roundevenl")
240+
HANDLE_LIBCALL(ROUNDEVEN_F128, "roundevenf128")
241241
HANDLE_LIBCALL(ROUNDEVEN_PPCF128, "roundevenl")
242242
HANDLE_LIBCALL(FLOOR_F32, "floorf")
243243
HANDLE_LIBCALL(FLOOR_F64, "floor")
244244
HANDLE_LIBCALL(FLOOR_F80, "floorl")
245-
HANDLE_LIBCALL(FLOOR_F128, "floorl")
245+
HANDLE_LIBCALL(FLOOR_F128, "floorf128")
246246
HANDLE_LIBCALL(FLOOR_PPCF128, "floorl")
247247
HANDLE_LIBCALL(COPYSIGN_F32, "copysignf")
248248
HANDLE_LIBCALL(COPYSIGN_F64, "copysign")
249249
HANDLE_LIBCALL(COPYSIGN_F80, "copysignl")
250-
HANDLE_LIBCALL(COPYSIGN_F128, "copysignl")
250+
HANDLE_LIBCALL(COPYSIGN_F128, "copysignf128")
251251
HANDLE_LIBCALL(COPYSIGN_PPCF128, "copysignl")
252252
HANDLE_LIBCALL(FMIN_F32, "fminf")
253253
HANDLE_LIBCALL(FMIN_F64, "fmin")
254254
HANDLE_LIBCALL(FMIN_F80, "fminl")
255-
HANDLE_LIBCALL(FMIN_F128, "fminl")
255+
HANDLE_LIBCALL(FMIN_F128, "fminf128")
256256
HANDLE_LIBCALL(FMIN_PPCF128, "fminl")
257257
HANDLE_LIBCALL(FMAX_F32, "fmaxf")
258258
HANDLE_LIBCALL(FMAX_F64, "fmax")
259259
HANDLE_LIBCALL(FMAX_F80, "fmaxl")
260-
HANDLE_LIBCALL(FMAX_F128, "fmaxl")
260+
HANDLE_LIBCALL(FMAX_F128, "fmaxf128")
261261
HANDLE_LIBCALL(FMAX_PPCF128, "fmaxl")
262262
HANDLE_LIBCALL(LROUND_F32, "lroundf")
263263
HANDLE_LIBCALL(LROUND_F64, "lround")
264264
HANDLE_LIBCALL(LROUND_F80, "lroundl")
265-
HANDLE_LIBCALL(LROUND_F128, "lroundl")
265+
HANDLE_LIBCALL(LROUND_F128, "lroundf128")
266266
HANDLE_LIBCALL(LROUND_PPCF128, "lroundl")
267267
HANDLE_LIBCALL(LLROUND_F32, "llroundf")
268268
HANDLE_LIBCALL(LLROUND_F64, "llround")
269269
HANDLE_LIBCALL(LLROUND_F80, "llroundl")
270-
HANDLE_LIBCALL(LLROUND_F128, "llroundl")
270+
HANDLE_LIBCALL(LLROUND_F128, "llroundf128")
271271
HANDLE_LIBCALL(LLROUND_PPCF128, "llroundl")
272272
HANDLE_LIBCALL(LRINT_F32, "lrintf")
273273
HANDLE_LIBCALL(LRINT_F64, "lrint")
274274
HANDLE_LIBCALL(LRINT_F80, "lrintl")
275-
HANDLE_LIBCALL(LRINT_F128, "lrintl")
275+
HANDLE_LIBCALL(LRINT_F128, "lrintf128")
276276
HANDLE_LIBCALL(LRINT_PPCF128, "lrintl")
277277
HANDLE_LIBCALL(LLRINT_F32, "llrintf")
278278
HANDLE_LIBCALL(LLRINT_F64, "llrint")
279279
HANDLE_LIBCALL(LLRINT_F80, "llrintl")
280-
HANDLE_LIBCALL(LLRINT_F128, "llrintl")
280+
HANDLE_LIBCALL(LLRINT_F128, "llrintf128")
281281
HANDLE_LIBCALL(LLRINT_PPCF128, "llrintl")
282282
HANDLE_LIBCALL(LDEXP_F32, "ldexpf")
283283
HANDLE_LIBCALL(LDEXP_F64, "ldexp")
284284
HANDLE_LIBCALL(LDEXP_F80, "ldexpl")
285-
HANDLE_LIBCALL(LDEXP_F128, "ldexpl")
285+
HANDLE_LIBCALL(LDEXP_F128, "ldexpf128")
286286
HANDLE_LIBCALL(LDEXP_PPCF128, "ldexpl")
287287
HANDLE_LIBCALL(FREXP_F32, "frexpf")
288288
HANDLE_LIBCALL(FREXP_F64, "frexp")
289289
HANDLE_LIBCALL(FREXP_F80, "frexpl")
290-
HANDLE_LIBCALL(FREXP_F128, "frexpl")
290+
HANDLE_LIBCALL(FREXP_F128, "frexpf128")
291291
HANDLE_LIBCALL(FREXP_PPCF128, "frexpl")
292292

293293
// Floating point environment

0 commit comments

Comments
 (0)