[InstCombine] Only fold trunc(ext) pairs to bitcast if the source and destination types are the same

This used to be always the case, but the addition of bfloat to the type
matrix makes this invalid.
This commit is contained in:
Benjamin Kramer 2022-06-13 14:31:43 +02:00
parent ff6ce9e8fc
commit 5724231af2
2 changed files with 17 additions and 4 deletions

View File

@ -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

View File

@ -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
}