public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Kito Cheng <kito.cheng@gmail.com>
To: juzhe.zhong@rivai.ai
Cc: gcc-patches@gcc.gnu.org, kito-cheng <kito.cheng@sifive.com>
Subject: Re: [PATCH] RISC-V: Fix bugs of ternary integer and floating-point ternary intrinsics.
Date: Tue, 14 Mar 2023 10:37:36 +0800	[thread overview]
Message-ID: <CA+yXCZB5cwKHEYxEoXPn1d_St2RnCBpwV6FCPB5=CX5PmHP_FQ@mail.gmail.com> (raw)
In-Reply-To: <20230314022331.105558-1-juzhe.zhong@rivai.ai>

IIRC the canonical form of (plus (op)  (mult (op) (op))) is (plus
(mult (op) (op) (op)), so using the first form might not friendly for
the combine pass.

On Tue, Mar 14, 2023 at 10:24 AM <juzhe.zhong@rivai.ai> wrote:
>
> From: Ju-Zhe Zhong <juzhe.zhong@rivai.ai>
>
> Co-authored-by: kito-cheng <kito.cheng@sifive.com>
> Co-authored-by: kito-cheng <kito.cheng@gmail.com>
>
> This patch is fixing the bugs reported by @kito.
>
>   // vnmsub.vx vd, rs1, vs2, vm    # vd[i] = -(x[rs1] * vd[i]) + vs2[i]
>   // vd = -(vb * a) + vc
>   //    = -(3 * 1) + 10
>   //    = 7
>   // GCC wrongly optmize this pattern to `3 - 10` due to we write wrong RTL
>   // pattern.
>   // vd = (3 * 1) - 10
>   //    = 3 - 10
>   //    = -7
>   // NOTE: GCC optimized (vb * a) - vc to vb - vc
>
> Signed-off-by: Ju-Zhe Zhong <juzhe.zhong@rivai.ai>
> Co-authored-by: kito-cheng <kito.cheng@sifive.com>
> Co-authored-by: kito-cheng <kito.cheng@gmail.com>
>
> gcc/ChangeLog:
>
>         * config/riscv/vector.md: Correct ternary patterns.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.target/riscv/rvv/base/bug-3.c: New test.
>         * gcc.target/riscv/rvv/base/bug-4.c: New test.
>         * gcc.target/riscv/rvv/base/bug-5.c: New test.
>
> ---
>  gcc/config/riscv/vector.md                    | 80 +++++++++----------
>  .../gcc.target/riscv/rvv/base/bug-3.c         | 22 +++++
>  .../gcc.target/riscv/rvv/base/bug-4.c         | 22 +++++
>  .../gcc.target/riscv/rvv/base/bug-5.c         | 22 +++++
>  4 files changed, 106 insertions(+), 40 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/bug-3.c
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/bug-4.c
>  create mode 100644 gcc/testsuite/gcc.target/riscv/rvv/base/bug-5.c
>
> diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
> index 5f765cdbacb..27c5cccb451 100644
> --- a/gcc/config/riscv/vector.md
> +++ b/gcc/config/riscv/vector.md
> @@ -4160,10 +4160,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "register_operand")
>             (mult:VI
>               (match_operand:VI 2 "register_operand")
> -             (match_operand:VI 3 "register_operand"))
> -           (match_operand:VI 4 "register_operand"))
> +             (match_operand:VI 3 "register_operand")))
>           (match_operand:VI 5 "register_operand")))]
>    "TARGET_VECTOR"
>  {
> @@ -4185,10 +4185,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "register_operand"       " vr, vr,   vr")
>             (mult:VI
>               (match_operand:VI 2 "register_operand"     "  0,  0,   vr")
> -             (match_operand:VI 3 "register_operand"     " vr, vr,   vr"))
> -           (match_operand:VI 4 "register_operand"       " vr, vr,   vr"))
> +             (match_operand:VI 3 "register_operand"     " vr, vr,   vr")))
>           (match_dup 2)))]
>    "TARGET_VECTOR"
>    "@
> @@ -4215,10 +4215,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "register_operand"       "  0,  0,   vr")
>             (mult:VI
>               (match_operand:VI 2 "register_operand"     " vr, vr,   vr")
> -             (match_operand:VI 3 "register_operand"     " vr, vr,   vr"))
> -           (match_operand:VI 4 "register_operand"       "  0,  0,   vr"))
> +             (match_operand:VI 3 "register_operand"     " vr, vr,   vr")))
>           (match_dup 4)))]
>    "TARGET_VECTOR"
>    "@
> @@ -4245,10 +4245,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "vector_arith_operand"   "   vr,   vi,   vr,   vr,   vr")
>             (mult:VI
>               (match_operand:VI 2 "register_operand"     "   vr,   vr,   vi,   vr,   vr")
> -             (match_operand:VI 3 "register_operand"     "   vr,   vr,   vr,   vi,   vr"))
> -           (match_operand:VI 4 "vector_arith_operand"   "   vr,   vi,   vr,   vr,   vr"))
> +             (match_operand:VI 3 "register_operand"     "   vr,   vr,   vr,   vi,   vr")))
>           (match_operand:VI 5 "register_operand"         "    0,   vr,   vr,   vr,   vr")))]
>    "TARGET_VECTOR
>     && !rtx_equal_p (operands[2], operands[5])
> @@ -4296,11 +4296,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI_QHS
> +           (match_operand:VI_QHS 4 "register_operand")
>             (mult:VI_QHS
>               (vec_duplicate:VI_QHS
>                 (match_operand:<VEL> 2 "reg_or_int_operand"))
> -             (match_operand:VI_QHS 3 "register_operand"))
> -           (match_operand:VI_QHS 4 "register_operand"))
> +             (match_operand:VI_QHS 3 "register_operand")))
>           (match_operand:VI_QHS 5 "register_operand")))]
>    "TARGET_VECTOR"
>  {
> @@ -4319,11 +4319,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "register_operand"        " vr, vr,   vr")
>             (mult:VI
>               (vec_duplicate:VI
>                 (match_operand:<VEL> 2 "register_operand" "  r,  r,   vr"))
> -             (match_operand:VI 3 "register_operand"      "  0,  0,   vr"))
> -           (match_operand:VI 4 "register_operand"        " vr, vr,   vr"))
> +             (match_operand:VI 3 "register_operand"      "  0,  0,   vr")))
>           (match_dup 3)))]
>    "TARGET_VECTOR"
>    "@
> @@ -4350,11 +4350,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "register_operand"        "  0,  0,   vr")
>             (mult:VI
>               (vec_duplicate:VI
>                 (match_operand:<VEL> 2 "register_operand" "  r,  r,   vr"))
> -             (match_operand:VI 3 "register_operand"      " vr, vr,   vr"))
> -           (match_operand:VI 4 "register_operand"        "  0,  0,   vr"))
> +             (match_operand:VI 3 "register_operand"      " vr, vr,   vr")))
>           (match_dup 4)))]
>    "TARGET_VECTOR"
>    "@
> @@ -4381,11 +4381,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI
> +           (match_operand:VI 4 "vector_arith_operand"    "   vr,   vi,   vr,   vr")
>             (mult:VI
>               (vec_duplicate:VI
>                 (match_operand:<VEL> 2 "register_operand" "    r,    r,    r,    r"))
> -             (match_operand:VI 3 "register_operand"      "   vr,   vr,   vi,   vr"))
> -           (match_operand:VI 4 "vector_arith_operand"    "   vr,   vi,   vr,   vr"))
> +             (match_operand:VI 3 "register_operand"      "   vr,   vr,   vi,   vr")))
>           (match_operand:VI 5 "register_operand"          "    0,   vr,   vr,   vr")))]
>    "TARGET_VECTOR
>     && !rtx_equal_p (operands[3], operands[5])
> @@ -4428,11 +4428,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI_D
> +           (match_operand:VI_D 4 "register_operand")
>             (mult:VI_D
>               (vec_duplicate:VI_D
>                 (match_operand:<VEL> 2 "reg_or_int_operand"))
> -             (match_operand:VI_D 3 "register_operand"))
> -           (match_operand:VI_D 4 "register_operand"))
> +             (match_operand:VI_D 3 "register_operand")))
>           (match_operand:VI_D 5 "register_operand")))]
>    "TARGET_VECTOR"
>  {
> @@ -4463,12 +4463,12 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI_D
> +           (match_operand:VI_D 4 "register_operand"           " vr, vr,   vr")
>             (mult:VI_D
>               (vec_duplicate:VI_D
>                 (sign_extend:<VEL>
>                   (match_operand:<VSUBEL> 2 "register_operand" "  r,  r,   vr")))
> -             (match_operand:VI_D 3 "register_operand"         "  0,  0,   vr"))
> -           (match_operand:VI_D 4 "register_operand"           " vr, vr,   vr"))
> +             (match_operand:VI_D 3 "register_operand"         "  0,  0,   vr")))
>           (match_dup 3)))]
>    "TARGET_VECTOR"
>    "@
> @@ -4495,12 +4495,12 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI_D
> +           (match_operand:VI_D 4 "register_operand"           "  0,  0,   vr")
>             (mult:VI_D
>               (vec_duplicate:VI_D
>                 (sign_extend:<VEL>
>                   (match_operand:<VSUBEL> 2 "register_operand" "  r,  r,   vr")))
> -             (match_operand:VI_D 3 "register_operand"         " vr, vr,   vr"))
> -           (match_operand:VI_D 4 "register_operand"           "  0,  0,   vr"))
> +             (match_operand:VI_D 3 "register_operand"         " vr, vr,   vr")))
>           (match_dup 4)))]
>    "TARGET_VECTOR"
>    "@
> @@ -4527,12 +4527,12 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VI_D
> +           (match_operand:VI_D 4 "vector_arith_operand"       "   vr,   vr,   vr,   vr")
>             (mult:VI_D
>               (vec_duplicate:VI_D
>                 (sign_extend:<VEL>
>                   (match_operand:<VSUBEL> 2 "register_operand" "    r,    r,    r,    r")))
> -             (match_operand:VI_D 3 "register_operand"         "   vr,   vr,   vr,   vr"))
> -           (match_operand:VI_D 4 "vector_arith_operand"       "   vr,   vr,   vr,   vr"))
> +             (match_operand:VI_D 3 "register_operand"         "   vr,   vr,   vr,   vr")))
>           (match_operand:VI_D 5 "register_operand"             "    0,   vr,   vr,   vr")))]
>    "TARGET_VECTOR
>     && !rtx_equal_p (operands[3], operands[5])
> @@ -5033,10 +5033,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "register_operand")
>             (mult:VF
>               (match_operand:VF 2 "register_operand")
> -             (match_operand:VF 3 "register_operand"))
> -           (match_operand:VF 4 "register_operand"))
> +             (match_operand:VF 3 "register_operand")))
>           (match_operand:VF 5 "register_operand")))]
>    "TARGET_VECTOR"
>  {
> @@ -5058,10 +5058,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "register_operand"       " vr, vr,   vr")
>             (mult:VF
>               (match_operand:VF 2 "register_operand"     "  0,  0,   vr")
> -             (match_operand:VF 3 "register_operand"     " vr, vr,   vr"))
> -           (match_operand:VF 4 "register_operand"       " vr, vr,   vr"))
> +             (match_operand:VF 3 "register_operand"     " vr, vr,   vr")))
>           (match_dup 2)))]
>    "TARGET_VECTOR"
>    "@
> @@ -5088,10 +5088,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "register_operand"       "  0,  0,   vr")
>             (mult:VF
>               (match_operand:VF 2 "register_operand"     " vr, vr,   vr")
> -             (match_operand:VF 3 "register_operand"     " vr, vr,   vr"))
> -           (match_operand:VF 4 "register_operand"       "  0,  0,   vr"))
> +             (match_operand:VF 3 "register_operand"     " vr, vr,   vr")))
>           (match_dup 4)))]
>    "TARGET_VECTOR"
>    "@
> @@ -5118,10 +5118,10 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "vector_arith_operand"   "   vr,   vr")
>             (mult:VF
>               (match_operand:VF 2 "register_operand"     "   vr,   vr")
> -             (match_operand:VF 3 "register_operand"     "   vr,   vr"))
> -           (match_operand:VF 4 "vector_arith_operand"   "   vr,   vr"))
> +             (match_operand:VF 3 "register_operand"     "   vr,   vr")))
>           (match_operand:VF 5 "register_operand"         "    0,   vr")))]
>    "TARGET_VECTOR
>     && !rtx_equal_p (operands[2], operands[5])
> @@ -5153,11 +5153,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "register_operand")
>             (mult:VF
>               (vec_duplicate:VF
>                 (match_operand:<VEL> 2 "register_operand"))
> -             (match_operand:VF 3 "register_operand"))
> -           (match_operand:VF 4 "register_operand"))
> +             (match_operand:VF 3 "register_operand")))
>           (match_operand:VF 5 "register_operand")))]
>    "TARGET_VECTOR"
>  {})
> @@ -5174,11 +5174,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "register_operand"        " vr, vr,   vr")
>             (mult:VF
>               (vec_duplicate:VF
>                 (match_operand:<VEL> 2 "register_operand" "  f,  f,   vr"))
> -             (match_operand:VF 3 "register_operand"      "  0,  0,   vr"))
> -           (match_operand:VF 4 "register_operand"        " vr, vr,   vr"))
> +             (match_operand:VF 3 "register_operand"      "  0,  0,   vr")))
>           (match_dup 3)))]
>    "TARGET_VECTOR"
>    "@
> @@ -5205,11 +5205,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "register_operand"        "  0,  0,   vr")
>             (mult:VF
>               (vec_duplicate:VF
>                 (match_operand:<VEL> 2 "register_operand" "  f,  f,   vr"))
> -             (match_operand:VF 3 "register_operand"      " vr, vr,   vr"))
> -           (match_operand:VF 4 "register_operand"        "  0,  0,   vr"))
> +             (match_operand:VF 3 "register_operand"      " vr, vr,   vr")))
>           (match_dup 4)))]
>    "TARGET_VECTOR"
>    "@
> @@ -5236,11 +5236,11 @@
>              (reg:SI VL_REGNUM)
>              (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
>           (plus_minus:VF
> +           (match_operand:VF 4 "vector_arith_operand"    "   vr,  vr")
>             (mult:VF
>               (vec_duplicate:VF
>                 (match_operand:<VEL> 2 "register_operand" "    f,   f"))
> -             (match_operand:VF 3 "register_operand"      "   vr,  vr"))
> -           (match_operand:VF 4 "vector_arith_operand"    "   vr,  vr"))
> +             (match_operand:VF 3 "register_operand"      "   vr,  vr")))
>           (match_operand:VF 5 "register_operand"          "    0,  vr")))]
>    "TARGET_VECTOR
>     && !rtx_equal_p (operands[3], operands[5])
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/bug-3.c b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-3.c
> new file mode 100644
> index 00000000000..35b76892598
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-3.c
> @@ -0,0 +1,22 @@
> +/* { dg-do run } */
> +/* { dg-options "-O2" } */
> +
> +#include "riscv_vector.h"
> +#include <stdio.h>
> +
> +int main()
> +{
> +  int32_t a = 1;
> +  int32_t b[1] = {3};
> +  int32_t c[1] = {10};
> +  int32_t d[1] = {0};
> +  vint32m1_t vb = __riscv_vle32_v_i32m1 (b, 1);
> +  vint32m1_t vc = __riscv_vle32_v_i32m1 (c, 1);
> +  vint32m1_t vd = __riscv_vnmsub_vx_i32m1 (vb, a, vc, 1);
> +  __riscv_vse32_v_i32m1 (d, vd, 1);
> +  if (d[0] != 7){
> +      printf("d[0] should be 7, but got %d\n", d[0]);
> +      __builtin_abort ();
> +  }
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/bug-4.c b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-4.c
> new file mode 100644
> index 00000000000..62dd3f50e44
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-4.c
> @@ -0,0 +1,22 @@
> +/* { dg-do run } */
> +/* { dg-options "-O2" } */
> +
> +#include "riscv_vector.h"
> +#include <stdio.h>
> +
> +int main()
> +{
> +  float a = 1.0;
> +  float b[1] = {3.0};
> +  float c[1] = {10.0};
> +  float d[1] = {0.0};
> +  vfloat32m1_t vb = __riscv_vle32_v_f32m1 (b, 1);
> +  vfloat32m1_t vc = __riscv_vle32_v_f32m1 (c, 1);
> +  vfloat32m1_t vd = __riscv_vfnmsub_vf_f32m1 (vb, a, vc, 1);
> +  __riscv_vse32_v_f32m1 (d, vd, 1);
> +  if (d[0] != 7.0){
> +      printf("d[0] should be 7.0, but got %f\n", d[0]);
> +      __builtin_abort ();
> +  }
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/bug-5.c b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-5.c
> new file mode 100644
> index 00000000000..e43f85a0730
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/rvv/base/bug-5.c
> @@ -0,0 +1,22 @@
> +/* { dg-do run } */
> +/* { dg-options "-O2" } */
> +
> +#include "riscv_vector.h"
> +#include <stdio.h>
> +
> +int main()
> +{
> +  float a = 1.0;
> +  float b[1] = {3.0};
> +  float c[1] = {10.0};
> +  float d[1] = {0.0};
> +  vfloat32m1_t vb = __riscv_vle32_v_f32m1 (b, 1);
> +  vfloat32m1_t vc = __riscv_vle32_v_f32m1 (c, 1);
> +  vfloat32m1_t vd = __riscv_vfmsub_vf_f32m1 (vb, a, vc, 1);
> +  __riscv_vse32_v_f32m1 (d, vd, 1);
> +  if (d[0] != -7.0){
> +      printf("d[0] should be -7.0, but got %f\n", d[0]);
> +      __builtin_abort ();
> +  }
> +  return 0;
> +}
> --
> 2.36.3
>

  reply	other threads:[~2023-03-14  2:37 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-14  2:23 juzhe.zhong
2023-03-14  2:37 ` Kito Cheng [this message]
2023-03-14 14:50   ` Jeff Law
2023-03-15  5:23 juzhe.zhong
2023-03-15  6:37 juzhe.zhong
2023-03-19 17:03 ` Jeff Law

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CA+yXCZB5cwKHEYxEoXPn1d_St2RnCBpwV6FCPB5=CX5PmHP_FQ@mail.gmail.com' \
    --to=kito.cheng@gmail.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=juzhe.zhong@rivai.ai \
    --cc=kito.cheng@sifive.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).