https://gcc.gnu.org/g:b0e5c22df97d4405fc1c3da33e55331407d57e2a

commit b0e5c22df97d4405fc1c3da33e55331407d57e2a
Author: Michael Meissner <[email protected]>
Date:   Tue Oct 14 02:32:07 2025 -0400

    Fix -Ofast issue with BF optimization.
    
    2025-10-13  Michael Meissner  <[email protected]>
    
    gcc/
    
            * config/rs6000/predicates.md (bfloat16_v4sf_operand): Add checks to
            make sure float_extend and float_truncate have a register as an
            argument.

Diff:
---
 gcc/config/rs6000/predicates.md | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 83f5f1fe3ea5..4394b4a6daa1 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -2225,15 +2225,21 @@
   if (CONST_DOUBLE_P (op))
     return true;
 
-  if (GET_CODE (op) == FLOAT_EXTEND
-      && mode == SFmode
-      && GET_MODE (XEXP (op, 0)) == BFmode)
-    return true;
+  if (GET_CODE (op) == FLOAT_EXTEND)
+    {
+      rtx op_arg = XEXP (op, 0);
+      return (mode == SFmode
+             && GET_MODE (op_arg) == BFmode
+             && (REG_P (op_arg) || SUBREG_P (op_arg)));
+    }
 
-  if (GET_CODE (op) == FLOAT_TRUNCATE
-      && mode == BFmode
-      && GET_MODE (XEXP (op, 0)) == SFmode)
-    return true;
+  if (GET_CODE (op) == FLOAT_TRUNCATE)
+    {
+      rtx op_arg = XEXP (op, 0);
+      return (mode == BFmode
+             && GET_MODE (op_arg) == SFmode
+             && (REG_P (op_arg) || SUBREG_P (op_arg)));
+    }
 
   return false;
 })

Reply via email to