https://gcc.gnu.org/g:4e59ff07329e7cd82d03669e7b3a5e4172fd5c4e

commit 4e59ff07329e7cd82d03669e7b3a5e4172fd5c4e
Author: Michael Meissner <[email protected]>
Date:   Fri Oct 24 17:38:48 2025 -0400

    Add -mno-bfloat16-combine option.
    
    2025-10-23  Michael Meissner  <[email protected]>
    
    gcc/
    
            * config/rs6000/float16.md (bfloat16_binary_op_internal1): Add
            -mbfloat16-combine option.
            (bfloat16_binary_op_internal2): Likewise.
            (bfloat16_fma_op_internal1): Likewise.
            (bfloat16_fma_op_internal2): Likewise.
            (bfloat16_fms_op_internal1): Likewise.
            (bfloat16_fms_op_internal2): Likewise.
            (bfloat16_nfma_op_internal1): Likewise.
            (bfloat16_nfma_op_internal2): Likewise.
            (bfloat16_nfms_op_internal1): Likewise.
            (bfloat16_nfms_op_internal2): Likewise.
            * config/rs6000/rs6000.opt (-mbfloat16-combine): New option.

Diff:
---
 gcc/config/rs6000/float16.md | 24 ++++++++++++------------
 gcc/config/rs6000/rs6000.opt |  4 ++++
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/gcc/config/rs6000/float16.md b/gcc/config/rs6000/float16.md
index cc7a00c6a0d1..d719c0dec8af 100644
--- a/gcc/config/rs6000/float16.md
+++ b/gcc/config/rs6000/float16.md
@@ -636,7 +636,7 @@
        (match_operator:SF 1 "fp16_binary_operator"
                           [(match_operand:SF 2 "bfloat16_v4sf_operand")
                            (match_operand:SF 3 "bfloat16_v4sf_operand")]))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[2], SFmode)
        || bfloat16_bf_operand (operands[3], SFmode))"
   "#"
@@ -654,7 +654,7 @@
         (match_operator:SF 1 "fp16_binary_operator"
                            [(match_operand:SF 2 "bfloat16_v4sf_operand")
                             (match_operand:SF 3 "bfloat16_v4sf_operand")])))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[2], SFmode)
        || bfloat16_bf_operand (operands[3], SFmode))"
   "#"
@@ -672,7 +672,7 @@
         (match_operand:SF 1 "bfloat16_v4sf_operand")
         (match_operand:SF 2 "bfloat16_v4sf_operand")
         (match_operand:SF 3 "bfloat16_v4sf_operand")))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -692,7 +692,7 @@
          (match_operand:SF 1 "bfloat16_v4sf_operand")
          (match_operand:SF 2 "bfloat16_v4sf_operand")
          (match_operand:SF 3 "bfloat16_v4sf_operand"))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -712,7 +712,7 @@
         (match_operand:SF 2 "bfloat16_v4sf_operand")
         (neg:SF
          (match_operand:SF 3 "bfloat16_v4sf_operand"))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -733,7 +733,7 @@
          (match_operand:SF 2 "bfloat16_v4sf_operand")
          (neg:SF
           (match_operand:SF 3 "bfloat16_v4sf_operand")))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -753,7 +753,7 @@
          (match_operand:SF 1 "bfloat16_v4sf_operand")
          (match_operand:SF 2 "bfloat16_v4sf_operand")
          (match_operand:SF 3 "bfloat16_v4sf_operand"))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -774,7 +774,7 @@
           (match_operand:SF 1 "bfloat16_v4sf_operand")
           (match_operand:SF 2 "bfloat16_v4sf_operand")
           (match_operand:SF 3 "bfloat16_v4sf_operand")))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -795,7 +795,7 @@
           (match_operand:SF 1 "bfloat16_v4sf_operand")
           (match_operand:SF 2 "bfloat16_v4sf_operand")
           (match_operand:SF 3 "bfloat16_v4sf_operand")))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -816,7 +816,7 @@
          (match_operand:SF 2 "bfloat16_v4sf_operand")
          (neg:SF
           (match_operand:SF 3 "bfloat16_v4sf_operand")))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -838,7 +838,7 @@
           (match_operand:SF 2 "bfloat16_v4sf_operand")
           (neg:SF
            (match_operand:SF 3 "bfloat16_v4sf_operand"))))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
@@ -860,7 +860,7 @@
           (match_operand:SF 2 "bfloat16_v4sf_operand")
           (neg:SF
            (match_operand:SF 3 "bfloat16_v4sf_operand"))))))]
-  "TARGET_BFLOAT16_HW && can_create_pseudo_p ()
+  "TARGET_BFLOAT16_HW && TARGET_BFLOAT16_COMBINE && can_create_pseudo_p ()
    && (bfloat16_bf_operand (operands[1], SFmode)
        + bfloat16_bf_operand (operands[2], SFmode)
        + bfloat16_bf_operand (operands[3], SFmode) >= 2)"
diff --git a/gcc/config/rs6000/rs6000.opt b/gcc/config/rs6000/rs6000.opt
index 8198fc07f02f..4849fb35cc54 100644
--- a/gcc/config/rs6000/rs6000.opt
+++ b/gcc/config/rs6000/rs6000.opt
@@ -650,6 +650,10 @@ mbfloat16
 Target Mask(BFLOAT16) Var(rs6000_isa_flags)
 Enable or disable __bfloat16 support.
 
+mbfloat16-combine
+Target Undocumented Var(TARGET_BFLOAT16_COMBINE) Init(1) Save
+Enable or disable __bfloat16 combine optimizations
+
 ; Documented parameters
 
 -param=rs6000-vect-unroll-limit=

Reply via email to