diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index 7615a4dcc49821..1b546ce3a3a047 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -3088,16 +3088,18 @@ unsigned CastInst::isEliminableCastPair( return 0; } case 8: { - // ext, trunc -> bitcast, if the SrcTy and DstTy are same size + // ext, trunc -> bitcast, if the SrcTy and DstTy are the same // ext, trunc -> ext, if sizeof(SrcTy) < sizeof(DstTy) // ext, trunc -> trunc, if sizeof(SrcTy) > sizeof(DstTy) unsigned SrcSize = SrcTy->getScalarSizeInBits(); unsigned DstSize = DstTy->getScalarSizeInBits(); - if (SrcSize == DstSize) + if (SrcTy == DstTy) return Instruction::BitCast; - else if (SrcSize < DstSize) + if (SrcSize < DstSize) return firstOp; - return secondOp; + if (SrcSize > DstSize) + return secondOp; + return 0; } case 9: // zext, sext -> zext, because sext can't sign extend after zext diff --git a/llvm/test/Transforms/InstCombine/fpextend.ll b/llvm/test/Transforms/InstCombine/fpextend.ll index 13784c69c36ba7..c991f5d8c95784 100644 --- a/llvm/test/Transforms/InstCombine/fpextend.ll +++ b/llvm/test/Transforms/InstCombine/fpextend.ll @@ -429,3 +429,14 @@ define double @FtoItoFtoF_f32_su32_f32_f64(float %f) { %r = fpext float %x to double ret double %r } + +define half @bf16_to_f32_to_f16(bfloat %a) nounwind { +; CHECK-LABEL: @bf16_to_f32_to_f16( +; CHECK-NEXT: [[Y:%.*]] = fpext bfloat [[A:%.*]] to float +; CHECK-NEXT: [[Z:%.*]] = fptrunc float [[Y]] to half +; CHECK-NEXT: ret half [[Z]] +; + %y = fpext bfloat %a to float + %z = fptrunc float %y to half + ret half %z +}