https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106342

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |iii at gcc dot gnu.org,
                   |                            |jakub at gcc dot gnu.org,
                   |                            |krebbel at gcc dot gnu.org

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think the problem is in the
r11-3816-ga1a10a0b8c4e161070f88de3af9d20f9f866a23f
change.  The "copysign<mode>3" expander in config/s390/vector.md uses VFT
iterator, I assume if_then_else form it was using has intructions covering all
those modes, but after the change it attempts to match the "vsel<mode>" pattern
from config/s390/vx-builtins.md, which uses just the V_HW iterator.
VFT is V1DF V2DF without TARGET_VXE and V1SF V2SF V4SF V1DF V2DF V1TF TF with
TARGET_VXE, while V_HW is V16QI V8HI V4SI V2DI V2DF without TARGET_VXE and
V16QI V8HI V4SI V2DI V1TI V2DF V4SF V1TF TF with TARGET_VXE.
So, for V1SF V2SF V1DF modes copysign pattern will expand to something that
will not match an actual pattern.

So, either "copysign<mode>3" expander in config/s390/vector.md should use VF_HW
iterator instead of VFT (and thus not support V1SF, V2SF and V1DF modes), or
because presumably vsel doesn't raise exceptions, it could just use a wider
mode for those cases.

Thus, either:
--- gcc/config/s390/vector.md.jj        2022-01-11 23:11:21.985295845 +0100
+++ gcc/config/s390/vector.md   2022-07-28 17:39:19.968033927 +0200
@@ -1723,12 +1723,12 @@

 ; Vector copysign, implement using vector select
 (define_expand "copysign<mode>3"
-  [(set (match_operand:VFT            0 "register_operand" "")
-       (ior:VFT
-        (and:VFT (match_operand:VFT  2 "register_operand" "")
-                 (match_dup 3))
-        (and:VFT (not:VFT (match_dup 3))
-                 (match_operand:VFT  1 "register_operand" ""))))]
+  [(set (match_operand:VF_HW             0 "register_operand" "")
+       (ior:VF_HW
+        (and:VF_HW (match_operand:VF_HW 2 "register_operand" "")
+                   (match_dup 3))
+        (and:VF_HW (not:VF_HW (match_dup 3))
+                   (match_operand:VF_HW   1 "register_operand" ""))))]
   "TARGET_VX"
 {
   rtx mask = s390_build_signbit_mask (<MODE>mode);
or perhaps something like:
--- gcc/config/s390/vector.md.jj        2022-01-11 23:11:21.985295845 +0100
+++ gcc/config/s390/vector.md   2022-07-28 19:02:06.527108712 +0200
@@ -1721,6 +1721,13 @@
   operands[4] = CONST0_RTX (V2DImode);
 })

+(define_mode_attr hw_vec[(V1SF "V4SF") (V2SF "V4SF") (V4SF "V4SF")
+                        (V1DF "V2DF") (V2DF "V2DF")
+                        (V1TF "V1TF") (TF "TF")])
+(define_mode_attr hw_vec_l[(V1SF "v4sf") (V2SF "v4sf") (V4SF "v4sf")
+                          (V1DF "v2df") (V2DF "v2df")
+                          (V1TF "v1tf") (TF "tf")])
+
 ; Vector copysign, implement using vector select
 (define_expand "copysign<mode>3"
   [(set (match_operand:VFT            0 "register_operand" "")
@@ -1731,6 +1738,20 @@
                  (match_operand:VFT  1 "register_operand" ""))))]
   "TARGET_VX"
 {
+  if (GET_MODE_SIZE (<MODE>mode) < 16)
+    {
+      rtx op0 = gen_reg_rtx (<hw_vec>mode), op1, op2;
+      op1 = simplify_gen_subreg (<hw_vec>mode,
+                                force_reg (<MODE>mode, operands[1]),
+                                <MODE>mode, 0);
+      op2 = simplify_gen_subreg (<hw_vec>mode,
+                                force_reg (<MODE>mode, operands[2]),
+                                <MODE>mode, 0);
+      emit_insn (gen_copysign<hw_vec_l>3 (op0, op1, op2));
+      emit_move_insn (operands[0],
+                     simplify_gen_subreg (<MODE>mode, op0, <hw_vec>mode, 0));
+      DONE;
+    }
   rtx mask = s390_build_signbit_mask (<MODE>mode);
   operands[3] = force_reg (<MODE>mode, mask);
 })

(dunno whether to use simplify_gen_subreg or lowpart_subreg or
simplify_gen_subreg with 8).

Reply via email to