diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 0d46c7868d87..eafa95ce7fcf 100644 --- a/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/contrib/llvm-project/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -546,6 +546,7 @@ namespace {      SDValue visitFP_TO_FP16(SDNode *N);      SDValue visitFP16_TO_FP(SDNode *N);      SDValue visitFP_TO_BF16(SDNode *N); +    SDValue visitBF16_TO_FP(SDNode *N);      SDValue visitVECREDUCE(SDNode *N);      SDValue visitVPOp(SDNode *N);      SDValue visitGET_FPENV_MEM(SDNode *N); @@ -2047,6 +2048,7 @@ SDValue DAGCombiner::visit(SDNode *N) {    case ISD::FP_TO_FP16:         return visitFP_TO_FP16(N);    case ISD::FP16_TO_FP:         return visitFP16_TO_FP(N);    case ISD::FP_TO_BF16:         return visitFP_TO_BF16(N); +  case ISD::BF16_TO_FP:         return visitBF16_TO_FP(N);    case ISD::FREEZE:             return visitFREEZE(N);    case ISD::GET_FPENV_MEM:      return visitGET_FPENV_MEM(N);    case ISD::SET_FPENV_MEM:      return visitSET_FPENV_MEM(N); @@ -26256,14 +26258,17 @@ SDValue DAGCombiner::visitFP_TO_FP16(SDNode *N) {  }  SDValue DAGCombiner::visitFP16_TO_FP(SDNode *N) { +  auto Op = N->getOpcode(); +  assert((Op == ISD::FP16_TO_FP || Op == ISD::BF16_TO_FP) && +         "opcode should be FP16_TO_FP or BF16_TO_FP.");    SDValue N0 = N->getOperand(0); -  // fold fp16_to_fp(op & 0xffff) -> fp16_to_fp(op) +  // fold fp16_to_fp(op & 0xffff) -> fp16_to_fp(op) or +  // fold bf16_to_fp(op & 0xffff) -> bf16_to_fp(op)    if (!TLI.shouldKeepZExtForFP16Conv() && N0->getOpcode() == ISD::AND) {      ConstantSDNode *AndConst = getAsNonOpaqueConstant(N0.getOperand(1));      if (AndConst && AndConst->getAPIntValue() == 0xffff) { -      return DAG.getNode(ISD::FP16_TO_FP, SDLoc(N), N->getValueType(0), -                         N0.getOperand(0)); +      return DAG.getNode(Op, SDLoc(N), N->getValueType(0), N0.getOperand(0));      }    } @@ -26280,6 +26285,11 @@ SDValue DAGCombiner::visitFP_TO_BF16(SDNode *N) {    return SDValue();  } +SDValue DAGCombiner::visitBF16_TO_FP(SDNode *N) { +  // fold bf16_to_fp(op & 0xffff) -> bf16_to_fp(op) +  return visitFP16_TO_FP(N); +} +  SDValue DAGCombiner::visitVECREDUCE(SDNode *N) {    SDValue N0 = N->getOperand(0);    EVT VT = N0.getValueType();  | 
