i386: Handle memory operand for direct call to cvtps2pd in unpack
Commit Message
Hi all,
This patch aim to fix the ICE for vec unpack using for memory after the commit
r13-1418 on inproper insn of cvtps2pd.
Regtested on x86_64-pc-linux-gnu. Ok for trunk?
BRs,
Haochen
gcc/ChangeLog:
PR target/106180
* config/i386/sse.md (sse2_cvtps2pd<mask_name>_1):
Rename from *sse2_cvtps2pd<mask_name>_1.
(vec_unpacks_lo_v4sf): Add handler for memory operand.
gcc/testsuite/ChangeLog:
PR target/106180
* g++.target/i386/pr106180-1.C: New test.
---
gcc/config/i386/sse.md | 12 +++++++--
gcc/testsuite/g++.target/i386/pr106180-1.C | 31 ++++++++++++++++++++++
2 files changed, 41 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/g++.target/i386/pr106180-1.C
Comments
On Thu, Jul 7, 2022 at 7:52 AM Haochen Jiang <haochen.jiang@intel.com> wrote:
>
> Hi all,
>
> This patch aim to fix the ICE for vec unpack using for memory after the commit
> r13-1418 on inproper insn of cvtps2pd.
>
> Regtested on x86_64-pc-linux-gnu. Ok for trunk?
>
> BRs,
> Haochen
>
> gcc/ChangeLog:
>
> PR target/106180
> * config/i386/sse.md (sse2_cvtps2pd<mask_name>_1):
> Rename from *sse2_cvtps2pd<mask_name>_1.
> (vec_unpacks_lo_v4sf): Add handler for memory operand.
>
> gcc/testsuite/ChangeLog:
>
> PR target/106180
> * g++.target/i386/pr106180-1.C: New test.
LGTM.
Thanks,
Uros.
> ---
> gcc/config/i386/sse.md | 12 +++++++--
> gcc/testsuite/g++.target/i386/pr106180-1.C | 31 ++++++++++++++++++++++
> 2 files changed, 41 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/g++.target/i386/pr106180-1.C
>
> diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
> index 3396ff748da..5b91c7be54e 100644
> --- a/gcc/config/i386/sse.md
> +++ b/gcc/config/i386/sse.md
> @@ -9208,7 +9208,7 @@
> (set_attr "prefix" "maybe_vex")
> (set_attr "mode" "V2DF")])
>
> -(define_insn "*sse2_cvtps2pd<mask_name>_1"
> +(define_insn "sse2_cvtps2pd<mask_name>_1"
> [(set (match_operand:V2DF 0 "register_operand" "=v")
> (float_extend:V2DF
> (match_operand:V2SF 1 "memory_operand" "m")))]
> @@ -9270,7 +9270,15 @@
> (vec_select:V2SF
> (match_operand:V4SF 1 "vector_operand")
> (parallel [(const_int 0) (const_int 1)]))))]
> - "TARGET_SSE2")
> + "TARGET_SSE2"
> +{
> + if (MEM_P (operands[1]))
> + {
> + operands[1] = adjust_address_nv (operands[1], V2SFmode, 0);
> + emit_insn (gen_sse2_cvtps2pd_1 (operands[0], operands[1]));
> + DONE;
> + }
> +})
>
> (define_expand "vec_unpacks_lo_v8sf"
> [(set (match_operand:V4DF 0 "register_operand")
> diff --git a/gcc/testsuite/g++.target/i386/pr106180-1.C b/gcc/testsuite/g++.target/i386/pr106180-1.C
> new file mode 100644
> index 00000000000..7f734536001
> --- /dev/null
> +++ b/gcc/testsuite/g++.target/i386/pr106180-1.C
> @@ -0,0 +1,31 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -c -ffloat-store -std=c++11" } */
> +
> +struct PointT
> +{
> + double x, y;
> +};
> +using PointF = PointT;
> +
> +template <int _Nm> struct __array_traits { typedef PointT _Type[_Nm]; };
> +template <int _Nm> struct array
> +{
> + typename __array_traits<_Nm>::_Type _M_elems;
> +};
> +
> +float SampleGrid_low, SampleGrid_high;
> +using QuadrilateralF = array<4>;
> +struct PerspectiveTransform
> +{
> + PerspectiveTransform (QuadrilateralF, QuadrilateralF);
> +};
> +
> +void SampleGrid()
> +{
> + PerspectiveTransform
> + {
> + { PointF {SampleGrid_high, SampleGrid_low},
> + SampleGrid_low, SampleGrid_high },
> + {}
> + };
> +}
> --
> 2.18.2
>
@@ -9208,7 +9208,7 @@
(set_attr "prefix" "maybe_vex")
(set_attr "mode" "V2DF")])
-(define_insn "*sse2_cvtps2pd<mask_name>_1"
+(define_insn "sse2_cvtps2pd<mask_name>_1"
[(set (match_operand:V2DF 0 "register_operand" "=v")
(float_extend:V2DF
(match_operand:V2SF 1 "memory_operand" "m")))]
@@ -9270,7 +9270,15 @@
(vec_select:V2SF
(match_operand:V4SF 1 "vector_operand")
(parallel [(const_int 0) (const_int 1)]))))]
- "TARGET_SSE2")
+ "TARGET_SSE2"
+{
+ if (MEM_P (operands[1]))
+ {
+ operands[1] = adjust_address_nv (operands[1], V2SFmode, 0);
+ emit_insn (gen_sse2_cvtps2pd_1 (operands[0], operands[1]));
+ DONE;
+ }
+})
(define_expand "vec_unpacks_lo_v8sf"
[(set (match_operand:V4DF 0 "register_operand")
new file mode 100644
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -c -ffloat-store -std=c++11" } */
+
+struct PointT
+{
+ double x, y;
+};
+using PointF = PointT;
+
+template <int _Nm> struct __array_traits { typedef PointT _Type[_Nm]; };
+template <int _Nm> struct array
+{
+ typename __array_traits<_Nm>::_Type _M_elems;
+};
+
+float SampleGrid_low, SampleGrid_high;
+using QuadrilateralF = array<4>;
+struct PerspectiveTransform
+{
+ PerspectiveTransform (QuadrilateralF, QuadrilateralF);
+};
+
+void SampleGrid()
+{
+ PerspectiveTransform
+ {
+ { PointF {SampleGrid_high, SampleGrid_low},
+ SampleGrid_low, SampleGrid_high },
+ {}
+ };
+}