diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2024-02-22 15:25:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-22 15:25:17 +0100 |
commit | d3f6dd6585f4866a38a794b80db55a62c1050c77 (patch) | |
tree | 87503c7f9414663231db4d1966fdda1dfc9a814e /llvm/lib/IR/Instructions.cpp | |
parent | 88e31f64a034ec6dead2106016ee5b797674edb0 (diff) | |
download | llvm-d3f6dd6585f4866a38a794b80db55a62c1050c77.zip llvm-d3f6dd6585f4866a38a794b80db55a62c1050c77.tar.gz llvm-d3f6dd6585f4866a38a794b80db55a62c1050c77.tar.bz2 |
[InstCombine] Pick bfloat over half when shrinking ops that started with an fpext from bfloat (#82493)
This fixes the case where we would shrink an frem to half and then
bitcast to bfloat, producing invalid results. The transformation was
written under the assumption that there is only one type with a given
bit width.
Also add a strategic assert to CastInst::CreateFPCast to turn this
miscompilation into a crash.
Diffstat (limited to 'llvm/lib/IR/Instructions.cpp')
-rw-r--r-- | llvm/lib/IR/Instructions.cpp | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index ce0df53..fc5c9b2 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -3525,6 +3525,7 @@ CastInst *CastInst::CreateFPCast(Value *C, Type *Ty, "Invalid cast"); unsigned SrcBits = C->getType()->getScalarSizeInBits(); unsigned DstBits = Ty->getScalarSizeInBits(); + assert((C->getType() == Ty || SrcBits != DstBits) && "Invalid cast"); Instruction::CastOps opcode = (SrcBits == DstBits ? Instruction::BitCast : (SrcBits > DstBits ? Instruction::FPTrunc : Instruction::FPExt)); |