Skip to content

LLVM incorrectly assumes long double is the same type as _Float128 on ppc64le #100296

@programmerjake

Description

@programmerjake
/build/source/llvm/llvm/lib/Analysis/ConstantFolding.cpp:2129:34: error: invalid conversion from '_Float128 (*)(_Float128) noexcept' to 'long double (*)(long double)' [-fpermissive]
 2129 |         return ConstantFoldFP128(logf128, Op->getValueAPF(), Ty);
      |                                  ^~~~~~~
      |                                  |
      |                                  _Float128 (*)(_Float128) noexcept
/build/source/llvm/llvm/lib/Analysis/ConstantFolding.cpp:1787:43: note:   initializing argument 1 of 'llvm::Constant* {anonymous}::ConstantFoldFP128(long double (*)(long double), const llvm::APFloat&, llvm::Type*)'
 1787 | Constant *ConstantFoldFP128(long double (*NativeFP)(long double),
      |                             ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~

ConstantFoldFP128's definition:

#if defined(HAS_IEE754_FLOAT128) && defined(HAS_LOGF128)
Constant *ConstantFoldFP128(long double (*NativeFP)(long double),
const APFloat &V, Type *Ty) {
llvm_fenv_clearexcept();
float128 Result = NativeFP(V.convertToQuad());
if (llvm_fenv_testexcept()) {
llvm_fenv_clearexcept();
return nullptr;
}
return GetConstantFoldFPValue128(Result, Ty);
}
#endif

Where it's called with mismatched types:

return ConstantFoldFP128(logf128, Op->getValueAPF(), Ty);

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions