[InstCombine] Only fold trunc(ext) pairs to bitcast if the source and destination...
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 13 Jun 2022 12:31:43 +0000 (14:31 +0200)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 13 Jun 2022 12:34:18 +0000 (14:34 +0200)
This used to be always the case, but the addition of bfloat to the type
matrix makes this invalid.

llvm/lib/IR/Instructions.cpp
llvm/test/Transforms/InstCombine/fpextend.ll

index 7615a4d..1b546ce 100644 (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
index 13784c6..c991f5d 100644 (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
+}