aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/IR/Instructions.cpp
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2024-02-22 15:25:17 +0100
committerGitHub <noreply@github.com>2024-02-22 15:25:17 +0100
commitd3f6dd6585f4866a38a794b80db55a62c1050c77 (patch)
tree87503c7f9414663231db4d1966fdda1dfc9a814e /llvm/lib/IR/Instructions.cpp
parent88e31f64a034ec6dead2106016ee5b797674edb0 (diff)
downloadllvm-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.cpp1
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));